はじめに
CloudFormationテンプレートを書く際に組込関数を使用することでテンプレートをより柔軟かつ再現性を高くしてくれて構成管理を効率化できます。
実際にテンプレートで値を参照する際によく使用するRefとSubの違いについてまとめてみました。
RefとSubについて
!Ref
- !Refは、指定したリソースやパラメータの値を参照するために使用
主な用途
リソースの物理IDを取得:
例: AWS::EC2::InstanceではインスタンスIDを返す
例: AWS::S3::Bucketではバケット名を返す
パラメータの値を取得:
テンプレート内で定義したパラメータの値を取得
使用例
Parameters:
MyBucketName:
Type: String
Default: "example-bucket"
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Ref MyBucketName
- 上記の例ではMyBucketNameの値を!Refを使用して参照している
!Sub
- !Subは、文字列をテンプレート化し、リソースの値やパラメータを埋め込むために使用
主な用途
文字列の組み立て:
プレースホルダーを使って、値を埋め込んだ文字列を生成
リソースやパラメータの値の埋め込み:
${}形式でプレースホルダーを定義し、動的に値を挿入
使用例
Resources:
S3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "my-bucket-${AWS::Region}-${AWS::AccountId}"
- 上の例ではリージョンとアカウントIDを含むバケット名を返しています
違いのまとめ
特徴 | !Ref | !Sub |
---|---|---|
基本用途 | 単純な値の参照 | 動的な文字列の生成 |
戻り値 | 物理IDやパラメータの値 | プレースホルダーを埋め込んだ文字列 |
文字列の操作 | 不可 | ${}形式で埋め込み可能 |
使用シンプルさ | 簡単 | 若干複雑 |
動的生成の柔軟性 | 制限あり | 柔軟 |
最後に
単純にパラメータやリソースを参照したいときは!Ref、値を埋め込んで複雑な文字列を作りたいときは!Subというように状況に応じて使い分けるのがよさそう