Ref関数・Sub関数・GetAtt関数の違いを理解する
まず、Ref関数・Sub関数・GetAtt関数の違いを覚えます。
次にRef関数はそのリソースのキーっぽいものを返す故にリソースから他のリソースが読めることと、
Sub関数は文字列結合に使えることを意識する。
Ref・Sub関数を使うと、パラメータやリソースを変数のように参照できます。
作ったリソースから、インスタンスIDとかではなく特定の属性値を参照する場合は、
GetAtt関数を使います。
Ref関数・Sub関数・GetAtt関数
※ パラメータは別ファイルの JSON 形式で定義し、その他の基本設定は YAML を軸に記述しています。
これにより、パラメータの値を変更する際には JSON ファイルを更新するだけで済み、YAML の可読性やメンテナンス性も確保できます。
!Ref
パラメーターから取るときは、そのまま値をとる
同ファイルのParameters:
,そしてparameters.jsonファイルを作りParameters
のValueを設定する事(戻り値)で、下記のように変数として使用する事ができる。
Parameters:
SystemName:
Type: String
{
"Parameters": [
{
"ParameterKey": "SystemName",
"ParameterValue": "First"
}
]
}
Parameters
を変数として使用する
Tags:
- Key: SystemName
Value: !Ref SystemName
- これでTagのValueに
First
が入る
!Sub
-
Parameters
を結合して使いたいときに使用する
Parameters:
SystemName:
Type: String
EnvType:
Type: String
{
"Parameters": [
{
"ParameterKey": "SystemName",
"ParameterValue": "First"
},
{
"ParameterKey": "EnvType",
"ParameterValue": "dev"
}
]
}
Tags:
- Key: Name
Value: !Sub
- ${SystemName}-${EnvType}-ec2-bastion
- {SystemName: !Ref SystemName, EnvType: !Ref EnvType}
- または -
Tags:
- Key: Name
Value: !Sub ${SystemName}-${EnvType}-ec2-bastion
- これでTagのValueに
First-dev-ec2-bation
が入る
!GetAtt
!Refと!GetAttの違い
!Ref VPC などリソース名 => IDが返される
GetAttは○○の中の○○
!GetAtt VPC ⇒ ×
!GetAtt VPC.CiderBlock ⇒ ◎
!Ref VPC = GetAtt VPC.VpcId
-
!Ref
はリソースの ID などの基本的な情報を取得するのに使います。 -
!GetAtt
はリソースの特定の属性を取得するために使用し、柔軟にプロパティにアクセスできるため、構成の詳細な指定が必要な場合に便利です。
※GetAtt関数で取れる属性の種類は、リソースの種類によって変わります。
例えば先述のDynamoDBテーブルですが、
!GetAtt DynamoDBTable.TableName
とかできそうですがこれはできません。
テーブル名はRef関数で取るのが正解です。
Ref関数で何が返り、GetAttで何が取れるかは各リソースのタイプの公式ページをみなくてはわかりません。