この記事の対象者
CloudFormationを使い始めたばかりの初心者
!Refとは?
!Refは、CloudFormationテンプレート内で他のリソースやパラメータを参照するための関数
!Refの主な用途と特徴
-
パラメータの値を参照する
- パラメータ値の参照には常に!Refを使用
-
リソースの基本的な情報を取得する
- リソースID
- リソース名
- 一部のリソースの基本的な属性(例:EC2インスタンスIDなど)
ポイント
- !Refは、パラメータとリソースの両方に対して使用できる
- リソースに対して使用した場合、通常はそのリソースを一意に識別する値(多くの場合、IDや名前)を返す
- パラメータに対して使用した場合、そのパラメータに設定された値を返す
!GetAttとは?
!GetAttは、CloudFormationテンプレート内で特定のリソースの属性値を取得するための関数
!GetAttの主な用途と特徴
- リソースの詳細な情報(IPアドレス、ARN、エンドポイントなど)を取得する
- より詳細なリソース属性(例:EC2インスタンスのプライベートIP、パブリックIP、DNS名など)を取得する
使用形式
形式:!GetAtt 論理ID.属性名
例:!GetAtt MyEC2Instance.PrivateIp
ポイント
- !GetAttはパラメータには使用できません。リソースにのみ使用可能
- 使用する際は、参照したいリソースの論理IDと、取得したい特定の属性名を指定する必要がある
使用例
1. !Refと!GetAttの組み合わせ使用
!Ref
を使ってElastic IPをEC2インスタンスに関連付け、!GetAtt
を使ってElastic IPのパブリックIPアドレスを取得する例:
Resources:
MyEC2Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: ami-0c55b159cbfafe1f0
MyEIP:
Type: AWS::EC2::EIP
Properties:
InstanceId: !Ref MyEC2Instance
Outputs:
InstanceId:
Description: The ID of the EC2 instance
Value: !Ref MyEC2Instance
PublicIP:
Description: The public IP address of the EC2 instance
Value: !GetAtt MyEIP.PublicIp
2.EC2インスタンスのプライベートIPを取得
MyEC2Instanceが論理ID、PrivateIpが属性名の例:
Resources:
MyEC2Instance: # 論理ID
Type: AWS::EC2::Instance
Properties:
InstanceType: t2.micro
ImageId: ami-xxxxxxxxxxxx
Outputs:
PrivateIP:
Description: Private IP of the EC2 instance
Value: !GetAtt MyEC2Instance.PrivateIp
3.RDSインスタンスのエンドポイントを取得
MyDBInstance
が論理ID、Endpoint.Address
が属性名の例:
Resources:
MyDBInstance: # 論理ID
Type: AWS::RDS::DBInstance
Properties:
Engine: mysql
MasterUsername: admin
MasterUserPassword: password123
DBInstanceClass: db.t3.micro
Outputs:
DBEndpoint:
Description: Endpoint of the RDS instance
Value: !GetAtt MyDBInstance.Endpoint.Address
まとめ
!Refは主にパラメータの値やリソースの基本的な情報を取得するのに使います。
!GetAttはリソースのより詳細な属性情報を取得するのに使います.
参考
!Refのドキュメントでは下記の通りになっています。
組み込み関数 Ref は、指定したパラメータまたはリソースの値を返します。AWS::LanguageExtensions 変換 変換を使用するとき、組み込み関数を Ref と Fn::GetAtt のパラメーターとして使用できます。
パラメータの論理名を指定すると、それはパラメータの値を返します。
リソースの論理名を指定すると、それはそのリソースを参照するために通常使用できる値を返します (物理 ID)。
組み込み関数を指定すると、その関数の出力を返します。
テンプレートでリソースを宣言するときに別のテンプレートリソースを名前で指定する必要がある場合は、Ref を使用して別のリソースを参照できます。一般的に、Ref はリソースの名前を返します。たとえば、AWS::AutoScaling::AutoScalingGroup の参照は、Auto Scaling グループリソースの名前を返します。
一部のリソースでは、リソースのコンテキストにおいて別の重要な意味を持つ識別子が返されます。たとえば、AWS::EC2::EIP リソースは IP アドレスを返し、AWS::EC2::Instance はインスタンス ID を返します。
!GetAttのドキュメントでは下記の通りになっています。
Fn::GetAtt 組み込み関数は、テンプレートのリソースから属性の値を返します。AWS::LanguageExtensions 変換 変換を使用するとき、組み込み関数を Fn::GetAtt のパラメーターとして使用できます。特定のリソースに対する GetAtt の戻り値の詳細については、「リソースとプロパティのリファレンス」でそのリソースのドキュメントを参照してください。