View a markdown version of this page

中的多重访问令牌 CodeBuild - AWS CodeBuild

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

中的多重访问令牌 CodeBuild

CodeBuild 支持从您的机密信息中 AWS Secrets Manager 或通过 AWS CodeConnections 连接向第三方提供商采购访问令牌。您可以将您的密钥或连接设置为与指定的第三方提供商(例如 En GitHub terprise 或 Bitbucket)进行交互的默认凭据。 GitHub

您可以将您的源凭证设置为三个不同级别:

  1. 适合所有项目的账户级别凭证:这些是 AWS 账户中所有项目的默认凭证。如果未指定项目或源级别凭证,则凭证将用于项目。

  2. 特定存储库的源代码级别证书:这是在项目源上定义密钥管理器密钥或 CodeConnections 连接时。这些凭证将仅用于指定源存储库上的操作。这样您就可以在同一个项目中设置具有不同权限范围的多个访问令牌,而不使用默认的账户级别凭证。

  3. 项目级别的备用凭证:您可以使用 NO_SOURCE 作为主源类型来设置项目级别的备用凭证,并在其上定义一个密钥或连接。当您在一个项目中有多个来源但想为其使用相同的凭证时,或者当您不想为项目使用默认账户级别证书时,请使用此选项。

第 1 步:创建凭据管理器密钥或 CodeConnections 连接

使用以下说明创建密钥管理器密钥或 CodeConnections 连接:

第 2 步:向 CodeBuild 项目 IAM 角色授予对密钥管理器密钥的访问权限

注意

在继续操作之前,您必须有权访问在密钥管理器中创建的令牌或 CodeConnections。

要授予 CodeBuild 项目 IAM 角色访问密钥管理器或 CodeConnections,您必须添加以下 IAM 策略。

授予 CodeBuild 项目 IAM 角色访问权限
  1. 按照项目的说明为您的 CodeBuild 项目创建 IAM 角色。CodeBuild 允许与其他人互动 AWS 务 CodeBuild

  2. 请执行以下操作之一:

    • 将以下 IAM 策略添加到您的 CodeBuild 项目角色以授予对您的密钥的访问权限。

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "arn:aws:iam::*:role/Service*" ] } ] }

      (可选)如果您使用 AWS KMS 客户管理的密钥来加密 Secrets Manager 密钥,则可以添加以下策略声明来授予访问权限。

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "arn:aws:iam::*:role/Service*", "Condition": { "StringEquals": { "kms:EncryptionContext:SecretARN": "arn:aws:iam::*:role/Service*" } } } ] }
    • 将以下 IAM 策略添加到您的 CodeBuild 项目角色以授予对连接的访问权限。

      JSON
      { "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codeconnections:GetConnectionToken", "codeconnections:GetConnection" ], "Resource": [ "arn:aws:iam::*:role/Service*" ] } ] }

第 3 步:配置凭据管理器或 CodeConnections 令牌

您可以使用密钥管理器或 CodeConnections 令牌将您的源凭证设置为三个不同的级别。

将 Secrets Manager 或 CodeConnections 令牌配置为账号级证书

您可以将 Secrets Manager 密钥或 CodeConnections 连接配置为账户级凭证,并将其用于项目。

AWS 管理控制台
要将连接配置为账户级凭证,请在 AWS 管理控制台
  1. 对于来源提供商,选择 Bitbucket 或 E GitHub nterprise GitHub

  2. 对于凭证,执行以下操作之一:

    • 选择默认来源凭证,使用您账户的默认来源凭证应用于所有项目。

      1. 如果未连接到源提供商,请选择管理默认来源凭证

      2. 凭证类型中,选择一个凭证类型。

      3. 如果选择 CodeConnections,请选择使用现有连接或创建新连接。

        如果您选择了另一个凭证类型,请在服务中选择要用于存储令牌的服务,然后执行以下操作:

        • 如果您选择使用 Secrets Manager,则可以选择使用现有密钥连接或创建新密钥并选择保存。有关如何创建新密钥的更多信息,请参阅在 Secrets Manager 密钥中创建和存储令牌

        • 如果您选择使用 CodeBuild,请输入您的令牌或用户名和应用程序密码,然后选择保存。要获得 Bitbucket API 代币,请改为输入您的 Atlassian 账户电子邮件地址和 API 令牌。

    • 选择自定义来源凭证,以便使用自定义来源凭证来覆盖您账户的默认设置。

      1. 凭证类型中,选择一个凭证类型。

      2. 连接中,选择使用现有连接或创建新连接。

