【CloudFormation】!GetAttの使い方をわかりやすく解説!

AWS CloudFormationでは、テンプレートを柔軟にするためにさまざまな「組み込み関数(Intrinsic Functions)」が用意されています。その中でも、リソースの属性値(ARN・DNS名・セキュリティグループIDなど)を取得したいときに便利なのが「!GetAtt(GetAtt関数)」です。

この記事では、「!GetAtt(GetAtt関数)」の仕組み・構文・使い方をサンプルコードを用いてわかりやすく解説します。

!GetAttとは?(GetAtt関数)

!GetAttは、テンプレート内で定義したリソースの属性(Attribute)を取得する関数です。「作成されたリソースの特定情報を他のリソースで使いたいとき」に利用します。

たとえば次のようなケースで役立ちます。

  • S3バケットのARNを取得したい
  • IAMロールのARNを参照したい
  • EC2インスタンスのDNS名を参照したい

!GetAttの基本構文は以下のようになっています。

基本構文

!GetAtt logicalNameOfResource.attributeName

引数の意味は以下の通りです。

引数説明
logicalNameOfResourceテンプレート内で定義したリソースの論理名(論理 ID)
(例:この記事ではMyS3BucketMyEC2Instance
attributeName取得したいリソース固有の属性の名前
(例:ArnPublicDnsNameなど)

なお、!GetAtt logicalNameOfResource.attributeNameは短縮形の構文です。短縮形を使わない場合は、次のように記述します。

Fn::GetAtt: [ logicalNameOfResource, attributeName ]

!GetAttの使い方

次に、!GetAttを使ったシンプルなサンプルコードを見てみましょう。

Resources:
  MyS3Bucket:
    Type: AWS::S3::Bucket

  MyS3BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref MyS3Bucket
      PolicyDocument:
        Statement:
          - Effect: Allow
            Principal: "*"
            Action: s3:GetBucketLocation
            Resource: !GetAtt MyS3Bucket.Arn

MyS3Bucketという論理IDでS3バケットを定義しており、!GetAttMyS3BucketのARNを取得しています。

また、以下のサンプルコードでは、MyEC2Instanceという論理IDでEC2インスタンスを定義しており、!GetAttMyEC2InstancePublicDnsNameを取得し、出力(Outputs)で表示しています。

Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0123456789abcdef0
      InstanceType: t2.micro

Outputs:
  InstancePublicDNS:
    Description: EC2のパブリックDNS名
    Value: !GetAtt MyEC2Instance.PublicDnsName

スタックを作成した後、CloudFormationコンソールのOutputsタブに以下のような値が出力されます。

ec2-11-22-33-44.ap-northeast-1.compute.amazonaws.com

「!GetAtt」と「!Ref」の違い

!Refもリソースを参照する関数ですが、!Refリソースの物理ID(例:バケット名、インスタンスIDなど)を返します。一方、!GetAttはそれ以外の属性(ARNやDNS名など)を取得できます。

比較項目!Ref!GetAtt
主な用途リソースの物理IDを取得リソースの属性値を取得
戻り値物理IDに対応する値
(例:バケット名、インスタンスIDなど)
ARN、DNS名、IPアドレス、エンドポイントなど
使用例!Ref MyS3Bucket → バケット名!GetAtt MyS3Bucket.Arn → バケットのARN

あわせて読みたい

!Refについては下記の記事で詳しく説明しています。興味のある方は下記のリンクからぜひチェックをしてみてください。

本記事のまとめ

この記事ではCloudFormationの!GetAttについて、以下の内容を説明しました。

  • !GetAttはリソースの属性値(ARN・DNS名・VPC IDなど)を取得する関数
  • !Refが返すのは「物理ID」、!GetAttは「属性情報」を返す
  • 他のリソースやOutputsセクションで動的に値を利用できる

お読みいただきありがとうございました。

スポンサーリンク