

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

# 搭配 CodePipeline 管道使用參數覆寫函數
<a name="continuous-delivery-codepipeline-parameter-override-functions"></a>

在 CodePipeline 階段中，您可以指定 CloudFormation 動作的[參數覆寫](continuous-delivery-codepipeline-action-reference.md)。參數覆寫可讓您指定範本參數值，以覆寫範本組態檔案中的值。 CloudFormation 提供 函數，協助您指定動態值 （管道執行之前未知的值）。

**Topics**
+ [`Fn::GetArtifactAtt`](#w2aac21c17b7)
+ [`Fn::GetParam`](#w2aac21c17b9)
+ [另請參閱](#w2aac21c17c11)

## `Fn::GetArtifactAtt`
<a name="w2aac21c17b7"></a>

`Fn::GetArtifactAtt` 函數會從輸入成品擷取屬性值，例如存放成品的 S3 儲存貯體名稱。使用此函數來指定成品的屬性，例如其檔案名稱或儲存 Amazon S3 貯體名稱。

執行管道時，CodePipeline 會複製並將檔案寫入管道的成品存放區 (S3 儲存貯體)。CodePipeline 會在成品存放區中產生檔案名稱。在您執行管道前，這些檔案名稱為未知。

例如，在您的管道中，您可能會有來源階段，在此階段中 CodePipeline 會將您的 AWS Lambda 函數原始程式碼複製到成品存放區。在下一個階段，您有一個 CloudFormation 範本可建立 Lambda 函數，但 CloudFormation 需要檔案名稱才能建立函數。您必須使用 `Fn::GetArtifactAtt` 函數傳遞正確的 S3 儲存貯體和檔案名稱。

### 語法
<a name="w2aac21c17b7b9"></a>

使用下列語法來擷取成品的屬性值。

```
{ "Fn::GetArtifactAtt" : [ "{{artifactName}}", "{{attributeName}}" ] }
```

`artifactName`  
輸入成品的名稱。您必須為關聯動作將此成品宣告為輸入。

`attributeName`  
您希望擷取其值的成品屬性名稱。如需每一個成品屬性的詳細資訊，請參閱以下的「屬性」一節。

### 範例
<a name="w2aac21c17b7c11"></a>

下列參數覆寫透過擷取 S3 儲存貯體名稱和 `BucketName` 成品的檔案名稱，指定 `ObjectKey` 和 `LambdaFunctionSource` 參數。此範例假設 CodePipeline 已複製 Lambda 函數原始程式碼，並已將其儲存為成品 (例如，作為來源階段的一部分)。

```
{
  "BucketName" : { "Fn::GetArtifactAtt" : ["LambdaFunctionSource", "BucketName"]},
  "ObjectKey" : { "Fn::GetArtifactAtt" : ["LambdaFunctionSource", "ObjectKey"]}
}
```

### 屬性
<a name="w2aac21c17b7c13"></a>

您可以擷取成品的下列屬性。

`BucketName`  
存放成品的 S3 儲存貯體名稱。

`ObjectKey`  
包含由 CodePipeline 產生之成品的 `.zip` 檔案名稱，例如 `1ABCyZZ.zip`。

`URL`  
成品的 Amazon Simple Storage Service (Amazon S3) URL，例如 `https://s3.us-west-2.amazonaws.com/artifactstorebucket-yivczw8jma0c/test/TemplateSo/1ABCyZZ.zip`。

## `Fn::GetParam`
<a name="w2aac21c17b9"></a>

`Fn::GetParam` 函數會以 JSON 格式檔案傳回鍵/值對的值。JSON 檔案必須包含在成品中。

使用此函數從 CloudFormation 堆疊擷取輸出值，並將其用作另一個動作的輸入。例如，如果您指定 CloudFormation 動作的輸出檔案名稱，CodePipeline 會將輸出儲存在 JSON 檔案中，然後將其新增至輸出成品的 `.zip` 檔案。使用 `Fn::GetParam` 函數擷取輸出值，並用它作為另一的動作的輸入。

### 語法
<a name="w2aac21c17b9b7"></a>

使用以下語法來擷取鍵/值對的值。

```
{ "Fn::GetParam" : [ "{{artifactName}}", "{{JSONFileName}}", "{{keyName}}" ] }
```

`artifactName`  
成品的名稱，必須包含在關聯動作的輸入成品中。

`JSONFileName`  
包含在成品中的 JSON 檔案名稱。

`keyName`  
您希望擷取其值的鍵名稱。

### 範例
<a name="w2aac21c17b9b9"></a>

以下範例示範如何在參數覆寫中使用 `Fn::GetParam` 函數。

#### 語法
<a name="w2aac21c17b9b9b5"></a>

以下參數覆寫透過從位於 `WebSiteURL` 成品內的 `URL` 檔案擷取 `stack-output.json` 鍵的值，指定 `WebStackOutput` 參數。

```
{
  "WebSiteURL" : { "Fn::GetParam" : ["WebStackOutput", "stack-output.json", "URL"]}
}
```

#### CloudFormation 範本程式碼片段
<a name="w2aac21c17b9b9b7"></a>

下列 CloudFormation 範本程式碼片段來自 CodePipeline 管道，示範如何傳遞堆疊輸出。這些程式碼片段顯示管道定義的兩個階段。第一個階段會建立堆疊並將其輸出儲存在 `TestOutput.json` 成品內的 `StackAOutput` 檔案中。這些值會以 `OutputFileName` 和 `OutputArtifacts` 屬性指定。

該階段來源輸出成品的名稱為 `TemplateSource`。堆疊範本的檔案名稱為 `teststackA.yaml`，而組態檔案的檔案名稱為 `test-configuration.json`。在這兩個階段中，這些值都會指定給 `TemplateConfiguration` 和 `TemplatePath` 屬性，如下所示：

```
TemplateConfiguration: TemplateSource::test-configuration.json
TemplatePath: TemplateSource::teststackA.yaml
```

**Example 建立堆疊 A 階段**  

```
- Name: CreateTestStackA
  Actions:
    - Name: CloudFormationCreate
      ActionTypeId:
        Category: Deploy
        Owner: AWS
        Provider: CloudFormation
        Version: '1'
      Configuration:
        ActionMode: CREATE_UPDATE
        Capabilities: CAPABILITY_IAM
        OutputFileName: TestOutput.json
        RoleArn: !GetAtt [CFNRole, Arn]
        StackName: StackA
        TemplateConfiguration: TemplateSource::test-configuration.json
        TemplatePath: TemplateSource::teststackA.yaml
      InputArtifacts:
        - Name: TemplateSource
      OutputArtifacts:
        - Name: StackAOutput
      RunOrder: '1'
```

在後續階段中，堆疊 B 會使用堆疊 A 的輸出。在 `ParameterOverrides` 屬性中，範例使用 `Fn::GetParam` 函數指定 `StackBInputParam` 參數。產生的值是和 `StackAOutputName` 鍵關聯的值。

**Example 建立堆疊 B 階段**  

```
- Name: CreateTestStackB
  Actions:
    - Name: CloudFormationCreate
      ActionTypeId:
        Category: Deploy
        Owner: AWS
        Provider: CloudFormation
        Version: '1'
      Configuration:
        ActionMode: CREATE_UPDATE
        Capabilities: CAPABILITY_IAM
        RoleArn: !GetAtt [CFNRole, Arn]
        StackName: StackB
        TemplateConfiguration: TemplateSource::test-configuration.json
        TemplatePath: TemplateSource::teststackB.yaml
        ParameterOverrides: |
          {
            "StackBInputParam" : { "Fn::GetParam" : ["StackAOutput", "TestOutput.json", "StackAOutputName"]}
          }
      InputArtifacts:
        - Name: TemplateSource
        - Name: StackAOutput
      RunOrder: '1'
```

## 另請參閱
<a name="w2aac21c17c11"></a>

以下相關資源可協助您使用這些參數。
+ 如需有關 CodePipeline 中 CloudFormation 動作參數的詳細資訊，請參閱《AWS CodePipeline 使用者指南》**中的 [CloudFormation 部署動作組態參考](https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference-CloudFormation.html)。
+ 如需動作提供者的範例範本值 (例如 `Owner` 欄位或 `configuration` 欄位)，請參閱 *AWS CodePipeline User Guide* (《 使用者指南》) 中的 [Action structure reference](https://docs.aws.amazon.com/codepipeline/latest/userguide/action-reference.html) (動作結構參考)。
+ 若要下載 YAML 或 JSON 格式的管道堆疊範本範例，請參閱《AWS CodePipeline 使用者指南》中的[教學課程：使用 CloudFormation建立管道](https://docs.aws.amazon.com/codepipeline/latest/userguide/tutorials-cloudformation.html)。**