CloudFormation テンプレートの Resources セクション構文リファレンス
Resources
セクションは、CloudFormation テンプレートで必須の最上位セクションです。CloudFormation にスタックの一部としてプロビジョニングおよび設定させる AWS リソースを宣言します。
構文
Resources
セクションでは、次の構文を使用します。
JSON
"Resources" : { "
LogicalResourceName1
" : { "Type" : "AWS::ServiceName::ResourceType
", "Properties" : {"PropertyName1" : "PropertyValue1"
,...
} }, "LogicalResourceName2
" : { "Type" : "AWS::ServiceName::ResourceType
", "Properties" : {"PropertyName1" : "PropertyValue1"
,...
} } }
YAML
Resources:
LogicalResourceName1
: Type: AWS::ServiceName::ResourceType
Properties:PropertyName1: PropertyValue1
...
LogicalResourceName2
: Type: AWS::ServiceName::ResourceType
Properties:PropertyName1: PropertyValue1
...
論理 ID (論理名とも呼ばれます)
CloudFormation テンプレート内では、リソースは論理リソース名によって識別されます。これら名前は英数字 (A~Z、a~z、0~9) でなければならず、テンプレート内で一意である必要があります。論理名は、テンプレートの他のセクションのリソースを参照するために使用されます。
リソースタイプ
リソースには、AWS リソースの種類を定義する Type
属性が必要です。Type
属性の形式は AWS::
です。例えば、Amazon S3 バケットの ServiceName
::ResourceType
Type
属性は AWS::S3::Bucket
です。
サポートされているリソースタイプの詳細な一覧については、「AWS リソースおよびプロパティタイプのリファレンス」を参照してください。
リソースプロパティ
リソースプロパティは、特定のリソースタイプの設定の詳細を定義するために指定できる追加オプションです。一部のプロパティは必須で、他のプロパティはオプションです。デフォルト値が設定されたプロパティもあり、そうしたプロパティを指定するのは任意です。
各リソースタイプのためにサポートされているプロパティの詳細については、「AWS リソースおよびプロパティタイプのリファレンス」のトピックを参照してください。
プロパティの値には、リテラル文字列、文字列のリスト、ブール値、動的参照、パラメータ参照、疑似参照、または関数によって返される値を使用できます。次の例は、異なるプロパティ値の型を宣言する方法を示しています。
JSON
"Properties" : { "
String
" : "A string value
", "Number
" :123
, "LiteralList
" : [ "first-value
", "second-value
" ], "Boolean
" :true
}
YAML
Properties:
String
:A string value
Number
:123
LiteralList
: -first-value
-second-value
Boolean
:true
物理 ID
特定のリソースは、論理 ID の他に物理 ID も持っています。これは、そのリソースに実際に割り当てられている名前です (EC2 インスタンス ID、S3 バケット名など)。CloudFormation テンプレートに記載していないリソースを識別するには物理 ID を使用しますが、リソースの作成後にのみ使用できます。たとえば、EC2 インスタンスリソースに MyEC2Instance
の論理 ID を指定します。CloudFormation は、インスタンスを作成すると、自動的に物理 ID (i-1234567890abcdef0
) を生成してインスタンスに割り当てます。この物理 ID を使用して、Amazon EC2 コンソールでインスタンスを特定したり、そのプロパティ (DNS 名など) を表示したりすることができます。
Amazon S3 バケットをはじめとする各種リソースに明示的に物理名を指定していない場合は、CloudFormation が一意の物理名を自動的に生成します。CloudFormation スタックの名前、CloudFormation テンプレートに指定されているリソースの論理名、一意の ID を組み合わせた物理名です。例えば、MyStack
というスタックに論理名が MyBucket
の Amazon S3 バケットがある場合、そのバケットに物理名 MyStack-MyBucket-abcdefghijk1
を含む名前を付けます。
カスタム名をサポートしているリソースの場合は、リソースを迅速に識別するために、独自の物理名を割り当てることができます。たとえば、ログを保存する S3 バケットに MyPerformanceLogs
という名前を指定できます。詳細については、「Name タイプ」を参照してください。
リソースの参照
あるリソースのプロパティを設定する際に、別のリソースの名前やプロパティに基づいて設定しなければならないことがよくあります。例えば、EC2 セキュリティグループを使用する EC2 インスタンス、または S3 バケットを利用する CloudFront ディストリビューションを作成できます。これらのリソースはすべて、同じ CloudFormation テンプレートで作成できます。
CloudFormation には、他のリソースとそのプロパティを参照するための組み込み関数が用意されています。こうした組み込み関数を使用すると、リソース間に依存関係を確立し、リソース間で値を渡すことができます。
Ref
関数
同じ CloudFormation テンプレート内に定義されたリソースを識別できるプロパティを取得するには、Ref
関数を一般的に使用します。返される内容は、リソースのタイプによって異なります。ほとんどのリソースの場合、リソースの物理名が返されます。ただし、リソースタイプによっては、AWS::EC2::EIP
リソースの IP アドレスや Amazon SNS トピックの Amazon リソースネーム (ARN) といった別の値が返されることもあります。
次の例では、プロパティで Ref
関数を使用する方法を示します。これらの各例では、Ref
関数はテンプレートの他の場所で宣言された LogicalResourceName
リソースの実際の名前を返します。YAML 例の !Ref
構文例は、Ref
関数をより短く記述する方法です。
JSON
"Properties" : { "
PropertyName
" : { "Ref" : "LogicalResourceName
" } }
YAML
Properties:
PropertyName1
: Ref:LogicalResourceName
PropertyName2
: !RefLogicalResourceName
Ref
関数の詳細については、Ref 関数を参照してください。
Fn::GetAtt
関数
Ref
関数は、リソースに対して返されるパラメータまたは値が目的の値そのものである場合に役立ちます。ただし、リソースの他の属性が必要になる場合もあります。たとえば、S3 オリジンを含む CloudFront ディストリビューションを作成するには、DNS 形式のアドレスを使用してバケットの場所を指定する必要があります。いくつかのリソースには、その値をテンプレートで使用できる追加の属性があります。にこれらの属性を取得するには、Fn::GetAtt
関数を使用します。
次の例では、プロパティで GetAtt
関数を使用する方法を示します。Fn::GetAtt
関数は、2 つのパラメーターを受け取ります。1 つはリソースの論理名、もう 1 つは取得する属性の名前です。YAML 例の !GetAtt
構文例は、GetAtt
関数をより短く記述する方法です。
JSON
"Properties" : { "
PropertyName
" : { "Fn::GetAtt" : [ "LogicalResourceName
", "AttributeName
" ] } }
YAML
Properties:
PropertyName1
: Fn::GetAtt: -LogicalResourceName
-AttributeName
PropertyName2
: !GetAttLogicalResourceName
.AttributeName
GetAtt
関数の詳細については、「Fn::GetAtt」を参照してください。
例
次の例は、リソースを宣言する方法と、CloudFormation テンプレートが同じテンプレートと既存の AWS リソース内で定義された他のリソースを参照する方法を示しています。
カスタム名で単一のリソースを宣言する
次の例では、論理名 MyBucket
を持つタイプ AWS::S3::Bucket
の単一のリソースを宣言します。BucketName
プロパティは amzn-s3-demo-bucket
に設定されます。これは、S3 バケットに必要な名前に置き換える必要があります。
このリソース宣言を使用してスタックを作成すると、CloudFormation がデフォルト設定の Amazon S3 バケットを作成します。Amazon EC2 インスタンス や Auto Scaling グループのようなその他のリソースの場合、CloudFormation はさらに多くの情報を必要とします。
JSON
{ "Resources": { "MyBucket": { "Type": "AWS::S3::Bucket", "Properties": { "BucketName": "
amzn-s3-demo-bucket
" } } } }
YAML
Resources: MyBucket: Type: 'AWS::S3::Bucket' Properties: BucketName:
amzn-s3-demo-bucket
Ref
関数を使用した他のリソースの参照
次の例は、EC2 インスタンスとセキュリティグループを定義するリソース宣言を示しています。Ec2Instance
リソースは、Ref
関数を使用して、SecurityGroupIds
プロパティの一部として InstanceSecurityGroup
リソースを参照します。また、テンプレートで宣言されていない既存のセキュリティグループ (sg-12a4c434
) も含まれます。既存の AWS リソースを参照するには、リテラル文字列を使用します。
JSON
{ "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroupIds": [ { "Ref": "InstanceSecurityGroup" }, "sg-12a4c434" ], "KeyName": "MyKey", "ImageId": "ami-1234567890abcdef0" } }, "InstanceSecurityGroup": { "Type": "AWS::EC2::SecurityGroup", "Properties": { "GroupDescription": "Enable SSH access via port 22", "SecurityGroupIngress": [ { "IpProtocol": "tcp", "FromPort": 22, "ToPort": 22, "CidrIp": "0.0.0.0/0" } ] } } } }
YAML
Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: SecurityGroupIds: - !Ref InstanceSecurityGroup - sg-12a4c434 KeyName: MyKey ImageId: ami-1234567890abcdef0 InstanceSecurityGroup: Type: 'AWS::EC2::SecurityGroup' Properties: GroupDescription: Enable SSH access via port 22 SecurityGroupIngress: - IpProtocol: tcp FromPort: 22 ToPort: 22 CidrIp: 0.0.0.0/0
Fn::GetAtt
関数を使用したリソース属性の参照
次の例は、CloudFront ディストリビューションリソースと S3 バケットを定義するリソース宣言を示しています。MyDistribution
リソースは、バケットの DomainName
属性を取得するための Fn::GetAtt
関数を使用して、MyBucket
リソースの DNS 名を指定します。Fn::GetAtt
関数では、2 つのパラメーターが配列として指定されています。複数のパラメーターを受け取る関数に対しては、配列を使用してパラメーターを指定します。
JSON
{ "Resources": { "MyBucket": { "Type": "AWS::S3::Bucket" }, "MyDistribution": { "Type": "AWS::CloudFront::Distribution", "Properties": { "DistributionConfig": { "Origins": [ { "DomainName": { "Fn::GetAtt": [ "MyBucket", "DomainName" ] }, "Id": "MyS3Origin", "S3OriginConfig": {} } ], "Enabled": "true", "DefaultCacheBehavior": { "TargetOriginId": "MyS3Origin", "ForwardedValues": { "QueryString": "false" }, "ViewerProtocolPolicy": "allow-all" } } } } } }
YAML
Resources: MyBucket: Type: 'AWS::S3::Bucket' MyDistribution: Type: 'AWS::CloudFront::Distribution' Properties: DistributionConfig: Origins: - DomainName: !GetAtt - MyBucket - DomainName Id: MyS3Origin S3OriginConfig: {} Enabled: 'true' DefaultCacheBehavior: TargetOriginId: MyS3Origin ForwardedValues: QueryString: 'false' ViewerProtocolPolicy: allow-all