

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# CodeBuild 允许与其他 AWS 服务进行交互
<a name="setting-up-service-role"></a>

如果您是第一次按照中的步骤[通过控制台开始使用](getting-started-overview.md#getting-started) AWS CodeBuild 进行访问，则很可能不需要本主题中的信息。但是，当你继续使用时 CodeBuild，你可能需要做一些事情，比如 CodeBuild 允许与其他 AWS 服务进行交互。

 CodeBuild 要允许代表您与依赖 AWS 服务进行交互，您需要一个 AWS CodeBuild 服务角色。您可以使用 CodeBuild 或 AWS CodePipeline 控制台创建 CodeBuild 服务角色。有关信息，请参阅：
+ [创建构建项目（控制台）](create-project.md#create-project-console)
+ [创建使用 CodeBuild （CodePipeline 控制台）的管道](how-to-create-pipeline-console.md)
+ [向管道添加 CodeBuild 生成操作（CodePipeline 控制台）](how-to-create-pipeline-add.md)
+ [更改构建项目的设置（控制台）](change-project.md#change-project-console)

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

**重要**  
CodeBuild 将服务角色用于代表您执行的所有操作。如果该角色包含用户不应具有的权限，则您可能无意中提升了用户的权限。确保该角色授予[最低权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege)。  
此页上描述的服务角色包含一项策略，可授予使用 CodeBuild 时所需的最低权限。您可能需要根据使用案例添加额外的权限。<a name="setting-up-service-role-console"></a>

**创建 CodeBuild 服务角色（控制台）**

1. 使用 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

   您应该已使用以下任一身份登录到控制台：
   + 您的 AWS 主账号。我们不建议这么做。有关更多信息，请参阅《用户指南》**中的 [AWS 账户 根用户](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html)。
   + 您 AWS 账户中的管理员用户。有关更多信息，请参阅用户*指南中的创建您的第一个 AWS 账户 root 用户*[和群组](https://docs.aws.amazon.com/IAM/latest/UserGuide/getting-started_create-admin-group.html)。
   + 您 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 策略概述](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html)。

1. 在导航窗格中，选择**策略**。

1. 选择**创建策略**。

1. 在**创建策略**页面上，选择 **JSON**。

1. 对于 JSON 策略，输入以下内容，然后选择**查看策略**：

------
#### [ 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 服务的安全文档。

1. 在**查看策略**页面上，对于**策略名称**，为策略输入一个名称（例如，**CodeBuildServiceRolePolicy**），然后选择**创建策略**。
**注意**  
如果您使用其他名称，请确保在本过程中始终使用它。

1. 在导航窗格中，选择**角色**。

1. 选择**创建角色**。

1. 在 “**创建角色**” 页面上，在已选择 “**AWS 服务**” 的情况下，选择 “**下一**CodeBuild**步”，然后选择 “权限**”。

1. 在 “**附加权限策略**” 页面上，选择 **CodeBuildServiceRolePolicy**，然后选择 “**下一步：查看**”。

1. 在**创建角色并审查**页面上，对于**角色名称**，输入角色的名称（例如，**CodeBuildServiceRole**），然后选择**创建角色**。<a name="setting-up-service-role-cli"></a>

**创建 CodeBuild 服务角色 (AWS CLI)**

1. 如前面的步骤所述，请确保您已 AWS 使用 AWS CLI 与其中一个 IAM 实体相对应的访问 AWS 密钥和私有访问密钥配置了。有关更多信息，请参阅《 AWS Command Line Interface用户指南》中的[开始设置AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-set-up.html)。

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

   `create-role.json`:

------
#### [ JSON ]

****  

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

------
**注意**  
建议您使用 `aws:SourceAccount` 和 `aws:SourceArn` 条件键来防止出现[混淆代理人问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。例如，您可以使用以下条件块编辑上述信任策略：`aws:SourceAccount`是 CodeBuild 项目的所有者，`aws:SourceArn`是 CodeBuild 项目 ARN。

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

------
#### [ JSON ]

****  

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

------

   如果您想将服务角色限制在特定 CodeBuild 项目上，则`create-role.json`可能如下所示：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "codebuild.amazonaws.com"
               },
               "Action": "sts:AssumeRole",
               "Condition": {
                   "StringEquals": {
                       "aws:SourceArn": "arn:aws:codebuild:us-east-1:111122223333:project/MyProject"
                   }
               }
           }
       ]
   }
   ```

------
**注意**  
如果您不知道或尚未决定 CodeBuild 项目的名称，并且想要对特定 ARN 模式进行信任策略限制，则可以将 ARN 的该部分替换为通配符 (\$1)。创建项目后，您可以更新信任策略。

   `put-role-policy.json`:

------
#### [ 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 服务的安全文档。

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

   ```
   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
   ```