

# 将参数覆盖函数用于 CodePipeline 管道
<a name="continuous-delivery-codepipeline-parameter-override-functions"></a>

在 CodePipeline 阶段，您可以为 Amazon CloudFormation 操作指定[参数覆盖](continuous-delivery-codepipeline-action-reference.md)。通过使用参数覆盖，您可以指定覆盖模板配置文件中的值的模板参数值。Amazon CloudFormation 提供了一些函数以帮助您指定动态值（在管道运行之前未知的值）。

**Topics**
+ [`Fn::GetArtifactAtt`](#w2aac21c17b7)
+ [`Fn::GetParam`](#w2aac21c17b9)
+ [另请参阅](#w2aac21c17c11)

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

`Fn::GetArtifactAtt` 函数将从输入构件 (例如，存储了构件的 S3 存储桶名称) 检索属性的值。使用此函数可指定构件的属性，例如，构件的文件名或 Amazon S3 桶名称。

在运行管道时，CodePipeline 复制文件并将其写入到管道的构件存储（S3 桶）中。CodePipeline 在构件存储中生成文件名。在您运行管道之前，这些文件名是未知的。

例如，在管道中，您可能具有一个源阶段，CodePipeline 在该阶段将 Amazon Lambda 函数源代码复制到构件存储中。在下一个阶段，您使用一个 Amazon CloudFormation 模板以创建 Lambda 函数，但 Amazon CloudFormation 需要使用文件名以创建该函数。您必须使用 `Fn::GetArtifactAtt` 函数以传递准确的 S3 存储桶和文件名。

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

使用以下语法可检索构件的属性值。

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

`artifactName`  
输入构件的名称。您必须声明此构件作为相关操作的输入。

`attributeName`  
要检索其值的构件属性的名称。有关每个构件属性的详细信息，请参阅以下“属性”部分。

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

以下参数覆盖通过检索 `LambdaFunctionSource` 构件的 S3 桶名称和文件名来指定 `BucketName` 和 `ObjectKey` 参数。该示例假定 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 文件必须包含在构件中。

使用此函数可从 Amazon CloudFormation 堆栈中检索输出值并将这些值用作另一个操作的输入。例如，如果为 Amazon 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"]}
}
```

#### Amazon CloudFormation 模板代码段
<a name="w2aac21c17b9b9b7"></a>

CodePipeline 管道中的以下 Amazon CloudFormation 模板代码段将演示如何传递堆栈输出。这些代码段说明了管道定义的两个阶段。第一个阶段将创建一个堆栈并将其输出保存在 `StackAOutput` 构件的 `TestOutput.json` 文件中。这些值由 `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 操作参数的更多信息， 请参阅*《Amazon CodePipeline 用户指南》*中的 [Amazon CloudFormation 部署操作配置引用](https://docs.amazonaws.cn/codepipeline/latest/userguide/action-reference-CloudFormation.html)。
+ 有关操作提供方的示例模板值，例如 `Owner` 字段或 `configuration` 字段的值，请参阅*《Amazon CodePipeline 用户指南》*中的[操作结构参考](https://docs.amazonaws.cn/codepipeline/latest/userguide/action-reference.html)。
+ 要下载 YAML 或 JSON 格式的示例管道堆栈模板，请参阅*《Amazon CodePipeline 用户指南》*中[教程：使用 Amazon CloudFormation 创建管道](https://docs.amazonaws.cn/codepipeline/latest/userguide/tutorials-cloudformation.html)。