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) (例:この記事では MyS3Bucket、MyEC2Instance) |
attributeName | 取得したいリソース固有の属性の名前 (例: Arn、PublicDnsNameなど) |
なお、!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.ArnMyS3Bucketという論理IDでS3バケットを定義しており、!GetAttでMyS3BucketのARNを取得しています。
また、以下のサンプルコードでは、MyEC2Instanceという論理IDでEC2インスタンスを定義しており、!GetAttでMyEC2InstanceのPublicDnsNameを取得し、出力(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】!Refと!Subの「違い」と「使い分け」を解説!
本記事のまとめ
この記事ではCloudFormationの!GetAttについて、以下の内容を説明しました。
!GetAttはリソースの属性値(ARN・DNS名・VPC IDなど)を取得する関数!Refが返すのは「物理ID」、!GetAttは「属性情報」を返す- 他のリソースやOutputsセクションで動的に値を利用できる
お読みいただきありがとうございました。