【CloudFormation】!ImportValueの使い方をわかりやすく解説!

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: sharedValueToImport

Export(エクスポート)の設定方法

!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

同様に、EnvTypeprodなら以下のように解釈されます。

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については下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。

「!ImportValue」と「!Ref」の使い分け

!Ref!ImportValueはどちらも値を参照するための関数ですが、参照するスタックが異なります。

比較項目!Ref!ImportValue
主な用途同じテンプレート内の値を参照別スタックでExportされた値を参照
参照範囲同一スタック内別スタック(外部)
使用例!Ref MyS3Bucket → バケット名を取得!ImportValue MySharedBucketName → 別スタックのバケット名を取得
構文!Ref リソースIDまたはパラメータ名!ImportValue Export名
  • 別のテンプレート(別スタック)の値を使う場合 → !ImportValue
  • 同じテンプレート(同一スタック)の値を使う場合 → !Ref

つまり、CloudFormationを単一ファイルで完結させる場合は!Ref、複数スタックで再利用性を高めたい場合は!ImportValueを使うのが基本です。

あわせて読みたい

!Refについては下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。

本記事のまとめ

この記事ではCloudFormationの!ImportValueについて、以下の内容を説明しました。

  • !ImportValueは別スタックでExportされた値を参照する関数
  • Export名を指定して値を共有できる
  • !Subと組み合わせることで動的参照も可能

お読みいただきありがとうございました。

スポンサーリンク