CloudFormationを書き始めると、必ずと言っていいほど登場するのが !Ref という記述です。なんとなくコピペで使えてしまうものの、「結局これは何をしているの?」と疑問に思ったことはありませんか?
この記事では、CloudFormationの Ref 関数について、図解感覚でわかりやすく解説していきます。
Refとは?一言でいうと
Ref は「他のリソースやパラメータの値を参照する」ための組み込み関数です。
たとえるなら、リソース同士をつなぐ「接着剤」のような存在。CloudFormationテンプレート内で「あれの値をここに入れてね」とAWSに伝える役割を担っています。
なぜRefが必要なのか
CloudFormationでインフラを構築するとき、リソース同士はお互いを知らないと連携できません。
たとえば「EC2インスタンスを、今作ったVPCの中に配置したい」というケースを考えてみてください。EC2を作るにはVPCのIDが必要ですが、VPCのIDはテンプレートを実行してみるまで決まりません。
そこで Ref を使い、「あとで自動で決まるVPCのID」をテンプレート上で指定しておく、というわけです。
基本の書き方
書き方は2種類あり、どちらを使ってもOKです。
# 短縮形(よく使われる)
VpcId: !Ref MyVPC
# 完全形
VpcId:
Ref: MyVPC実際のテンプレートでは、シンプルで読みやすい短縮形 !Ref がよく使われます。
具体例:VPCとサブネットをつなげる
言葉だけだとイメージしづらいので、実例を見てみましょう。VPCを作り、その中にサブネットを配置するテンプレートです。
Resources:
MyVPC: # MyVPCは、自分で自由につけられる名前
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
MySubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref MyVPC # ← ここがポイント!
CidrBlock: 10.0.1.0/24
!Ref MyVPC の部分は、デプロイ時に自動で vpc-0a1b2c3d4e5f のような実際のVPC IDに置き換わります。これにより、サブネットが正しくMyVPCの中に作られるという仕組みです。
なお、このMyVPCは、自分で自由につけられる名前です。
【要注意】Refが返す値はリソースによって違う
ここが初心者がもっともつまずきやすいポイントです。
Ref が返す値は、リソースの種類ごとにあらかじめ決まっています。 必ずしも「ID」が返ってくるとは限りません。
| リソースの種類 | Refが返す値 |
|---|---|
AWS::EC2::VPC | VPC ID(例:vpc-1234abcd) |
AWS::EC2::Instance | インスタンスID(例:i-1234abcd) |
AWS::S3::Bucket | バケット名 |
AWS::IAM::Role | ロール名 |
AWS::SNS::Topic | トピックのARN |
「IDが欲しいのに名前が返ってきた!」とならないように、使う前にAWSの公式ドキュメントで何が返るかを確認するクセをつけておくと安心です。
パラメータの参照にも使える
Ref はリソースだけでなく、テンプレートの冒頭で定義した パラメータ(ユーザー入力値) の参照にも使えます。
Parameters:
InstanceType:
Type: String
Default: t2.micro
Resources:
MyEC2:
Type: AWS::EC2::Instance
Properties:
InstanceType: !Ref InstanceType # ← パラメータの値を参照
ImageId: ami-12345678
これにより、テンプレートを使い回しつつ、デプロイ時にインスタンスタイプを切り替えるといった柔軟な運用が可能になります
と区別しておくとスッキリ整理できます。
まとめ
Refについて、今回のポイントを整理します。
Refは他のリソースやパラメータの値を引っ張ってくる関数- リソース同士をつなぐ「接着剤」の役割を果たす
- 返ってくる値はリソースの種類ごとに決まっている(IDとは限らない)