允许 CodeBuild 与其他 AWS 服务进行交互 - AWS CodeBuild

允许 CodeBuild 与其他 AWS 服务进行交互

如果您首次按照通过控制台开始使用中的步骤操作来访问 AWS CodeBuild,则很可能不需要本主题中的信息。但随着您继续使用 CodeBuild,您可能想要执行一些操作,例如允许 CodeBuild 与其他 AWS 服务进行交互。

要让 CodeBuild 能够代表您与相关 AWS 服务进行交互,您需要具有 AWS CodeBuild 服务角色。您可以使用 CodeBuild 或 AWS CodePipeline 控制台创建一个 CodeBuild 服务角色。有关信息,请参阅:

如果您不打算使用这些控制台,本节介绍了如何使用 IAM 控制台或 AWS CLI 创建 CodeBuild 服务角色。

重要

CodeBuild 针对代表您执行的所有操作使用服务角色。如果该角色包含用户不应具有的权限,则您可能无意中提升了用户的权限。确保该角色授予最小权限

此页上描述的服务角色包含一项策略,可授予使用 CodeBuild 时所需的最低权限。您可能需要根据使用案例添加额外的权限。

创建 CodeBuild 服务角色(控制台)
  1. 通过 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

    您应该已使用以下任一身份登录到控制台:

    • 您的 AWS 根账户。我们不建议这么做。有关更多信息,请参阅《用户指南》中的 AWS 账户 根用户

    • AWS 账户中的管理员用户。有关更多信息,请参阅《用户指南》中的创建您的第一个 AWS 账户 根用户和组

    • AWS 账户中的用户,具有执行以下最基本操作的权限:

      iam:AddRoleToInstanceProfile iam:AttachRolePolicy iam:CreateInstanceProfile iam:CreatePolicy iam:CreateRole iam:GetRole iam:ListAttachedRolePolicies iam:ListPolicies iam:ListRoles iam:PassRole iam:PutRolePolicy iam:UpdateAssumeRolePolicy

      有关更多信息,请参阅《用户指南》中的 IAM 策略概述

  2. 在导航窗格中,选择策略

  3. 选择创建策略

  4. 创建策略页面上,选择 JSON

  5. 对于 JSON 策略,输入以下内容,然后选择查看策略

    { "Version": "2012-10-17", "Statement": [ { "Sid": "CloudWatchLogsPolicy", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" }, { "Sid": "CodeCommitPolicy", "Effect": "Allow", "Action": [ "codecommit:GitPull" ], "Resource": "*" }, { "Sid": "S3GetObjectPolicy", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "*" }, { "Sid": "S3PutObjectPolicy", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "*" }, { "Sid": "ECRPullPolicy", "Effect": "Allow", "Action": [ "ecr:BatchCheckLayerAvailability", "ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage" ], "Resource": "*" }, { "Sid": "ECRAuthPolicy", "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken" ], "Resource": "*" }, { "Sid": "S3BucketIdentity", "Effect": "Allow", "Action": [ "s3:GetBucketAcl", "s3:GetBucketLocation" ], "Resource": "*" } ] }
    注意

    此策略包含允许访问潜在的大量 AWS 资源的语句。要限制 AWS CodeBuild 访问特定的 AWS 资源,请更改 Resource 数组的值。有关更多信息,请参阅有关 AWS 服务的安全文档。

  6. 查看策略页面上,对于策略名称,为策略输入一个名称(例如,CodeBuildServiceRolePolicy),然后选择创建策略

    注意

    如果您使用其他名称,请确保在本过程中始终使用它。

  7. 在导航窗格中,选择角色

  8. 选择创建角色

  9. 创建角色页面上,在已选择 AWS 服务的情况下,选择 CodeBuild,然后选择下一步:权限

  10. 附加权限策略页面上,选择 CodeBuildServiceRolePolicy,然后选择下一步:审查

  11. 创建角色并审查页面上,对于角色名称,输入角色的名称(例如,CodeBuildServiceRole),然后选择创建角色

创建 CodeBuild 服务角色 (AWS CLI)
  1. 如前面的过程所述,确保您已为 AWS CLI 配置了与某个 IAM 实体相对应的 AWS 访问密钥和 AWS 秘密访问密钥。有关更多信息,请参阅《AWS Command Line Interface 用户指南》中的开始设置 AWS Command Line Interface

  2. 在安装了 AWS CLI 的本地工作站或实例的空目录中,创建分别名为 create-role.jsonput-role-policy.json 的两个文件。如果您选择了其他文件名称,请确保在整个过程中使用它们。

    create-role.json:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "codebuild.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
    注意

    建议您使用 aws:SourceAccountaws:SourceArn 条件键来防止出现混淆代理人问题。例如,您可以使用以下条件块编辑上述信任策略:aws:SourceAccount 是 CodeBuild 项目的所有者,aws:SourceArn 是 CodeBuild 项目 ARN。

    如果您想将服务角色限制为一个 AWS 账户,create-role.json 可能如下所示:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "codebuild.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceAccount": [ "account-ID" ] } } } ] }

    如果您想将服务角色限制为特定 CodeBuild 项目,create-role.json 可能如下所示:

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "codebuild.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "aws:SourceArn": "arn:aws:codebuild:region-ID:account-ID:project/project-name" } } } ] }
    注意

    如果您不知道或尚未决定您的 CodeBuild 项目的名称,并且想要对特定 ARN 模式设置信任策略限制,则可以使用通配符 (*) 替换 ARN 的该部分。创建项目后,您可以更新信任策略。

    put-role-policy.json:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "CloudWatchLogsPolicy", "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "*" }, { "Sid": "CodeCommitPolicy", "Effect": "Allow", "Action": [ "codecommit:GitPull" ], "Resource": "*" }, { "Sid": "S3GetObjectPolicy", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion" ], "Resource": "*" }, { "Sid": "S3PutObjectPolicy", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": "*" }, { "Sid": "S3BucketIdentity", "Effect": "Allow", "Action": [ "s3:GetBucketAcl", "s3:GetBucketLocation" ], "Resource": "*" } ] }
    注意

    此策略包含允许访问潜在的大量 AWS 资源的语句。要限制 AWS CodeBuild 访问特定的 AWS 资源,请更改 Resource 数组的值。有关更多信息,请参阅有关 AWS 服务的安全文档。

  3. 切换到您保存上述文件的目录,然后按照这个顺序运行以下两个命令,一次运行一个。您可以为 CodeBuildServiceRoleCodeBuildServiceRolePolicy 使用不同的值,但请务必在此处使用它们。

    aws iam create-role --role-name CodeBuildServiceRole --assume-role-policy-document file://create-role.json
    aws iam put-role-policy --role-name CodeBuildServiceRole --policy-name CodeBuildServiceRolePolicy --policy-document file://put-role-policy.json