AWS CloudFormation
User Guide (API 版本 2010-05-15)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

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

Fn::GetArtifactAtt

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

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

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

语法

使用以下语法可检索项目的属性值。

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

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

attributeName

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

示例

以下参数覆盖通过检索 LambdaFunctionSource 项目的 S3 存储桶名称和文件名来指定 BucketNameObjectKey 参数。此示例假定 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 函数。

语法

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

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

AWS CloudFormation 模板代码段

CodePipeline 管道中的以下 AWS CloudFormation 模板代码段将演示如何传递堆栈输出。这些代码段说明了管道定义的两个阶段。第一个阶段将创建一个堆栈并将其输出保存在 StackAOutput 项目中的 TestOutput.json 文件中。这些值由 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'