AWS CloudFormationでは、テンプレートを柔軟にするためにさまざまな「組み込み関数(Intrinsic Functions)」が用意されています。その中でも、スタック間で値を共有したいときに便利なのが「!ImportValue(ImportValue関数)」です。
この記事では、「!ImportValue(ImportValue関数)」の仕組み・構文・使い方をサンプルコードを用いてわかりやすく解説します。
!ImportValueとは?(ImportValue関数)
!ImportValueは、別のCloudFormationスタックで「エクスポート(Export)」された値をインポートして利用するための関数です。
たとえば次のようなケースで役立ちます。
- リソース(例:VPC、サブネットなど)や設定値(セキュリティグループID、バケット名など)を別のスタックでも再利用したい
- 大規模な構成を、VPCスタック・EC2スタックなどに分割して管理したい
!ImportValueの基本構文は以下のようになっています。
基本構文
!ImportValue sharedValueToImport引数の意味は以下の通りです。
| 引数 | 説明 |
|---|---|
sharedValueToImport | 別のスタックでエクスポートされた名前 |
なお、!ImportValue sharedValueToImportは短縮形の構文です。短縮形を使わない場合は、次のように記述します。
Fn::ImportValue: sharedValueToImportExport(エクスポート)の設定方法
!ImportValueを使うためには、別のスタックで値をエクスポートする必要があります。そのために、OutputsセクションでExport名を指定します。例として、VPCスタックでVPC IDをエクスポートするテンプレートを見てみましょう。
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
# 省略
Outputs:
VPCId:
Description: "VPC ID to export"
Value: !Ref MyVPC
Export:
Name: MyVPCIDこの例では、!Ref MyVPCがVPCのIDを返し、Export: Name: MyVPCIDによってMyVPCIDという名前でエクスポートしています。
このMyVPCIDというExport名は、別のスタックから!ImportValueを使って参照可能になります。
Export名は同一リージョン内のAWSアカウントで一意である必要があります。
!ImportValueの使い方
次に、!ImportValueを使ったシンプルなサンプルコードを以下に示します。このサンプルコードでは、別のスタックでエクスポートしたMyVPCIDをインポートしてセキュリティグループを作成しています。
Resources:
SampleSg:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow SSH access
VpcId: !ImportValue MyVPCID!ImportValueを使う側のスタックは、Export側のスタックがすでに作成済みである必要があります。
「!ImportValue」と「!Sub」を組み合わせて使用する
通常、!ImportValueでは固定のExport名を指定します。
VpcId: !ImportValue MyVPCIDこの場合、参照先のExport名(MyVPCID)は常に同じです。しかし、環境(dev / prod など)ごとに異なるリソースを参照したい場合、Export名を動的に切り替えたいことがあります。
そのようなときに使えるのが、!ImportValueと!Subの組み合わせです。以下のように組み合わせて使用します。
VpcId: !ImportValue !Sub "${EnvType}-MyVPCID"たとえば、EnvTypeの値がdevなら以下のように解釈されます。
VpcId: !ImportValue dev-MyVPCID同様に、EnvTypeがprodなら以下のように解釈されます。
VpcId: !ImportValue prod-MyVPCIDなお、このように!Subで環境名を動的に組み込む場合は、Export側のスタックでも同じ命名ルール(${EnvType}-MyVPCID)でExport名を定義しておく必要があります。
Parameters:
EnvType:
Type: String
AllowedValues:
- dev
- prod
Resources:
MyVPC:
Type: AWS::EC2::VPC
Properties:
# 省略
Outputs:
VPCId:
Description: "Export VPC ID"
Value: !Ref MyVPC
Export:
Name: !Sub "${EnvType}-MyVPCID" # ← 同じ命名ルールにすること!!あわせて読みたい
続きを見る!Subについては下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。 
【CloudFormation】!Refと!Subの「違い」と「使い分け」を解説!
「!ImportValue」と「!Ref」の使い分け
!Refと!ImportValueはどちらも値を参照するための関数ですが、参照するスタックが異なります。
| 比較項目 | !Ref | !ImportValue |
|---|---|---|
| 主な用途 | 同じテンプレート内の値を参照 | 別スタックでExportされた値を参照 |
| 参照範囲 | 同一スタック内 | 別スタック(外部) |
| 使用例 | !Ref MyS3Bucket → バケット名を取得 | !ImportValue MySharedBucketName → 別スタックのバケット名を取得 |
| 構文 | !Ref リソースIDまたはパラメータ名 | !ImportValue Export名 |
- 別のテンプレート(別スタック)の値を使う場合 →
!ImportValue - 同じテンプレート(同一スタック)の値を使う場合 →
!Ref
つまり、CloudFormationを単一ファイルで完結させる場合は!Ref、複数スタックで再利用性を高めたい場合は!ImportValueを使うのが基本です。
あわせて読みたい
続きを見る!Refについては下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。 


【CloudFormation】!Refと!Subの「違い」と「使い分け」を解説!
本記事のまとめ
この記事ではCloudFormationの!ImportValueについて、以下の内容を説明しました。
!ImportValueは別スタックでExportされた値を参照する関数Export名を指定して値を共有できる!Subと組み合わせることで動的参照も可能
お読みいただきありがとうございました。