搭配 CodePipeline 管道使用參數覆寫函數 - AWS CloudFormation

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

搭配 CodePipeline 管道使用參數覆寫函數

在 CodePipeline 階段中,您可以指定 AWS CloudFormation 動作的參數覆寫。參數覆寫可讓您指定範本參數值,以覆寫範本組態檔案中的值。 AWS CloudFormation 提供函數,協助您指定動態值 (管道執行前未知的值)。

Fn::GetArtifactAtt

Fn::GetArtifactAtt 函數會從輸入成品擷取屬性值,例如存放成品的 S3 儲存貯體名稱。使用此函數指定成品的屬性,例如其檔案名稱或儲存 Amazon S3 貯體名稱。

當您執行管道時, 會 CodePipeline 複製並將檔案寫入管道的成品存放區 (S3 儲存貯體)。 會在成品存放區中 CodePipeline 產生檔案名稱。在您執行管道前,這些檔案名稱為未知。

例如,在管道中,您可能有一個來源階段,其中會將 AWS Lambda 函數原始程式碼 CodePipeline 複製到成品存放區。在下一個階段中,您有一個 AWS CloudFormation 範本可建立 Lambda 函數,但 AWS CloudFormation 需要檔案名稱才能建立函數。您必須使用 Fn::GetArtifactAtt 函數傳遞正確的 S3 儲存貯體和檔案名稱。

語法

使用下列語法來擷取成品的屬性值。

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

輸入成品的名稱。您必須為關聯動作將此成品宣告為輸入。

attributeName

您希望擷取其值的成品屬性名稱。如需每一個成品屬性的詳細資訊,請參閱以下的「屬性」一節。

範例

下列參數覆寫透過擷取 S3 儲存貯體名稱和 BucketName 成品的檔案名稱,指定 ObjectKeyLambdaFunctionSource 參數。此範例假設已 CodePipeline 複製 Lambda 函數原始程式碼,並將其儲存為成品,例如,作為來源階段的一部分。

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

Attributes

您可以擷取成品的下列屬性。

BucketName

存放成品的 S3 儲存貯體名稱。

ObjectKey

包含由 產生成品的.zip檔案名稱 CodePipeline,例如 1ABCyZZ.zip

URL

成品URL的 Amazon Simple Storage Service (Amazon S3),例如 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 屬性指定。

該階段來源輸出成品的名稱為 TemplateSource。堆疊範本的檔案名稱為 teststackA.yaml,而組態檔案的檔案名稱為 test-configuration.json。在這兩個階段中,這些值都會指定給 TemplateConfigurationTemplatePath 屬性,如下所示:

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'

另請參閱

以下相關資源可協助您使用這些參數。