AWS CLI
要将连接配置为账户级凭证,请在 AWS CLI
  • 打开终端(Linux、macOS 或 Unix)或命令提示符(Windows)。使用运行 AWS CLI 该import-source-credentials命令。

    使用以下命令配置 Secrets Manager 密钥:

    aws codebuild import-source-credentials \ --token "<secret-arn>" \ --server-type <source-provider> \ --auth-type SECRETS_MANAGER \ --region <aws-region>

    使用以下命令配置 CodeConnections 连接:

    aws codebuild import-source-credentials \ --token "<connection-arn>" \ --server-type <source-provider> \ --auth-type CODECONNECTIONS \ --region <aws-region>

    使用此命令可以将令牌作为账户级别的默认来源凭证导入。当您使用 ImportSourceCredentials API 导入凭据时,除非在项目中配置了一组更具体的证书,否则 CodeBuild 将使用该令牌进行与源提供商的所有交互,例如 webhook、生成状态报告和 git 克隆操作。

现在,您可以在构建项目中使用该令牌并运行它。有关更多信息,请参阅在中创建构建项目 AWS CodeBuild手动运行 AWS CodeBuild 构建

将多个令牌配置为源级别凭证

要使用 Secrets Manager 密钥或 CodeConnections 连接作为源代码级证书,请在 CodeBuild 项目中直接引用该令牌,然后开始构建。

AWS 管理控制台
要将多个令牌配置为源级证书,请在 AWS 管理控制台
  1. 对于来源提供商,选择GitHub

  2. 对于凭证,执行以下操作之一:

    • 选择默认来源凭证,使用您账户的默认来源凭证应用于所有项目。

      1. 如果您未连接到 GitHub,请选择 “管理默认来源凭证”。

      2. 对于凭据类型,选择GitHub 应用程序

      3. 连接中,选择使用现有连接或创建新连接。

    • 选择自定义来源凭证,以便使用自定义来源凭证来覆盖您账户的默认设置。

      1. 对于凭据类型,选择GitHub 应用程序

      2. 连接中,选择使用现有连接或创建新连接。

  3. 选择添加源,然后重复选择源提供商和凭证的过程。

AWS CLI
要将多个令牌配置为源级证书,请在 AWS CLI
  • 打开终端(Linux、macOS 或 Unix)或命令提示符(Windows)。使用运行 AWS CLI 该create-project命令。

    使用以下命令:

    aws codebuild create-project --region <aws-region> \ --name <project-name> \ --artifacts type=NO_ARTIFACTS \ --environment "type=LINUX_CONTAINER, computeType=BUILD_GENERAL1_SMALL, image=aws/codebuild/amazonlinux-x86_64-standard:5.0" \ --service-role <service-role-name> \ --source "type=GITHUB, location=<github-repository-1>, auth={type=SECRETS_MANAGER,resource=<secret-or-connection-arn-1>}" \ --secondary-sources "type=GITHUB, location=<github-repository-2>, auth={type=SECRETS_MANAGER,resource=<secret-or-connection-arn-2>}, sourceIdentifier=secondary" aws codebuild start-build --region <aws-region> --project-name <project-name>

设置项目级别源凭证回退

要设置项目级别源凭证回退,请使用项目主源的 NO_SOURCE 并引用令牌。

aws codebuild create-project \ --name <project-name> \ --service-role <service-role-name> \ --artifacts type=NO_ARTIFACTS \ --environment "type=LINUX_CONTAINER, computeType=BUILD_GENERAL1_SMALL, image=aws/codebuild/amazonlinux-x86_64-standard:5.0" \ --service-role <service-role-name> \ --source "type=NO_SOURCE, auth={type=SECRETS_MANAGER,resource=<secret-or-connection-arn>}, buildspec=<buildspec>" --secondary-sources "type=GITHUB, location=<github-repository>, sourceIdentifier=secondary" aws codebuild start-build --region <aws-region> --project-name <project_name>

