在 AWS CloudFormation 堆疊中使用 Fn::ImportValue 時,我會收到 "No Export named XYZ found" 錯誤。
解決方法
先決條件:
- 針對匯出值的堆疊,使用 CloudFormation 範本的輸出區段中的 Export: 旗標。
- 在您參考匯出值的堆疊中使用 Fn::ImportValue。
若要解決使用匯入和匯出值時堆疊參考的問題,請採取下列動作。
如果您使用巢狀堆疊,則請使用 DependsOn
依預設,CloudFormation 會平行建立所有巢狀堆疊。CloudFormation 平行建立子堆疊,且子堆疊從另一個堆疊匯入輸出時,堆疊建立可能會失敗。匯出值可能無法及時提供給子堆疊以使用 Fn::ImportValue 匯入該值。
若要解決此問題,請使用 DependsOn 屬性。此屬性會在使用 Fn::ImportValue 的堆疊與使用 Export: 屬性的堆疊之間建立明確的相依性。這樣,CloudFormation 會在其建立匯出值的堆疊之後,建立使用 Fn::ImportValue 的堆疊。
範例: 在巢狀堆疊中,ChildStack01 會在輸出區段中匯出值,而 ChildStack02 會使用 Fn::ImportValue 從 ChildStack01 匯入值。在下列 YAML 範本中,ChildStack02 會使用 DependsOn 屬性:
AWSTemplateFormatVersion: 2010-09-09Resources:
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 帳戶中是否已列出匯出名稱。
- 將匯出名稱從一個堆疊匯入至另一個堆疊時,請確認您在兩個堆疊中使用的是相同的匯出名稱。
- 使用 Fn::ImportValue 建立堆疊之前,請參閱驗證匯出和匯入堆疊的堆疊組態區段。
確定匯出值位於與 AWS 區域相同的位置,或與在其中匯入值的帳戶位置相同
您僅能在單一帳戶和區域內使用跨堆疊參考。位於相同帳戶和區域中的其他堆疊只能匯入匯出值。
若要解決此問題,在使用 Fn::ImportValue 建立堆疊之前,請參閱驗證匯出和匯入堆疊的堆疊組態區段。
請確定在堆疊匯入匯出值之前是否已建立或發佈該值
對於非巢狀堆疊,必須先部署匯出值的堆疊。堆疊必須處於 Create_Complete 或 Update_Complete 狀態。
使用 Fn::ImportValue 建立堆疊之前,請參閱驗證匯出和匯入堆疊的堆疊組態區段。
驗證匯出和匯入堆疊的堆疊組態
若要驗證匯出值是否已備妥匯入,請使用 CloudFormation 主控台或 AWS Command Line Interface (AWS CLI)。
**注意:**匯入和匯出堆疊必須位於相同的區域和帳戶中。
若要使用 CloudFormation 主控台,請完成下列步驟:
- 開啟 CloudFormation 主控台。
- 從導覽窗格中,選擇匯出。
- 確認是否已列出堆疊的匯出值。
若要使用 AWS CLI,請完成下列步驟:
-
若要列出可用的匯出,請執行下列 list-exports 命令:
aws cloudformation list-exports --region us-east-1
**注意:**將 us-east-1 取代為您的區域。
-
在輸出中,確認匯出中的名稱值是否與 Fn::ImportValue 值相同。
輸出看起來類似於此範例:
aws cloudformation list-exports --region us-east-1 --output yamlExports:
- 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 CLI 命令時收到錯誤,請參閱對 AWS CLI 錯誤進行疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
堆疊匯入輸出值之後,您無法刪除正在匯出輸出值的堆疊,也無法修改匯出的輸出值。您必須先移除所有匯入,才能刪除匯出堆疊或修改輸出值。如需如何使用因應措施的相關資訊,請參閱如何使用 AWS Systems Manager Parameter Store 中的參數來在 CloudFormation 堆疊之間共用值?請注意匯出名稱在區域內必須唯一。
匯入資訊的堆疊中的匯出陳述式看起來類似於下列範例:
Resources:
WebServerInstance:
Type: 'AWS::EC2::Instance'
Properties:
InstanceType: t2.micro
ImageId: ami-a1b23456
NetworkInterfaces:
AssociatePublicIpAddress: 'true'
DeviceIndex: '0'
DeleteOnTermination: 'true'
SubnetId: Fn::ImportValue: 'private-vpc-subnet-a'