1
2

CloudFormationの!Ref と!GetAtt

Last updated at Posted at 2024-08-03

この記事の対象者

CloudFormationを使い始めたばかりの初心者

!Refとは?

!Refは、CloudFormationテンプレート内で他のリソースやパラメータを参照するための関数

!Refの主な用途と特徴

  1. パラメータの値を参照する

    • パラメータ値の参照には常に!Refを使用
  2. リソースの基本的な情報を取得する

    • リソース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 の戻り値の詳細については、「リソースとプロパティのリファレンス」でそのリソースのドキュメントを参照してください。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2