将参数覆盖函数用于 CodePipeline 管道
在 CodePipeline 阶段,您可以为 Amazon CloudFormation 操作指定参数覆盖。通过使用参数覆盖,您可以指定覆盖模板配置文件中的值的模板参数值。Amazon CloudFormation 提供了一些函数以帮助您指定动态值(在管道运行之前未知的值)。
Fn::GetArtifactAtt
Fn::GetArtifactAtt
函数将从输入构件 (例如,存储了构件的 S3 存储桶名称) 检索属性的值。使用此函数可指定构件的属性,例如,构件的文件名或 Amazon S3 桶名称。
在运行管道时,CodePipeline 复制文件并将其写入到管道的构件存储(S3 桶)中。CodePipeline 在构件存储中生成文件名。在您运行管道之前,这些文件名是未知的。
例如,在管道中,您可能具有一个源阶段,CodePipeline 在该阶段将 Amazon Lambda 函数源代码复制到构件存储中。在下一个阶段,您使用一个 Amazon CloudFormation 模板以创建 Lambda 函数,但 Amazon CloudFormation 需要使用文件名以创建该函数。您必须使用 Fn::GetArtifactAtt
函数以传递准确的 S3 存储桶和文件名。
语法
使用以下语法可检索构件的属性值。
{ "Fn::GetArtifactAtt" : [ "
artifactName
", "attributeName
" ] }
artifactName
-
输入构件的名称。您必须声明此构件作为相关操作的输入。
attributeName
-
要检索其值的构件属性的名称。有关每个构件属性的详细信息,请参阅以下“属性”部分。
示例
以下参数覆盖通过检索 LambdaFunctionSource
构件的 S3 桶名称和文件名来指定 BucketName
和 ObjectKey
参数。该示例假定 CodePipeline 复制了 Lambda 函数源代码并将其保存为构件,例如,作为源阶段的一部分。
{ "BucketName" : { "Fn::GetArtifactAtt" : ["LambdaFunctionSource", "BucketName"]}, "ObjectKey" : { "Fn::GetArtifactAtt" : ["LambdaFunctionSource", "ObjectKey"]} }
Attributes
您可以检索构件的以下属性。
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 文件必须包含在构件中。
使用此函数可从 Amazon CloudFormation 堆栈中检索输出值并将这些值用作另一个操作的输入。例如,如果为 Amazon 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"]} }
Amazon CloudFormation 模板代码段
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
例 创建堆栈 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
键关联的值。
例 创建堆栈 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'
另请参阅
下列相关资源可帮助您处理这些参数。
-
有关 CodePipeline 中 CloudFormation 操作参数的更多信息, 请参阅《Amazon CodePipeline 用户指南》中的 Amazon CloudFormation 部署操作配置引用。
-
有关操作提供方的示例模板值,例如
Owner
字段或configuration
字段的值,请参阅《Amazon CodePipeline 用户指南》中的操作结构参考。 -
要下载 YAML 或 JSON 格式的示例管道堆栈模板,请参阅《Amazon CodePipeline 用户指南》中教程:使用 Amazon CloudFormation 创建管道。