AWS CloudFormation
User Guide (API Version 2010-05-15)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

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

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

Fn::GetArtifactAtt

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

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

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

语法

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

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

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

attributeName

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

示例

以下参数覆盖通过检索 LambdaFunctionSource 项目的 S3 存储桶名称和文件名来指定 BucketNameObjectKey 参数。此示例假定 AWS CodePipeline 已复制 Lambda 函数源代码并将其另存为项目,例如,另存为源阶段的一部分。

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

属性

您可以检索项目的以下属性。

BucketName

存储了项目的 S3 存储桶的名称。

ObjectKey

包含由 AWS 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 操作的输出文件名,AWS 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 模板代码段

AWS 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'