View a markdown version of this page

從部署的 CloudFormation 堆疊取得匯出的輸出 - AWS CloudFormation

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

從部署的 CloudFormation 堆疊取得匯出的輸出

當您在相同 AWS 帳戶 和 區域中有多個堆疊時,您可能想要在它們之間共用資訊。當一個堆疊需要使用另一個堆疊建立的資源時,這項功能相當實用。

例如,您可能有一個堆疊專門為 Web 伺服器建立網路資源,如子網路和安全群組。而建立實際 Web 伺服器的其他堆疊,就能使用第一個堆疊建立的網路資源。您不必在堆疊範本中硬式編碼資源 ID,也不需要以輸入參數形式傳遞 ID。

若要在堆疊之間共用資訊,可從一個堆疊匯出輸出值,再將其匯入另一個堆疊。以下是其運作方式:

  1. 在第一個堆疊的範本 (例如,聯網堆疊) 中,可使用 Outputs 區段的 Export 欄位來定義匯出的特定值。如需詳細資訊,請參閱CloudFormation 範本 Outputs 語法

  2. 當您建立或更新該堆疊時,CloudFormation 會匯出輸出值,使其可供相同 AWS 帳戶 和 區域中的其他堆疊使用。

  3. 在另一個堆疊的範本中,您可以使用 Fn::ImportValue 函數從第一個堆疊匯入匯出的值。

  4. 建立或更新第二個堆疊 (例如 Web 伺服器堆疊) 時,CloudFormation 會自動從第一個堆疊擷取已匯出的值並套用。

如需演練和範例範本,請參閱參考在另一個 CloudFormation 堆疊中的資源輸出

匯出堆疊輸出值與使用巢狀堆疊的比較

巢狀堆疊是指藉由使用 AWS::CloudFormation::Stack 資源在另一個堆疊中建立的堆疊。使用巢狀堆疊時,您可以透過單一堆疊來部署和管理所有資源。您可以將巢狀堆疊群組中某個堆疊的輸出,作為群組中其他堆疊的輸入。這與匯出值的情況不同。

如果您想要將資訊的共享隔離在巢狀堆疊群組內,則建議您使用巢狀堆疊。若要與其他堆疊 (而不只是在巢狀堆疊的群組內) 共享資訊,則匯出值。例如,您可以建立含子網路的單一堆疊,然後匯出其 ID。其他堆疊可透過匯入該 ID 來使用該子網路。每個堆疊無需單獨建立子網路。只要有堆疊匯入子網路 ID,您就無法變更或刪除該 ID。

如需巢狀堆疊的詳細資訊,請參閱 運用巢狀堆疊,將範本分割成可重複使用的部分

考量事項

下列限制適用於跨堆疊參考:

  • 對於每個名稱 AWS 帳戶,Export名稱在區域中必須是唯一的。

  • 使用 Export和 時Fn::ImportValue,跨堆疊參考僅限於相同的帳戶和區域。若要跨帳戶或區域參考堆疊輸出,請使用 Fn::GetStackOutput

  • 對於輸出,ExportName 屬性值無法使用依賴某個資源的 Ref 或者 GetAtt 函數。

    同樣,ImportValue 函數不能包含依賴某個資源的 RefGetAtt 函數。

  • 當其他堆疊匯入輸出值之後,您就無法刪除匯出輸出值的堆疊,也無法修改匯出的輸出值。您必須先移除所有匯入,之後才可以刪除匯出堆疊或修改輸出值。

列出已匯出的輸出值

若需檢視堆疊已匯出的輸出值,可使用下列其中一種方法:

列出已匯出的輸出值 (主控台)
  1. 在 https://https://console.aws.amazon.com/cloudformation 開啟 CloudFormation 主控台。

  2. 在畫面上方的導覽列上,選擇 AWS 區域。

  3. 在左側導覽窗格中,選擇匯出

列出已匯出的輸出值 (AWS CLI)

使用下列 list-exports 命令。將 us-east-1 取代為您的 AWS 區域。

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

以下為範例輸出。

{ "Exports": [ { "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800", "Name": "private-vpc-subnet-a", "Value": "subnet-07b410xmplddcfa03" }, { "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800", "Name": "private-vpc-subnet-b", "Value": "subnet-075ed3xmplebd2fb1" }, { "ExportingStackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/private-vpc/99764070-b56c-xmpl-bee8-062a88d1d800", "Name": "private-vpc-vpcid", "Value": "vpc-011d7xmpl100e9841" } ] }

CloudFormation 會針對目前匯出的區域和堆疊,顯示已匯出的輸出名稱和值。若要使用其他堆疊範本中的已匯出輸出值,請使用匯出名稱和 Fn::ImportValue 函數進行參考。

列出匯入匯出的輸出值的堆疊

若要刪除或變更匯出的輸出值,必須先找出哪些堆疊正在匯入輸出值。

若需檢視匯入已匯出輸出值的堆疊,可使用下列其中一種方法:

列出匯入匯出的輸出值的堆疊 (主控台)
  1. 在 https://https://console.aws.amazon.com/cloudformation 開啟 CloudFormation 主控台。

  2. 在左側導覽窗格中,選擇匯出

  3. 若要查看匯入指定匯出值的堆疊,請選擇該匯出值的 Export Name (匯出名稱)。CloudFormation 會顯示匯出詳細資訊頁面,列出匯入該值的所有堆疊。

列出匯入匯出的輸出值的堆疊 (AWS CLI)

使用 list-imports 命令。將 us-east-1 取代為您的 AWS 區域 ,並將 private-vpc-vpcid取代為匯出輸出值的名稱。

aws cloudformation list-imports --region us-east-1 \ --export-name private-vpc-vpcid

CloudFormation 傳回匯入該值的堆疊清單。

{ "Imports": [ "my-app-stack" ] }

確認哪些堆疊正在匯入特定已匯出值後,您需要修改這些堆疊,移除參考該輸出值的 Fn::ImportValue 函數。您必須移除所有參考匯出的輸出值的匯入,才能刪除或修改匯出的輸出值。

在沒有匯出的情況下參考輸出

除了使用 ExportFn::ImportValue進行跨堆疊參考之外,您還可以使用 Fn::GetStackOutput 直接參考堆疊輸出。此方法不需要參考的堆疊宣告匯出,並支援跨帳戶和跨區域參考。

下表比較兩種方法:

匯出與 Fn::ImportValue 和 Fn::GetStackOutput 的比較
功能 匯出 + Fn::ImportValue Fn::GetStackOutput
相同帳戶、相同區域 支援 支援
跨帳戶 不支援 支援
跨區域 不支援 支援
需要明確匯出
參考類型 強 (封鎖匯出堆疊的刪除) 弱點 (在部署時間解決)
參考完整性 強制執行 未強制執行

何時使用每種方法:

  • 當您需要強大的參考完整性Fn::ImportValue時,請使用 Export和 。透過此方法,CloudFormation 可防止您刪除匯出其他堆疊耗用之值的堆疊,保護您免於意外中斷相依性。

  • Fn::GetStackOutput 當您需要跨帳戶或區域參考輸出,或不想管理明確匯出時,請使用 。請注意, Fn::GetStackOutput會建立弱參考。如果刪除參考的堆疊或輸出,則不會通知耗用堆疊,而重新解決參考的後續操作將會失敗。

如需詳細資訊,請參閱《 CloudFormation 範本參考指南》中的 Fn::GetStackOutput