AWS CloudFormation
用户指南 (API 版本 2010-05-15)

将参数覆盖函数用于 CodePipeline 管道

在 CodePipeline 阶段,您可以为 AWS CloudFormation 操作指定参数覆盖。通过使用参数覆盖,您可以指定覆盖模板配置文件中的值的模板参数值。AWS CloudFormation 提供了一些函数以帮助您指定动态值(在管道运行之前未知的值)。

Fn::GetArtifactAtt

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

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

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

语法

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

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

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

attributeName

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

示例

以下参数覆盖通过检索 BucketName 构件的 S3 存储桶名称和文件名来指定 ObjectKeyLambdaFunctionSource 参数。该示例假定 CodePipeline 复制了 Lambda 函数源代码并将其保存为构件,例如,作为源阶段的一部分。

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

属性

您可以检索构件的以下属性。

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

Fn::GetParam 函数将从 JSON 格式的文件中的键值对返回一个值。JSON 文件必须包含在构件中。

使用此函数可从 AWS CloudFormation 堆栈中检索输出值并将这些值用作另一个操作的输入。例如,如果为 AWS CloudFormation 操作指定输出文件名,则 CodePipeline 在 JSON 文件中保存输出,然后将其添加到输出构件的 .zip 文件中。使用 Fn::GetParam 函数检索输出值,并将其用作另一个操作的输入。

语法

使用以下语法可检索键值对的值。

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

构件的名称,必须作为相关操作的输入构件的包含。

JSONFileName

构件中包含的 JSON 文件的名称。

keyName

要检索其值的键的名称。

示例

以下示例将说明如何在参数覆盖中使用 Fn::GetParam 函数。

语法

以下参数覆盖通过从 WebSiteURL 构件中的 URL 文件检索 stack-output.json 键的值来指定 WebStackOutput 参数。

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

AWS CloudFormation 模板代码段

AWS CloudFormation 管道中的以下 CodePipeline 模板代码段将演示如何传递堆栈输出。这些代码段说明了管道定义的两个阶段。第一个阶段将创建一个堆栈并将其输出保存在 TestOutput.json 构件中的 StackAOutput 文件中。这些值由 OutputFileNameOutputArtifacts 属性指定。

例 创建堆栈 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: TemplateSourceA OutputArtifacts: - Name: StackAOutput RunOrder: '1'

在后续阶段中,堆栈 B 使用堆栈 A 中的输出。在 ParameterOverrides 属性中,示例使用 Fn::GetParam 函数指定 StackBInputParam 参数。结果值是与 StackAOutputName 键关联的值。

例 创建堆栈 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: TemplateSourceB - Name: StackAOutput RunOrder: '1'