跳至内容

如何通过 Amazon ECS 任务访问其他账户中的资源?

3 分钟阅读
0

我希望我的 Amazon Elastic Container Service (Amazon ECS) 任务访问其他 AWS 账户中的资源。

解决方案

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

要为 Amazon ECS 任务设置跨账户访问权限,请使用 AWS Identity and Access Management (IAM) 角色和跨账户角色假设。

此解决方法使用以下配置:

  • 账户 A 是资源所有者账户。
  • 账户 B 是执行 Amazon ECS 任务的账户。

**先决条件:**账户 B 中的 Amazon ECS 任务定义必须具有 IAM 任务角色。创建 IAM 任务角色后,更新 Amazon ECS 任务定义以包括任务角色 ARN。

配置账户 A

完成以下步骤:

  1. 创建 IAM 角色以访问资源,然后为自定义信任策略输入以下信任关系:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::Account_B_ID:role/ECS_Task_Role_Name"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    **注意:**将 Account_B_ID 替换为账户 B 的账户 ID,将 ECS_Task_Role_Name 替换为账户 B 的 Amazon ECS 任务角色的名称。
  2. 将内联策略附加到具有访问资源所需权限的新 IAM 角色。以下示例策略允许 IAM 角色向 Amazon Simple Queue Service (Amazon SQS) 队列发送消息:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "sqs:SendMessage"
                ],
                "Resource": "arn:aws:sqs:region:Account_A_ID:QueueName"
            }
        ]
    }
    **注意:**如果您的任务在 AWS Fargate 上运行,请确保 IAM 角色具有 ECS 执行权限

配置账户 B

将内联策略附加到任务定义中的 Amazon ECS 任务角色,允许该任务代入账户 A 中的 IAM 角色:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "sts:AssumeRole",
            "Resource": "arn:aws:iam::Account_A_ID:role/cross-account-role"
        }
    ]
}

**注意:**请将 Account_A_ID 替换为账户 A 的账户 ID。

确保账户 B 中的任务容器可以访问账户 A 中的资源

完成以下步骤:

  1. 如果您在 Amazon Elastic Compute Cloud (Amazon EC2) 上运行任务,请在任务的容器实例中使用 docker exec 命令。有关详细信息,请参阅 Docker 文档网站上的在正在运行的容器上运行 docker exec。然后,继续执行第 3 步。
    如果您在 Fargate 上运行任务,请为您的独立任务或服务启用 ECS Exec
    **注意:**在以下命令中,将 cluster-name 替换为您的集群名称,将 your-task-definition 替换为账户 B 中的任务定义,将 region-name 替换为您的 AWS 区域。另外,将 FARGATE 替换为您的启动类型。
    对于独立任务,请运行以下 run-task 命令:

    aws ecs run-task --cluster cluster-name --task-definition your-task-definition:revision --enable-execute-command --network-configuration "awsvpcConfiguration={subnets=[subnet-12345678],securityGroups=[sg-12345678]}" --launch-type FARGATE

    对于服务,请运行以下 update-service 命令:

    aws ecs update-service --service service-name --cluster cluster-name --enable-execute-command --region region-name --force-new-deployment
  2. 要使用 ECS Exec 远程连接容器实例,请运行以下 execute-command 命令:

    aws ecs execute-command --cluster cluster-name --task taskID --container container-name --interactive --command "/bin/bash"

    **注意:**将 cluster-name 替换为您的集群名称,将 taskID 替换为您的任务 ID,将 container-name 替换为您的容器名称。

  3. 在容器内部,运行以下命令以在配置文件中创建跨账户配置文件:

    bash-4.2# mkdir /root/.aws
    bash-4.2# cat <<EOF > /root/.aws/config
    [profile cross-account]
    role_arn = arn:aws:iam::Account_A_ID:role/cross-account-role
    credential_source = EcsContainer
    EOF

    **注意:**请将 Account_A_ID 替换为账户 A 的账户 ID。

  4. 要检查容器代入的角色,请运行以下命令:

    bash-4.2# aws sts get-caller-identity

    在输出中,验证该角色是否为账户 B 中的任务角色。
    输出示例:

    {
        "Account": "Account_B_ID",
        "UserId": "AROATCLZDNI7EB3PZGY56:8db9330e660542b7b55595b06fef82cd",
        "Arn": "arn:aws:sts::Account_B_ID:assumed-role/task-role/8db9330e660542b7b55595b06fef82cd"
    }
  5. 要确认容器是否可以代入跨账户角色,请运行以下命令:

    bash-4.2# aws sts get-caller-identity --profile cross-account

    输出示例:

    {
        "Account": "Account_A_ID",
        "UserId": "AROA4T5UFR272UVSKSA2Y:botocore-session-1736260779",
        "Arn": "arn:aws:sts::Account_A_ID:assumed-role/cross-account-role/botocore-session-1736260779"
    }
  6. 检查您是否可以从账户 B 访问账户 A 中的资源。以下示例命令访问 SQS 队列:

    bash-4.2# aws sqs send-message --queue-url https://sqs.region.amazonaws.com/Account_A_ID/QueueName --message-body "Test message from ECS Task in Account B" --profile cross-account

    **注意:**将 region 替换为您的区域,将 Account_A_ID 替换为账户 A 的账户 ID,将 QueueName 替换为您的 SQS 队列的名称。
    输出示例:

    {
        "MD5OfMessageBody": "2b9297ac831d0f8aa655f41e6782898d",
        "MessageId": "4d5baf64-abb0-4f06-af95-d602a45326d2"
    }

    输出确认账户 B 中的 Amazon ECS 任务可以向账户 A 中的 SQS 队列发送消息。

相关信息

如何配置我的 Amazon ECS 任务以代入其他 AWS 账户中的 IAM 角色?

IAM 教程: 使用 IAM 角色委托跨 AWS 账户的访问权限

在 AWS CLI 中使用 IAM 角色

AWS 官方已更新 1 年前