

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

# CodeBuild 中的多個存取權杖
<a name="multiple-access-tokens"></a>

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

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

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

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

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

**Topics**
+ [步驟 1：建立 Secrets Manager 秘密或 CodeConnections 連線](#create-secret-connection)
+ [步驟 2：授予 CodeBuild 專案 IAM 角色對 Secrets Manager 秘密的存取權](#asm-role-access)
+ [步驟 3：設定 Secrets Manager 或 CodeConnections 字符](#asm-account-credential)
+ [其他設定選項](#asm-credential-cfn)

## 步驟 1：建立 Secrets Manager 秘密或 CodeConnections 連線
<a name="create-secret-connection"></a>

使用下列指示來建立 Secrets Manager 秘密或 CodeConnections 連線：
+ [在 Secrets Manager 秘密中建立和存放權杖](asm-create-secret.md).
+ [建立 GitHub 的連線](https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-create-github.html)
+ [建立與 GitHub Enterprise Server 的連線](https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-create-gheserver.html)
+ [建立與 Bitbucket 的連線](https://docs.aws.amazon.com/dtconsole/latest/userguide/connections-create-bitbucket.html)

## 步驟 2：授予 CodeBuild 專案 IAM 角色對 Secrets Manager 秘密的存取權
<a name="asm-role-access"></a>

**注意**  
在繼續之前，您必須擁有在 Secrets Manager 或 CodeConnections 中建立權杖的存取權。

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

**授予 CodeBuild 專案 IAM 角色存取權**

1. 遵循 CodeBuild 專案的 指示，為您的 CodeBuild 專案建立 [允許 CodeBuild 與其他 AWS 服務互動](setting-up-service-role.md) IAM 角色。

1. 執行以下任意一項：
   + 將下列 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 字符
<a name="asm-account-credential"></a>

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

### 將 Secrets Manager 或 CodeConnections 權杖設定為帳戶層級登入資料
<a name="asm-account-credential"></a>

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

------
#### [ AWS 管理主控台 ]

**若要在 中將連線設定為帳戶層級登入資料 AWS 管理主控台**

1. 針對**來源提供者**，選擇 **Bitbucket**、**GitHub** 或 **GitHub Enterprise**。

1. 對於**登入**資料，請執行下列其中一項操作：
   + 選擇**預設來源登入**資料，以使用您帳戶的預設來源登入資料套用至所有專案。

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

     1. 針對**登入資料類型**，選擇登入資料類型。

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

        如果您選擇不同的登入資料類型，對於 **Service**，請選擇您要用來存放字符的服務，並執行下列動作：
        + 如果您選擇使用 **Secrets Manager**，您可以選擇使用現有的秘密連線或建立新的秘密，然後選擇**儲存**。如需如何建立新的秘密的詳細資訊，請參閱 [在 Secrets Manager 秘密中建立和存放權杖](asm-create-secret.md)。
        + 如果您選擇使用 **CodeBuild**，請輸入您的字符或使用者名稱和應用程式密碼，然後選擇**儲存**。
   + 選擇**自訂來源登入**資料，以使用自訂來源登入資料來覆寫您帳戶的預設設定。

     1. 針對**登入資料類型**，選擇登入資料類型。

     1. 在**連線**中，選擇使用現有的連線或建立新的連線。

------
#### [ 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](https://docs.aws.amazon.com/codebuild/latest/APIReference/API_ImportSourceCredentials.html) API 匯入登入資料時，除非已在專案中設定更具體的登入資料集，否則 CodeBuild 將使用字符與來源提供者的所有互動，例如 Webhook、建置狀態報告和 git 複製操作。

------

您現在可以在建置專案中使用權杖並執行它。如需詳細資訊，請參閱[在 中建立建置專案 AWS CodeBuild](create-project.md)及[手動執行 AWS CodeBuild 組建](run-build.md)。

### 將多個字符設定為來源層級登入資料
<a name="asm-source-credential"></a>

若要使用 Secrets Manager 秘密或 CodeConnections 連線做為來源層級登入資料，請直接參考 CodeBuild 專案中的字符，並啟動組建。

------
#### [ AWS 管理主控台 ]

**若要在 中將多個字符設定為來源層級登入資料 AWS 管理主控台**

1. 針對 **Source provider (來源供應商)**，選擇 **GitHub**。

1. 對於**登入**資料，請執行下列其中一項操作：
   + 選擇**預設來源登入**資料，以使用您帳戶的預設來源登入資料套用至所有專案。

     1. 如果您未連線至 GitHub，請選擇**管理預設來源憑證**。

     1. 針對**登入資料類型**，選擇 **GitHub 應用程式**。

     1. 在**連線**中，選擇使用現有的連線或建立新的連線。
   + 選擇**自訂來源登入**資料，以使用自訂來源登入資料覆寫您帳戶的預設設定。

     1. 針對**登入資料類型**，選擇 **GitHub 應用程式**。

     1. 在**連線**中，選擇使用現有的連線或建立新的連線。

1. 選擇**新增來源**，然後重複選擇來源提供者和登入資料的程序。

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

------

### 設定專案層級來源憑證備用
<a name="asm-project-credential"></a>

若要設定專案層級來源憑證備用，請將 `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](build-spec-ref.md)。通常，`NO_SOURCE`來源會處理從 buildspec 內複製所有相關儲存庫。為了確保設定的登入資料可供這些操作使用，您可以在 buildspec 中啟用 `git-credential-helper`選項。

```
env:
  git-credential-helper: yes
```

在建置期間，CodeBuild 將從設定的字符讀取 `AuthServer` 欄位，並針對對該特定第三方來源提供者的所有 git 請求使用字符憑證。

## 其他設定選項
<a name="asm-credential-cfn"></a>

您可以使用 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](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html)，以確保`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
```