如何解決 CloudFormation 中的 "No Export named XYZ found" 錯誤?

2 分的閱讀內容
0

在 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::ImportValueChildStack01 匯入值。在下列 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::RefFn::GetAtt 來傳回指定參數或資源的值。

驗證匯入堆疊中的匯出名稱

若要驗證匯出值是否正確,請採用下列動作:

  • 確認您的 AWS 帳戶中是否已列出匯出名稱。
  • 將匯出名稱從一個堆疊匯入至另一個堆疊時,請確認您在兩個堆疊中使用的是相同的匯出名稱。
  • 使用 Fn::ImportValue 建立堆疊之前,請參閱驗證匯出和匯入堆疊的堆疊組態區段。

確定匯出值位於與 AWS 區域相同的位置,或與在其中匯入值的帳戶位置相同

您僅能在單一帳戶和區域內使用跨堆疊參考。位於相同帳戶和區域中的其他堆疊只能匯入匯出值。

若要解決此問題,在使用 Fn::ImportValue 建立堆疊之前,請參閱驗證匯出和匯入堆疊的堆疊組態區段。

請確定在堆疊匯入匯出值之前是否已建立或發佈該值

對於非巢狀堆疊,必須先部署匯出值的堆疊。堆疊必須處於 Create_CompleteUpdate_Complete 狀態。

使用 Fn::ImportValue 建立堆疊之前,請參閱驗證匯出和匯入堆疊的堆疊組態區段。

驗證匯出和匯入堆疊的堆疊組態

若要驗證匯出值是否已備妥匯入,請使用 CloudFormation 主控台或 AWS Command Line Interface (AWS CLI)。

**注意:**匯入和匯出堆疊必須位於相同的區域和帳戶中。

若要使用 CloudFormation 主控台,請完成下列步驟:

  1. 開啟 CloudFormation 主控台
  2. 從導覽窗格中,選擇匯出
  3. 確認是否已列出堆疊的匯出值。

若要使用 AWS CLI,請完成下列步驟:

  1. 若要列出可用的匯出,請執行下列 list-exports 命令:

    aws cloudformation list-exports --region us-east-1

    **注意:**將 us-east-1 取代為您的區域。

  2. 在輸出中,確認匯出中的名稱值是否與 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'
AWS 官方
AWS 官方已更新 1 個月前