當我在堆疊中使用 Fn::ImportValue 時,會在 AWS CloudFormation 中收到「找不到名為 XYZ 的匯出」錯誤。
簡短描述
如果您在 CloudFormation 中建立使用匯入或匯出值的堆疊引用,則必須執行下列動作:
- 在您要匯出值的堆疊中,使用 CloudFormation 範本的輸出區段中的**匯出:**旗標。
- 在您要引用匯出值的堆疊中,使用 Fn::ImportValue。
在下列情況下,您可能會收到「找不到名為 XYX 的匯出」錯誤:
- 您在巢狀堆疊中使用 Fn::ImportValue。
- 匯出的值不在您要匯入值的相同 AWS 區域或相同 AWS 帳戶中。
- 匯出的值在堆疊匯入之前未建立或發佈。
- 您在匯入堆疊中使用了不正確的匯出名稱。
根據您遇到的情況,選擇下列其中一種解決方法。
解決方法
**注意:**如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤,請確保您使用的是最新的 AWS CLI 版本。
您在巢狀堆疊中使用 Fn::ImportValue
根據預設,CloudFormation 會與巢狀堆疊平行建立子堆疊。如果子堆疊彼此平行建立,並且一個正在匯入另一個的輸出,則堆疊建立可能會失敗。匯出值存在無法及時由其他子堆疊匯入的風險。
若要解決這個問題,請使用 DependsOn 屬性為使用 Fn::ImportValue 的堆疊建立明確的相依性。僅可在匯出值的子堆疊後建立使用 Fn:ImportValue 的子堆疊。
在下列巢狀堆疊範例中,ChildStack01 匯出輸出部分的值,而 ChildStack02 使用 Fn::ImportValue 從 ChildStack01 匯入值。您可以根據下列範例中的 YAML 範本對 ChildStack02 使用 DependsOn:
AWSTemplateFormatVersion: 2010-09-09
Resources:
ChildStack01:
Type: 'AWS::CloudFormation::Stack'
Properties:
TemplateURL: 'https://s3.amazonaws.com/cloudformation-templates-us-east-1/VPC.template'
TimeoutInMinutes: '60'
ChildStack02:
Type: 'AWS::CloudFormation::Stack'
DependsOn: ChildStack01
Properties:
TemplateURL: 'https://s3.amazonaws.com/cloudformation-templates-us-east-1/Subnet.template'
TimeoutInMinutes: '60'
**提示:**對於跨堆疊引用,請使用 Fn::ImportValue 從另一個範本匯入值。對於巢狀堆疊,請使用 Fn::Ref 和 Fn::GetAtt 引用目前範本中的值。
匯出的值不在您要匯入值的相同 AWS 區域或相同 AWS 帳戶中
跨堆疊引用僅適用於單一帳戶和區域。位於相同帳戶和區域中的其他堆疊只能匯入已匯出的值。
若要解決此問題,請在使用 Fn::ImportValue 建立堆疊之前,先完成驗證匯出和匯入堆疊的堆疊組態一節中的步驟。
匯出的值在堆疊匯入之前未建立或發佈
對於非巢狀堆疊,必須部署匯出值的堆疊。堆疊必須處於 Create_Complete 或 Update_Complete 狀態,然後才可建立要匯入的堆疊。
若要解決此問題,請在使用 Fn::ImportValue 建立堆疊之前,先完成驗證匯出和匯入堆疊的堆疊組態一節中的步驟。
您在匯入堆疊中使用了不正確的匯出名稱
- 確認匯出名稱已列在您的帳戶中。
- 將匯出名稱從一個堆疊匯入至另一個堆疊時,請確認在兩個堆疊中使用完全相同的匯出名稱。
- 在使用 Fn::ImportValue 建立堆疊之前,先完成驗證匯出和匯入堆疊的堆疊組態一節中的步驟。
驗證匯出和匯入堆疊的堆疊組態
您可以使用 CloudFormation 主控台或 AWS CLI 來確認匯出值存在於相同的區域和帳戶中。
使用 CloudFormation 主控台:
- 開啟 CloudFormation 主控台。
- 從導覽窗格中,選擇匯出。
- 確認匯出值已列在主控台中。
使用 AWS CLI:
1. 若要列出可用的匯出,請執行下列命令:
aws cloudformation list-exports --region us-east-1
**注意:**將 us-east-1 替換為您的區域。
2. 在輸出中,確認匯入和匯出堆疊的名稱屬性相同。輸出會類似於以下內容:
aws cloudformation list-exports --region us-east-1 --output yaml
Exports:
- ExportingStackId: arn:aws:cloudformation:us-east-1:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800
Name: private-vpc-subnet-a
Value: subnet-01a234bcdefghij56
**重要:**在堆疊中使用匯入和匯出值時,請考慮下列事項: 在堆疊匯入輸出值之後,您無法刪除正在匯出輸出值的堆疊,也無法修改匯出的輸出值。您必須先移除所有匯入,然後才可刪除匯出堆疊或修改輸出值。匯出名稱在區域中必須唯一。解決方法是您可以使用 AWS Systems Manager Parameter Store 中的參數在 CloudFormation 堆疊之間共用值。