使用 NO_SOURCE 时,因为源模型没有直接配置为使用外部源来获取 buildspec,所以通常在源模型中提供一个 buildspec。通常,NO_SOURCE 源将负责从 buildspec 中克隆所有相关存储库。为确保配置的凭证可用于这些操作,您可以在 buildspec 中启用 git-credential-helper 选项。

env: git-credential-helper: yes

在构建过程中, CodeBuild 将从配置的令牌中读取该AuthServer字段,并将令牌凭据用于向该特定第三方源提供商发出的所有 git 请求。

其他设置选项

您可以使用 CloudFormation 模板配置 Secrets Manager 账号级别证书。您可以使用以下 CloudFormation 模板来设置账户级别的凭证:

Parameters: GitHubToken: Type: String NoEcho: true Default: placeholder Resources: CodeBuildAuthTokenSecret: Type: AWS::SecretsManager::Secret Properties: Description: CodeBuild auth token Name: codebuild-auth-token SecretString: !Join - '' - - '{"ServerType":"GITHUB","AuthType":"PERSONAL_ACCESS_TOKEN","Token":"' - !Ref GitHubToken - '"}' Tags: - Key: codebuild:source:provider Value: github - Key: codebuild:source:type Value: personal_access_token CodeBuildSecretsManagerAccountCredential: Type: AWS::CodeBuild::SourceCredential Properties: ServerType: GITHUB AuthType: SECRETS_MANAGER Token: !Ref CodeBuildAuthTokenSecret
注意

如果您还要在同一个堆栈中创建项目,请使用该 CloudFormation 属性DependsOn来确保AccountCredential在项目之前创建。

您还可以使用 CloudFormation 模板配置 Secrets Manager 的多个源级别证书。您可以使用以下 CloudFormation 模板使用多个代币来提取多个来源:

Parameters: GitHubTokenOne: Type: String NoEcho: true Default: placeholder GitHubTokenTwo: Type: String NoEcho: true Default: placeholder Resources: CodeBuildSecretsManagerProject: Type: AWS::CodeBuild::Project Properties: Name: codebuild-multitoken-example ServiceRole: <service-role> Environment: Type: LINUX_CONTAINER ComputeType: BUILD_GENERAL1_SMALL Image: aws/codebuild/amazonlinux-x86_64-standard:5.0 Source: Type: GITHUB Location: <github-repository-one> Auth: Type: SECRETS_MANAGER Resource: !Ref CodeBuildAuthTokenSecretOne SecondarySources: - Type: GITHUB Location: <github-repository-two> Auth: Type: SECRETS_MANAGER Resource: !Ref CodeBuildAuthTokenSecretTwo SourceIdentifier: secondary Artifacts: Type: NO_ARTIFACTS LogsConfig: CloudWatchLogs: Status: ENABLED CodeBuildProjectIAMRoleSecretAccess: Type: AWS::IAM::RolePolicy Properties: RoleName: <role-name> PolicyName: CodeBuildProjectIAMRoleSecretAccessPolicy PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - secretsmanager:GetSecretValue Resource: - !Ref CodeBuildAuthTokenSecretOne - !Ref CodeBuildAuthTokenSecretTwo CodeBuildAuthTokenSecretOne: Type: AWS::SecretsManager::Secret Properties: Description: CodeBuild auth token one Name: codebuild-auth-token-one SecretString: !Join - '' - - '{"ServerType":"GITHUB","AuthType":"PERSONAL_ACCESS_TOKEN","Token":"' - !Ref GitHubTokenOne - '"}' Tags: - Key: codebuild:source:provider Value: github - Key: codebuild:source:type Value: personal_access_token CodeBuildAuthTokenSecretTwo: Type: AWS::SecretsManager::Secret Properties: Description: CodeBuild auth token two Name: codebuild-auth-token-two SecretString: !Join - '' - - '{"ServerType":"GITHUB","AuthType":"PERSONAL_ACCESS_TOKEN","Token":"' - !Ref GitHubTokenTwo - '"}' Tags: - Key: codebuild:source:provider Value: github - Key: codebuild:source:type Value: personal_access_token