CloudFormation の新組み込み関数 Fn::GetStackOutput で依存関係のないクロスリージョン・クロスアカウント参照が可能になりました
CloudFormation に新しい組み込み関数 Fn::GetStackOutput が追加されました。2016年から提供されている Fn::ImportValue では制限があった、クロスリージョン・クロスアカウントのスタック間参照がネイティブに可能になります。
この機能の存在は、AWS CDK の PR #37724(2026年5月1日マージ)で確認しました。
PR の説明文に以下の記載があります。
But CloudFormation has now released a new intrinsic function,
Fn::GetStackOutput, which, as the name suggests, gets the value of a arbitrary output. This function works cross-region and cross-account.
本記事では、実際に動作確認を行い、従来の Fn::ImportValue との違いやユースケースを整理します。
従来のスタック間参照パターンとその限界
CloudFormation でスタック間の値を共有するには、従来いくつかのパターンが使われていました。
本記事では便宜上、値を出力する側のスタックを「Producer」、参照する側を「Consumer」と呼びます。また、Fn::ImportValue のようにスタック間の削除制約を伴う参照を「依存あり」、制約を伴わない参照を「依存なし」と呼びます。
① Fn::ImportValue(依存あり)
2016年9月に導入された、スタック間で値を共有する仕組みです。Producer が Export した値を Consumer が Import します。
制約として、Export 宣言(Export: Name:)が必要であること、同一リージョン・同一アカウント内でしか使えないこと、そして Consumer が参照中は Producer の削除や Export 値の変更ができないことが挙げられます。
② SSM パラメータストア経由(依存なし)
Producer が SSM パラメータに値を書き出し、Consumer が動的参照で読むパターンです。依存関係は発生しませんが、Producer 削除後も SSM パラメータが残り続ける点、クロスリージョンでは使えない点、Producer 側に SSM リソースの追加が必要な点が問題でした。
③ CLI レベルの引数渡し(依存なし)
describe-stacks で値を取得し、--parameter-overrides で Consumer に渡すパターンです。デプロイスクリプトの管理が必要になり、CI/CD パイプラインが複雑になるという問題がありました。
Fn::GetStackOutput とは
スタックの Output を直接参照できる新しい組み込み関数(Intrinsic Function)です。Export 宣言不要で、クロスリージョン・クロスアカウントに対応しています。
完全記法は以下のとおりです。
Fn::GetStackOutput:
StackName: <producer stack name>
OutputName: <output key name>
Region: ap-northeast-1 # 省略可(省略時は同リージョン)
RoleArn: arn:aws:iam::... # 省略可(クロスアカウント時に使用)
YAML ショートハンド記法も使えます(動作確認済み)。
Value: !GetStackOutput
StackName: getstackoutput-producer
OutputName: MyValue
Region: ap-northeast-1
Fn::ImportValue との比較(依存あり vs 依存なし)
| 項目 | Fn::ImportValue(依存あり) | Fn::GetStackOutput(依存なし) |
|---|---|---|
| 同一リージョン・同一アカウント | ✅ | ✅ |
| クロスリージョン(同一アカウント) | ❌ | ✅ |
| クロスアカウント | ❌ | ✅(※本記事では未検証。CDK PR の記述に基づく) |
| Export 宣言が必要 | ✅ 必要 | ❌ 不要(通常の Output でOK) |
| Producer の削除 | ❌ ブロックされる | ✅ 削除できる |
| 参照の整合性保証 | ✅ 参照先が必ず存在する | ⚠️ Producer 削除後は参照が壊れる |
| YAML ショートハンド | ✅ !ImportValue |
✅ !GetStackOutput |
| 公式ドキュメント掲載 | ✅ あり | ❌ 未掲載(2026年5月時点) |
従来の依存なしパターンはいずれも Fn::GetStackOutput で置き換え可能です。
なお、いずれの方式も値の解決はデプロイ時(スタック作成・更新時)です。Producer の値が変わっても Consumer は自動追従しません。Consumer を再デプロイして初めて新しい値が反映されます。
使い分けの指針
Fn::GetStackOutput(依存なし):クロスリージョン・クロスアカウント参照、Producer と Consumer のライフサイクルが独立している場合、スタックの削除・再作成を柔軟にやりたい場合Fn::ImportValue(依存あり):Producer の誤削除を防ぎたい場合(例:VPC スタックの Subnet ID をアプリスタックが参照している場合など)
実際に動かしてみた
| # | パターン | Producer | Consumer | 結果 |
|---|---|---|---|---|
| 1 | クロスリージョン | ap-northeast-1 | us-east-1 | ✅ |
| 2 | 同一リージョン(Region 省略) | ap-northeast-1 | ap-northeast-1 | ✅ |
| 3 | ショートハンド記法 !GetStackOutput |
ap-northeast-1 | us-east-1 | ✅ |
同一リージョンでも動作するため、Export 宣言なし・依存関係なしでスタック間の値を共有したい場合は、クロスリージョンに限らず Fn::ImportValue の代替として有効です。
Producer テンプレート(ap-northeast-1)
AWSTemplateFormatVersion: '2010-09-09'
Resources:
DummyParam:
Type: AWS::SSM::Parameter
Properties:
Name: /getstackoutput-test/dummy
Type: String
Value: hello-from-ap-northeast-1
Outputs:
MyValue:
Value: !GetAtt DummyParam.Value
Consumer テンプレート(us-east-1)
AWSTemplateFormatVersion: '2010-09-09'
Resources:
DummyParam:
Type: AWS::SSM::Parameter
Properties:
Name: /getstackoutput-test/consumed-value
Type: String
Value:
Fn::GetStackOutput:
StackName: getstackoutput-producer
OutputName: MyValue
Region: ap-northeast-1
Outputs:
ConsumedValue:
Value: !GetAtt DummyParam.Value
結果
Consumer スタックの Output を確認します。
OutputKey: ConsumedValue
OutputValue: hello-from-ap-northeast-1 ✅
ap-northeast-1 の Producer の値を、us-east-1 の Consumer から カスタムリソースなしで取得できました。
ハマりポイント:OutputKey ではなく OutputName
CDK のソースコードでは OutputKey と記述されていましたが、実際の CloudFormation が要求するキー名は OutputName です。OutputKey を使うと以下のエラーが発生します。
ValidationError: GetStackOutput: OutputName is required
スタック削除の挙動比較
Consumer が参照中の状態で Producer を削除できるかどうかを実際に確認しました。
Fn::ImportValue(依存あり)の場合
$ aws cloudformation delete-stack --stack-name importvalue-producer
$ aws cloudformation describe-stacks --stack-name importvalue-producer \
--query 'Stacks[0].{StackStatus:StackStatus,StackStatusReason:StackStatusReason}'
{
"StackStatus": "CREATE_COMPLETE",
"StackStatusReason": "Delete canceled. Cannot delete export importvalue-test-MyValue as it is in use by importvalue-consumer."
}
削除リクエストは受け付けられますが、即座にキャンセルされます。スタックは CREATE_COMPLETE のまま残ります。
Fn::GetStackOutput(依存なし)の場合
$ aws cloudformation delete-stack --stack-name getstackoutput-producer
$ aws cloudformation describe-stacks --stack-name getstackoutput-producer
An error occurred (ValidationError): Stack with id getstackoutput-producer does not exist
Consumer が参照中でも Producer を削除できました。
Producer 削除後に Consumer を更新するとどうなるか
Producer 削除後に Consumer のテンプレートを変更して更新すると、UPDATE_FAILED になりロールバックされます。
Stack with id getstackoutput-producer does not exist
(Service: AmazonCloudFormation; Status Code: 400; Error Code: ValidationError)
依存関係がない分、参照の整合性はユーザー側で管理する必要があります。運用上の対策としては、Producer スタックに削除保護(Termination Protection)を設定する、CI/CD パイプラインでスタック間の依存関係を管理し Producer の削除前に Consumer の参照を解除する、といった方法が考えられます。
ユースケース:CloudFront + ACM 証明書
Fn::GetStackOutput のわかりやすい活用例が、CloudFront と ACM 証明書の組み合わせです。
CloudFront で使う SSL 証明書は us-east-1 にしか作成できませんが、アプリケーションスタックは ap-northeast-1 にあるケースが多いです。従来はカスタムリソースや SSM パラメータで証明書 ARN を渡す必要がありました。
ACM 証明書スタック(us-east-1)
AWSTemplateFormatVersion: '2010-09-09'
Resources:
Certificate:
Type: AWS::CertificateManager::Certificate
Properties:
DomainName: app.example.com
ValidationMethod: DNS
DomainValidationOptions:
- DomainName: app.example.com
HostedZoneId: ZXXXXXXXXXXXXX
Outputs:
CertificateArn:
Value: !Ref Certificate
CloudFront スタック(ap-northeast-1)
AWSTemplateFormatVersion: '2010-09-09'
Resources:
Distribution:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
Enabled: true
Aliases:
- app.example.com
ViewerCertificate:
AcmCertificateArn:
Fn::GetStackOutput:
StackName: acm-certificate-stack
OutputName: CertificateArn
Region: us-east-1
SslSupportMethod: sni-only
MinimumProtocolVersion: TLSv1.2_2021
Origins:
- Id: AppOrigin
DomainName: origin.example.com
CustomOriginConfig:
OriginProtocolPolicy: https-only
DefaultCacheBehavior:
TargetOriginId: AppOrigin
ViewerProtocolPolicy: redirect-to-https
CachePolicyId: 658327ea-f89d-4fab-a63d-7e88639e58f6
カスタムリソースも SSM パラメータも不要。テンプレートだけで完結します。実際にこの構成でデプロイし、動作を確認済みです。
その他の有効なユースケース
- WAF WebACL + CloudFront:CloudFront 用の WAF も us-east-1 に作る必要があり、同じ構図です
- マルチリージョン DR 構成:プライマリリージョンの RDS クラスター ARN や KMS キー ARN を DR リージョンから参照
- セキュリティ集約構成:Config / CloudTrail / GuardDuty の集約用 S3 バケット・SNS トピックを各リージョンから参照
- マルチアカウントの共有リソース:ネットワークアカウントの Transit Gateway ID をワークロードアカウントから参照(
RoleArn使用)
CDK での対応
AWS CDK では PR #37724(2026年5月1日マージ)で対応しています。
Fn.getStackOutput() メソッドが追加され、crossRegionReferences: true が非推奨になりました。今後は Fn::GetStackOutput がデフォルトで使われます。
従来の crossRegionReferences: true は、内部的に SSM パラメータと Lambda カスタムリソース2つ(Writer / Reader)を組み合わせることで実現されていました。Fn::GetStackOutput への移行により、Lambda 関数の管理・IAM ロールの追加・デプロイ時間の増加がすべて解消されます。
注意点・制約(2026年5月時点)
- 公式ドキュメント未掲載:AWS 公式の組み込み関数リファレンスにまだ記載がありません
- cfn-lint 未対応:linter がエラーを出す可能性があります
- クロスアカウント未検証:本記事ではクロスアカウント参照は未検証です。CDK PR の記述に基づき対応と記載しています
- IAM 権限:同一アカウント・クロスリージョンでは追加の IAM 設定なしで動作しました。クロスアカウント時は
RoleArnで指定したロールにcloudformation:DescribeStacks権限が必要です - Nested Stack / StackSets との組み合わせ:未検証です
まとめ
Fn::GetStackOutput により、CloudFormation ネイティブでクロスリージョン・クロスアカウントのスタック間参照が可能になりました。Export 宣言不要、カスタムリソース不要、SSM パラメータ不要で、テンプレートがシンプルになります。
ただし Fn::ImportValue と異なり依存関係(削除ガード)がないため、用途に応じた使い分けが重要です。公式ドキュメントへの掲載を待ちつつ、今後の正式リリースに注目していきたいと思います。








