多個訪問令牌 CodeBuild - AWS CodeBuild

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

多個訪問令牌 CodeBuild

CodeBuild 支持從您的秘密 AWS Secrets Manager 或通過 AWS CodeConnections 連接向第三方提供商採購訪問令牌。您可以將密碼或連線設定為與指定協力廠商提供者 (例如 GitHub GitHub 企業或 Bitbucket) 互動的預設憑證。

您可以在三個不同層級設定來源認證:

  1. 所有專案的帳戶層級憑證:這些是 AWS 帳戶中所有專案的預設憑證。如果未指定專案或來源層級認證,則會在專案中使用它們。

  2. 特定儲存庫的來源層級認證:這是在專案來源上定義 Secrets Manager 密碼或 CodeConnections 連線的時候。這些證明資料只會用於指定來源儲存區域的作業。這使您可以在同一項目中設置具有不同權限範圍的多個訪問令牌,而不使用默認帳戶級憑據。

  3. 專案層級後援認證:您可以使用NO_SOURCE作為主要來源類型來設定專案層級後援認證,並在其上定義密碼或連線。當您在一個項目上有多個源,但想要為它們使用相同的憑據,或者當您不想為項目使用默認帳戶級憑據時,可以使用此功能。

步驟 1:建立密碼管理員密碼或 CodeConnections 連線

使用下列指示來建立密碼管理員密碼或 CodeConnections 連線:

步驟 2:將 CodeBuild 專案IAM角色存取權授與 Secrets Manager

注意

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

若要將 CodeBuild 專案IAM角色存取權授予 Secrets Manager CodeConnections,或者,您必須新增下列IAM原則。

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

  2. 執行以下任意一項:

    • 將下列IAM原則新增至您的 CodeBuild 專案角色,以授與密碼的存取權。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "secretsmanager:GetSecretValue" ], "Resource": [ "<secret-arn>" ] } ] }

      (選擇性) 如果您使用 AWS KMS 客戶管理的金鑰來加密 Secrets Manager 密碼,您可以新增下列原則陳述式來授與存取權。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "kms:Decrypt" ], "Resource": "<kms-key-arn>", "Condition": { "StringEquals": { "kms:EncryptionContext:SecretARN": "<secret-arn>" } } } ] }
    • 將下列IAM原則新增至您的 CodeBuild 專案角色,以授與連線的存取權。

      { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codeconnections:GetConnectionToken", "codeconnections:GetConnection" ], "Resource": [ <connection-arn> ] } ] }

步驟 3:設定 Secrets Manager 或 CodeConnections 權杖

您可以使用 Secrets Manager 或 CodeConnections 權杖,在三個不同層級設定來源認證。

將 Secrets Manager 或 CodeConnections 權杖設定為帳戶層級認證

您可以將 Secrets Manager 密碼或 CodeConnections 連線設定為帳戶層級認證,並在專案中使用它。

AWS Management Console
若要將連線設定為帳戶層級認證 AWS Management Console
  1. 針對來源提供者,請選擇 [Bitbucket] 或 [GitHub 企業]。GitHub

  2. 對於「認證」,請執行下列其中一個動作:

    • 選擇 [預設來源認證] 以使用帳戶的預設來源認證套用至所有專案。

      1. 如果您未連線至來源提供者,請選擇 [管理預設來源認證]。

      2. 針對認證類型,選擇認證類型。

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

        如果您選擇了不同的憑據類型,對於 Ser vice,請選擇要用於存儲令牌的服務,然後執行以下操作:

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

        • 如果您選擇使用 CodeBuild,請輸入權杖或使用者名稱和應用程式密碼,然後選擇 [儲存]。

    • 選擇 [自訂來源認證] 以使用自訂來源認證覆寫帳戶的預設設定。

      1. 針對認證類型,選擇認證類型。

      2. 在「連線」中,選擇使用現有連線或建立新連線。

AWS CLI
若要將連線設定為帳戶層級認證 AWS CLI
  • 開啟終端機 (Linux、macOS 或 Unix) 或命令提示 (Windows)。使用 AWS CLI 來執行命import-source-credentials令。

    使用下列命令來設定密碼管理員密碼:

    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>

    此命令可讓您將權杖匯入為帳戶層級的預設來源認證。當您使用匯入認證時 ImportSourceCredentialsAPI,除非在專案中設定了更特定的認證集,否則 CodeBuild 將使用該權杖進行與來源提供者的所有互動,例如 webhook、建置狀態報告和 git clone 作業。

現在,您可以在構建項目中使用令牌並運行它。如需詳細資訊,請參閱 在 中建立建置專案 AWS CodeBuild手動執行 AWS CodeBuild 建置

將多個權杖設定為來源層級認證

若要使用 Secrets Manager 密碼或 CodeConnections 連線做為來源層級認證,請直接參考 CodeBuild 專案中的權杖,然後啟動組建。

AWS Management Console
若要將多個記號設定為來源層級認證 AWS Management Console
  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/amazonlinux2-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/amazonlinux2-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/amazonlinux2-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