我想使用 AWS CodeBuild 跨 AWS 账户运行 AWS 命令行界面 (AWS CLI) 命令。
解决方法
**注意:**如果您在运行 AWS CLI 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
以下解决方法将账户 A 中的 CodeBuild 项目配置为在账户 B 中运行 AWS CLI 命令。
**先决条件:**在账户 A 中创建构建项目。
在账户 B 中创建 IAM 角色以执行 AWS CLI 命令
完成以下步骤:
- 在账户 B 中,打开 AWS Identity and Access Management (IAM) 控制台。
- 在导航窗格中,选择 Roles(角色),然后选择 Create role(创建角色)。
- 选择 AWS account(AWS 账户)角色类型。
- 在 An AWS account(AWS 账户)部分中,选择 Another AWS account(其他 AWS 账户)。
- 对于 Account ID(账户 ID),输入账户 A 的账户 ID。
- 选择 Next(下一步)。
- 选择具有相应权限的策略,以便在账户 B 中运行 AWS CLI 命令。
- 选择 Next(下一步)。
- 在 Role name(角色名称)字段中,输入角色的名称。
- 选择 Create role(创建角色)。
- 记下 IAM 角色的 Amazon 资源编号 (ARN)。
将 IAM 策略附加到 CodeBuild 服务角色以代入该角色
完成以下步骤:
- 在账户 A 中,打开 CodeBuild 控制台。
- 在导航窗格中,选择 Build projects(构建项目)。
- 选择执行跨账户操作的构建项目。
- 在 CodeBuild 项目中,选择 Project details(项目详细信息)选项卡。
- 在 Environment(环境)部分中,选择 Service role(服务角色)ARN。
- 在新打开的 IAM 控制台窗口中,选择 Add Permissions(添加权限),然后选择 Add inline policy(添加内联策略)。
- 在 JSON选项卡中输入以下策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCrossAccountAccess",
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "ACCOUNT_B_ROLE_ARN"
}
]
}
**注意:**请将 ACCOUNT_B_ROLE_ARN 替换为 IAM 角色的 ARN。
- 选择 Next(下一步)。
- 在 Policy name(策略名称)字段中,为策略输入名称。
- 选择 Create policy(创建策略)。
修改 CodeBuild 项目的 buildspec
如果 buildspec 文件位于 CodeBuild 项目中,则完成以下步骤:
- 打开 CodeBuild 控制台。
- 在导航窗格中,选择 Build projects(构建项目)。
- 选择您的构建项目,然后选择 Edit(编辑)。
- 在 Buildspec 部分中,按以下顺序添加 assume-role AWS CLI 命令和跨账户命令:
- CREDS=$(aws sts assume-role \
--role-arn $ACCOUNT_B_ROLE_ARN \
--role-session-name "session")
- export AWS_ACCESS_KEY_ID=$(echo $CREDS | jq -r '.Credentials.AccessKeyId')
- export AWS_SECRET_ACCESS_KEY=$(echo $CREDS | jq -r '.Credentials.SecretAccessKey')
- export AWS_SESSION_TOKEN=$(echo $CREDS | jq -r '.Credentials.SessionToken')
**注意:**请将 ACCOUNT_B_ROLE_ARN 替换为 IAM 角色的 ARN。如果 buildspec 文件位于您的源代码中,则在 buildspec 文件中的跨账户命令之前添加 assume-role AWS CLI 命令。
- 选择 Update Project(更新项目)。
要在账户 B 中运行 AWS CLI 命令,请在 assume-role 和 export 命令之后运行 CLI 命令。
要恢复到之前的 CodeBuild 服务角色权限,请运行以下 unset 命令:
- unset AWS_ACCESS_KEY_ID
- unset AWS_SECRET_ACCESS_KEY
- unset AWS_SESSION_TOKEN