CodeBuild 中的多個存取字符 - AWS CodeBuild

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

CodeBuild 中的多個存取字符

CodeBuild 支援從 AWS Secrets Manager 中或透過 AWS CodeConnections 連線的秘密,將存取權杖來源至第三方供應商。您可以將秘密或連線設定為與指定第三方供應商互動的預設登入資料,例如 GitHub、GitHub Enterprise 或 Bitbucket。

您可以將來源登入資料設定為三個不同的層級:

  1. 所有專案的帳戶層級登入資料:這些是 AWS 帳戶中所有專案的預設登入資料。當未指定專案或來源層級登入資料時,它們將用於專案。

  2. 特定儲存庫的來源層級登入資料:這是在專案來源上定義 Secrets Manager 秘密或 CodeConnections 連線時。這些登入資料只會用於指定來源儲存庫上的操作。這可讓您在相同專案中設定具有不同許可範圍的多個存取字符,而不使用預設帳戶層級登入資料。

  3. 專案層級備用憑證:您可以使用 NO_SOURCE作為主要來源類型來設定專案層級備用憑證,並在其上定義秘密或連線。當您在專案上有多個來源,但想要為它們使用相同的登入資料,或者您不想為專案使用預設帳戶層級登入資料時,可以使用此功能。

步驟 1:建立 Secrets Manager 秘密或 CodeConnections 連線

使用下列指示來建立 Secrets Manager 秘密或 CodeConnections 連線:

步驟 2:授予 CodeBuild 專案 IAM 角色對 Secrets Manager 秘密的存取權

注意

在繼續之前,您必須能夠存取在 Secrets Manager 或 CodeConnections 中建立的權杖。

若要授予 CodeBuild 專案 IAM 角色對 Secrets Manager 或 CodeConnections 的存取權,您必須新增下列 IAM 政策。

授予 CodeBuild 專案 IAM 角色存取權
  1. 遵循 CodeBuild 專案的 指示,為您的 CodeBuild 專案建立 允許 CodeBuild 與其他 AWS 服務互動 IAM 角色。

  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:設定 Secrets Manager 或 CodeConnections 權杖

您可以使用 Secrets Manager 或 CodeConnections 字符,將來源憑證設定為三個不同的層級。

將 Secrets Manager 或 CodeConnections 字符設定為帳戶層級登入資料

您可以將 Secrets Manager 秘密或 CodeConnections 連線設定為帳戶層級登入資料,並在專案中使用。

AWS Management Console
若要在 中將連線設定為帳戶層級登入資料 AWS Management Console
  1. 針對來源提供者,選擇 BitbucketGitHubGitHub Enterprise

  2. 對於登入資料,請執行下列其中一項操作:

    • 選擇預設來源登入資料,以使用您帳戶的預設來源登入資料套用至所有專案。

      1. 如果您未連線到來源提供者,請選擇管理預設來源憑證

      2. 針對登入資料類型,選擇登入資料類型。

      3. 如果您選擇 CodeConnections,請選擇使用現有連線或建立新的連線。

        如果您選擇不同的登入資料類型,對於 Service,請選擇您要用來存放字符的服務,並執行下列動作:

        • 如果您選擇使用 Secrets Manager,您可以選擇使用現有的秘密連線或建立新的秘密,然後選擇儲存。如需如何建立新秘密的詳細資訊,請參閱 在 Secrets Manager 秘密中建立和存放權杖

        • 如果您選擇使用 CodeBuild,請輸入您的字符或使用者名稱和應用程式密碼,然後選擇儲存

    • 選擇自訂來源登入資料,以使用自訂來源登入資料覆寫您帳戶的預設設定。

      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 Management Console
若要在 中將多個字符設定為來源層級登入資料 AWS Management Console
  1. 針對 Source provider (來源供應商),選擇 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 請求使用字符登入資料。

其他設定選項

您可以使用 AWS CloudFormation 範本來設定 Secrets Manager 帳戶層級登入資料。您可以使用下列 AWS 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
注意

如果您也要在相同的堆疊中建立專案,請使用 AWS CloudFormation 屬性 DependsOn,以確保AccountCredential在專案之前建立 。

您也可以使用 AWS CloudFormation 範本來設定 Secrets Manager 多個來源層級登入資料。您可以使用下列 AWS 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