テンプレートの基礎に関する説明
トピック
「使用を開始する」では、テンプレートを使用してスタックを作成する方法について学習しました。テンプレートで宣言されたリソースと、スタックでリソースをマッピングする方法を確認しました。また、入力パラメーターについて説明し、テンプレートからスタックを作成するときに特定の値を渡す方法についても説明しました。このセクションでは、リソースとパラメーターについて詳しく説明します。さらに、テンプレートのその他のコンポーネントについても説明します。これにより、これらのコンポーネントを組み合わせて使用して、目的の AWS リソースを生成するテンプレートを作成できるようになります。
AWS CloudFormation テンプレートとは?
テンプレートとは、スタックを構成する AWS リソースの宣言です。テンプレートはテキストファイルとして保存され、そのフォーマットは JavaScript Object Notation (JSON) または YAML の標準に準拠しています。テキストファイルであるため、どのテキストエディタでも作成および編集でき、他のすべてのソースコードとともにソースコード管理システム内で管理することができます。テンプレート形式の詳細については、「AWS CloudFormation テンプレート形式」を参照してください。
テンプレートで、作成および設定したい AWS リソースを宣言します。オブジェクトを、名前と値のペアとして、または囲まれた子オブジェクトを持つ名前のペアとして宣言します。構文は、使用する形式によって異なります。詳細については、「テンプレートの分析」を参照してください。最上位オブジェクトのうち必須項目は Resource オブジェクトのみです。このオブジェクトでは、リソースを少なくとも 1 つ宣言する必要があります。まず、リソース宣言を 1 つだけ含む Resource オブジェクトを使用して、最も基本的なテンプレートを作成しましょう。
Resources: Hello Bucket!
Resource オブジェクトには、リソースオブジェクトのリストが含まれます。リソース宣言には、子オブジェクトとして宣言されるリソースの属性が含まれます。リソースには、作成する AWS リソースの種類を定義する Type
属性が必要です。Type
属性には、以下のような特別なフォーマットを使用します。
AWS::
ProductIdentifier
::ResourceType
たとえば、Amazon S3 バケットのリソースタイプは AWS::S3::Bucket となります。リソースタイプの一覧については、「テンプレートリファレンス」を参照してください。
基本的なテンプレートを見てみましょう。以下のテンプレートでは、AWS::S3::Bucket:
タイプで HelloBucket という名前の単一のリソースを宣言しています。
JSON
{ "Resources": { "HelloBucket": { "Type": "AWS::S3::Bucket" } } }
YAML
Resources: HelloBucket: Type: 'AWS::S3::Bucket'
このテンプレートを使用してスタックを作成すると、AWS CloudFormation は Amazon S3 バケットを作成します。CloudFormation ではデフォルト設定を使用してバケットを作成できるため、バケットの作成は簡単です。Amazon EC2 Auto Scaling グループや EC2 インスタンスのようなその他のリソースの場合、CloudFormation はさらに多くの情報を必要とします。リソース宣言では、Properties
属性を使用して、リソースの作成に使用する情報を指定します。
リソースタイプに応じて、必須のプロパティ (AWS::EC2::Instance リソースの ImageId プロパティなど) と、オプションのプロパティがあります。AWS::S3::Bucket
リソースの AccessControl プロパティなどのようにデフォルト値が決まっているプロパティの場合、値の指定はオプションです。AWS::S3::Bucket
リソースの WebsiteConfiguration
プロパティなど、必須ではないものの、機能を追加するために使用できるものもあります。このようなプロパティについては、必要に応じて値は設定してもしなくてもかまいません。上記の例では、AWS::S3::Bucket
リソースにはオプションのプロパティしかなく、ここではオプション機能は必要ないため、デフォルトをそのまま使用し、Properties 属性は省略します。
各リソースタイプのプロパティについては、「AWS リソースおよびプロパティタイプのリファレンス」の各トピックを参照してください。
リソースのプロパティとリソースの同時使用
通常、リソースのプロパティは文字列値です。たとえば以下のテンプレートでは、バケットの AccessControl プロパティに既定 ACL (PublicRead) を指定しています。
JSON
{ "Resources": { "HelloBucket": { "Type": "AWS::S3::Bucket", "Properties": { "AccessControl": "PublicRead" } } } }
YAML
Resources: HelloBucket: Type: 'AWS::S3::Bucket' Properties: AccessControl: PublicRead
リソースによっては複数のプロパティを持つものがあります。また、プロパティによっては 1 つまたは複数のサブプロパティを持つものがあります。例えば、AWS::S3::Bucket リソースには、AccessControl と WebsiteConfiguration の 2 つのプロパティがあります。さらに、WebsiteConfiguration プロパティには、IndexDocument と ErrorDocument の 2 つのサブプロパティがあります。次のテンプレートは、追加のプロパティを含む元のバケットリソースを示しています。
JSON
{ "Resources": { "HelloBucket": { "Type": "AWS::S3::Bucket", "Properties": { "AccessControl": "PublicRead", "WebsiteConfiguration": { "IndexDocument": "index.html", "ErrorDocument": "error.html" } } } } }
YAML
Resources: HelloBucket: Type: 'AWS::S3::Bucket' Properties: AccessControl: PublicRead WebsiteConfiguration: IndexDocument: index.html ErrorDocument: error.html
テンプレートと CloudFormation の最大の利点の 1 つは、アプリケーションまたはソリューションを作成するために連携するリソースのセットを作成できることにあります。テンプレート内でリソース用に使用される名前は、論理名です。CloudFormation は、リソースを作成するときに、論理名、スタック名、および一意の ID の組み合わせに基づいた物理的な名前を生成します。
では、他のリソースの名前やプロパティに基づいてリソースにどのようにプロパティを設定するのでしょうか。例えば、S3 バケットに基づく CloudFront ディストリビューションまたは EC2 セキュリティグループを使用する EC2 インスタンスを作成できます。これらのリソースはすべて同じテンプレートで作成できます。CloudFormation には、他のリソースとそのプロパティを参照するために使用できる多くの組み込み関数があります。Ref 関数を使用すると、リソースの識別プロパティを参照できます。通常、これは、リソースの物理名です。ただし、AWS::EC2::EIP リソースの IP アドレスや Amazon SNS トピックの Amazon リソースネーム (ARN) などの識別子を使用することもできます。Ref 関数から返される値の一覧については、「Ref 関数」を参照してください。次のテンプレートには、AWS::EC2::Instance リソースが含まれています。リソースの SecurityGroups プロパティは、Ref 関数を呼び出して、AWS::EC2::SecurityGroup
リソースの InstanceSecurityGroup を参照します。
JSON
{ "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" } ], "KeyName": "mykey", "ImageId": "" } }, "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: SecurityGroups: - !Ref InstanceSecurityGroup KeyName: mykey ImageId: '' 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
SecurityGroups プロパティはセキュリティグループのリストです。次の例では、リストに項目が 1 つだけ含まれています。次のテンプレートの SecurityGroups のプロパティリストには、その他の項目が含まれています。
JSON
{ "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" }, "MyExistingSecurityGroup" ], "KeyName": "mykey", "ImageId": "ami-7a11e213" } }, "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: SecurityGroups: - !Ref InstanceSecurityGroup - MyExistingSecurityGroup KeyName: mykey ImageId: ami-7a11e213 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
MyExistingSecurityGroup は、テンプレートで宣言されるセキュリティグループの代わりに既存の EC2 セキュリティグループを参照する文字列です。既存の AWS リソースを参照するには、リテラル文字列を使用します。
上の例で、AWS::EC2::Instance の KeyName プロパティは、リテラル文字列 mykey です。これは、名前が mykey のキーペアが、スタックが作成されるリージョンに存在する必要があることを意味します。キーペアがない場合、スタックの作成は失敗します。使用できるキーペアは、スタックを作成するリージョンによって異なります。他のユーザーとテンプレートを共有すると、そのユーザーは自分の AWS アカウントでテンプレートを使用できるようになります。その場合、スタックを作成する際にキーペアの名前を指定できるように、入力パラメーターを使用できます。Ref 関数は、スタックの作成時に指定された入力パラメーターを参照できます。次のテンプレートには、AWS::EC2::Instance
リソースの KeyName プロパティを指定するために使用される、KeyName パラメータを含む Parameters オブジェクトが追加されています。パラメータータイプは AWS::EC2::KeyPair::KeyName
です。アカウントおよびスタックが作成されるリージョンの有効なキーペア名を確実に指定できます。
JSON
{ "Parameters": { "KeyName": { "Description": "The EC2 Key Pair to allow SSH access to the instance", "Type": "AWS::EC2::KeyPair::KeyName" } }, "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "SecurityGroups": [ { "Ref": "InstanceSecurityGroup" }, "MyExistingSecurityGroup" ], "KeyName": { "Ref": "KeyName" }, "ImageId": "ami-7a11e213" } }, "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
Parameters: KeyName: Description: The EC2 Key Pair to allow SSH access to the instance Type: 'AWS::EC2::KeyPair::KeyName' Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: SecurityGroups: - !Ref InstanceSecurityGroup - MyExistingSecurityGroup KeyName: !Ref KeyName ImageId: ami-7a11e213 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
Ref 関数はリソースに対して返されるパラメーターまたは値が目的の値そのものである場合に便利ですが、リソースの他の属性が必要になる場合もあります。たとえば、S3 オリジンを含む CloudFront ディストリビューションを作成するには、DNS 形式のアドレスを使用してバケットの場所を指定する必要があります。いくつかのリソースには、その値をテンプレートで使用できる追加の属性があります。にこれらの属性を取得するには、Fn::GetAtt 関数を使用します。次のテンプレートで作成する CloudFront ディストリビューションリソースは、バケットの DomainName 属性を取得する Fn::GetAtt 機能を使用して S3 バケットリソースの DNS 名を指定しています。
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
Fn::GetAtt 関数は、2 つのパラメーターを受け取ります。1 つはリソースの論理名、もう 1 つは取得する属性の名前です。リソースで使用可能な属性の完全な一覧については、「Fn::GetAtt」を参照してください。Fn::GetAtt 関数では、2 つのパラメーターが配列として指定されています。複数のパラメーターを受け取る関数に対しては、配列を使用してパラメーターを指定します。
入力パラメーターを使用したユーザー入力の取得
ここまで、リソースについて説明するとともに、テンプレート内でリソースを組み合わせて使用する方法についても説明してきました。入力パラメーターを参照する方法については説明しましたが、入力パラメーターを定義する方法についてはまだ詳しく説明していません。ここでは、パラメーター宣言について説明し、ユーザー入力を制限する方法と検証する方法について説明します。
パラメーターは、テンプレートの Parameters オブジェクト内で宣言します。パラメーターは、値と値に対する制約を定義する属性のリストを含みます。唯一の必須属性は Type で、String、Number、または AWS 固有タイプのいずれかを指定します。さらに、Description 属性を追加して、どのような値を指定する必要があるかをユーザーに示すこともできます。パラメーターの名前と説明は、ユーザーが [Create Stack] ウィザードでテンプレートを使用するときに [Specify Parameters] ページに表示されます。
次のテンプレートフラグメントは、上記の [Specify Parameters] ページに使用されるパラメーターを宣言する Parameters オブジェクトです。
JSON
"Parameters": { "KeyName": { "Description" : "Name of an existing EC2 KeyPair to enable SSH access into the WordPress web server", "Type": "AWS::EC2::KeyPair::KeyName" }, "WordPressUser": { "Default": "admin", "NoEcho": "true", "Description" : "The WordPress database admin account user name", "Type": "String", "MinLength": "1", "MaxLength": "16", "AllowedPattern" : "[a-zA-Z][a-zA-Z0-9]*" }, "WebServerPort": { "Default": "8888", "Description" : "TCP/IP port for the WordPress web server", "Type": "Number", "MinValue": "1", "MaxValue": "65535" } }
YAML
Parameters: KeyName: Description: Name of an existing EC2 KeyPair to enable SSH access into the WordPress web server Type: AWS::EC2::KeyPair::KeyName WordPressUser: Default: admin NoEcho: true Description: The WordPress database admin account user name Type: String MinLength: 1 MaxLength: 16 AllowedPattern: "[a-zA-Z][a-zA-Z0-9]*" WebServerPort: Default: 8888 Description: TCP/IP port for the WordPress web server Type: Number MinValue: 1 MaxValue: 65535
デフォルト値を持つパラメータについては、ユーザーが別の値を指定しない限り、CloudFormation でデフォルト値が使用されます。デフォルト属性を除外すると、そのパラメーターの値はユーザーが指定する必要があります。ただし、ユーザーが指定した値が有効である保証はありません。パラメータの値を検証するには、制限を宣言するか、AWS 固有のパラメータタイプを指定することができます。
KeyName
属性は、Default
にはなく、その他のパラメーターにはあります。たとえば、WordPressUser
属性は、Default: admin
パラメーターにはありますが、KeyName
パラメーターにはありません。ユーザーは、スタックの作成時にキー名の値を指定する必要があります。指定しないと、CloudFormation ではスタックを作成できないため、例外として Parameters: [KeyName] must have
values
がスローされます。
AWS 固有のパラメータについては、ユーザーの AWS アカウントまたはスタックを作成するリージョンの既存の値と照らし合わせて入力値が正しいかどうかが、スタックリソースの作成前に CloudFormation で検証されます。このサンプルテンプレートでは、KeyName
パラメータは AWS 固有のパラメータタイプ AWS::EC2::KeyPair::KeyName
です。CloudFormation では、スタックを作成する前に、ユーザーが有効な EC2 キーペア名を指定していることを確認します。AWS 固有のパラメータタイプの別の例は、AWS::EC2::VPC::Id
です。このタイプでは、ユーザーが有効な VPC ID を指定する必要があります。事前の確認に加えて、ユーザーが [Create Stack] (スタックを作成) ウィザードを使用するときにも、AWS 固有のパラメータタイプの有効な値 (EC2 キーペア名や VPC ID など) のドロップダウンリストが AWS コンソールに表示されます。
String
タイプについては、MinLength
、MaxLength
、Default
、AllowedValues
、AllowedPattern
の各属性を使用して制約を宣言できます。上の例では、WordPressUser
パラメーターに 3 つの制約があります。パラメーター値は長さが 1~16 文字であること (MinLength
、MaxLength
)、先頭が文字でその後に文字と数値の任意の組み合わせが続くこと (AllowedPattern
) です。
Number
タイプについては、制約として MinValue
、MaxValue
、Default
、AllowedValues
を宣言できます。数字には、整数または浮動小数点値を指定できます。上の例では、WebServerPort
パラメーターは 1~65535 の範囲内の数値である必要があります (MinValue
、MaxValue
)。
このセクションの前の方で、パラメータは、必要である一方でテンプレート自体に組み込むことは避けたい機密データや実装に固有のデータ (パスワード、ユーザー名など) を指定するのに便利であることを説明しました。NoEcho
属性を true
に設定すると、CloudFormation は、スタックまたはスタックイベントを記述するすべての呼び出しに対して、アスタリスク (*****) としてマスクされたパラメータ値を返します。ただし、以下に指定された場所に保存されている情報は除きます。上の例では、WordPressUser
パラメータ値はスタックの設定を表示している誰に対しても表示されず、その値はアスタリスクとして返されます。
重要
NoEcho
属性を使用しても、以下に保存されている情報はマスクされません。
-
Metadata
テンプレートセクション。CloudFormation は、Metadata
セクションに含める情報の変換、変更、または編集を行いません。詳細については、「メタデータ」を参照してください。 -
Outputs
テンプレートセクション。詳細については、「出力」を参照してください。 -
リソース定義の
Metadata
属性。詳細については、「Metadata 属性」を参照してください。
パスワードやシークレットなどの機密情報を含めるには、これらのメカニズムを使用しないことを強くお勧めします。
重要
機密情報は、CloudFormation テンプレートに直接埋め込むのではなく、スタックテンプレートの動的パラメータを使用して CloudFormation の外部 (AWS Systems Manager パラメータストアや AWS Secrets Manager など) に保存して管理した上で 参照することをお勧めします。
詳細については、「テンプレートに認証情報を埋め込まない のベストプラクティス」を参照してください。
Mappings を使用した条件値の指定
パラメーターは、スタックリソースのプロパティで使用する一意の値や機密の値をユーザーが指定できるようにするための優れた方法です。ただし、リージョンに依存する設定や、他の条件や依存関係のためにユーザーにとってわかりにくい設定がある場合もあります。このような場合は、テンプレート自体にロジックを組み込むことにより、ユーザーがより単純な指定するだけで (またはユーザーが値を指定する必要なく)、目的の結果を得られるようにすることができます。前の例では、EC2 インスタンスの ImageId プロパティに対して AMI ID がハードコーディングされていました。これは、目的の AMI を表す米国東部リージョンでは正常に動作します。ただし、ユーザーが別のリージョンでスタックを構築しようとすると、誤った AMI が得られるか、または AMI がまったく得られない結果になります。(AMI ID はリージョンに固有のため、異なるリージョンの同じ AMI ID が任意の AMI やまったく異なる AMI を表すとは限りません。)
この問題を回避するには、条件入力 (この例では、スタックが作成されるリージョン) に基づいて適切な AMI ID を指定する方法が必要です。そのためのテンプレート機能として、Mappings オブジェクトと AWS::Region
擬似パラメータの 2 つがあります。
AWS::Region
擬似パラメータは、CloudFormation によってスタックが作成されるリージョンとして解決される値です。擬似パラメータは、スタックの作成時に CloudFormation によって解決されます。Mappings を使用すると、別の値を判定する条件として入力値を使用できます。スイッチステートメントと同様、マッピングによって値のセットを別の値のセットに関連付けることができます。AWS::Region
パラメータをマッピングとともに使用することで、リージョンに適した AMI ID が指定されることを保証できます。次のテンプレートの Mappings オブジェクトには、AMI ID を適切なリージョンにマッピングするために使用される、RegionMap という名前のマッピングが含まれています。
JSON
{ "Parameters": { "KeyName": { "Description": "Name of an existing EC2 KeyPair to enable SSH access to the instance", "Type": "String" } }, "Mappings": { "RegionMap": { "us-east-1": { "AMI": "ami-76f0061f" }, "us-west-1": { "AMI": "ami-655a0a20" }, "eu-west-1": { "AMI": "ami-7fd4e10b" }, "ap-southeast-1": { "AMI": "ami-72621c20" }, "ap-northeast-1": { "AMI": "ami-8e08a38f" } } }, "Resources": { "Ec2Instance": { "Type": "AWS::EC2::Instance", "Properties": { "KeyName": { "Ref": "KeyName" }, "ImageId": { "Fn::FindInMap": [ "RegionMap", { "Ref": "AWS::Region" }, "AMI" ] }, "UserData": { "Fn::Base64": "80" } } } } }
YAML
Parameters: KeyName: Description: Name of an existing EC2 KeyPair to enable SSH access to the instance Type: String Mappings: RegionMap: us-east-1: AMI: ami-76f0061f us-west-1: AMI: ami-655a0a20 eu-west-1: AMI: ami-7fd4e10b ap-southeast-1: AMI: ami-72621c20 ap-northeast-1: AMI: ami-8e08a38f Resources: Ec2Instance: Type: 'AWS::EC2::Instance' Properties: KeyName: !Ref KeyName ImageId: !FindInMap - RegionMap - !Ref 'AWS::Region' - AMI UserData: !Base64 '80'
RegionMap 内では、各リージョンが名前と値のペアにマッピングされます。名前と値のペアは、ラベルとマッピングする値から構成されます。RegionMap では、AMI がラベルであり、AMI ID が値です。マップを使用して値を返すには、Fn::FindInMap 関数を使用して、マップの名前、マッピングされた値を見つけるための値、および取得するマッピングされた値のラベルを渡します。上の例のリソース Ec2Instance の ImageId プロパティでは、Fn::FindInMap 関数を使用して値を判定しています。関数には、使用するマップとして RegionMap が指定され、マッピング元の入力値として AWS::Region が指定されています。さらに、マッピング先の値を識別するためのラベルとして AMI が指定されています。例えば、このテンプレートを使用して米国西部 (北カルフォルニア) リージョンでスタックを作成した場合、ImageId
は ami-655a0a20
に設定されます。
ヒント
AWS::Region
擬似パラメータを使用すると、スタックが作成されるリージョンを取得できます。いくつかのリソース (AWS::EC2::Instance、AWS::AutoScaling::AutoScalingGroup、AWS::ElasticLoadBalancing::LoadBalancer など) にはアベイラビリティーゾーンを指定するプロパティがあります。Fn::GetAZs 関数を使用すると、リージョンでのすべてのアベイラビリティーゾーンのリストを取得できます。
構築された値および出力値
パラメーターとマッピングはスタックの作成時に特定の値を渡したり判定したりするのに優れた方法ですが、パラメーターまたはその他のリソース属性からの値が目的とする値の一部分のみを表すこともあります。例えば、次の WordPress テンプレートのフラグメントでは、Fn::Join 関数を使用して WebServerPort
パラメータと他のリテラル文字列を連結して目的の値を生成することで、ElasticLoadBalancer
リソースの HealthCheck
プロパティの Target
サブプロパティを構築しています。
JSON
{ "Resources": { "ElasticLoadBalancer": { "Type": "AWS::ElasticLoadBalancing::LoadBalancer", "Properties": { "AvailabilityZones": { "Fn::GetAZs": "" }, "Instances": [ { "Ref": "Ec2Instance1" }, { "Ref": "Ec2Instance2" } ], "Listeners": [ { "LoadBalancerPort": "80", "InstancePort": { "Ref": "WebServerPort" }, "Protocol": "HTTP" } ], "HealthCheck": { "Target": { "Fn::Join": [ "", [ "HTTP:", { "Ref": "WebServerPort" }, "/" ] ] }, "HealthyThreshold": "3", "UnhealthyThreshold": "5", "Interval": "30", "Timeout": "5" } } } } }
YAML
Resources: ElasticLoadBalancer: Type: 'AWS::ElasticLoadBalancing::LoadBalancer' Properties: AvailabilityZones: !GetAZs '' Instances: - !Ref Ec2Instance1 - !Ref Ec2Instance2 Listeners: - LoadBalancerPort: '80' InstancePort: !Ref WebServerPort Protocol: HTTP HealthCheck: Target: !Join - '' - - 'HTTP:' - !Ref WebServerPort - / HealthyThreshold: '3' UnhealthyThreshold: '5' Interval: '30' Timeout: '5'
Fn::Join 関数は、連結する値を区切る区切り記号と、目的の順序で記述された値の配列の 2 つのパラメーターを受け取ります。上の例の Fn::Join 関数では、区切り文字として空の文字列が指定され、連結する値として HTTP:、WebServerPort パラメーターの値、および文字 / が指定されています。WebServerPort の値が 8888 であった場合、Target プロパティは次の値に設定されます。
HTTP:8888/
Fn::Join 関数は、スタックの出力値を宣言する場合にも有用です。テンプレートの Outputs オブジェクトには、スタックが作成された後に利用可能にする値の宣言を含めます。出力は、リソースや入力パラメーターについての重要な情報をキャプチャするのに便利な方法です。たとえば、WordPress テンプレートでは、次の Outputs オブジェクトが宣言されています。
JSON
{ "Outputs": { "InstallURL": { "Value": { "Fn::Join": [ "", [ "http://", { "Fn::GetAtt": [ "ElasticLoadBalancer", "DNSName" ] }, "/wp-admin/install.php" ] ] }, "Description": "Installation URL of the WordPress website" }, "WebsiteURL": { "Value": { "Fn::Join": [ "", [ "http://", { "Fn::GetAtt": [ "ElasticLoadBalancer", "DNSName" ] } ] ] } } } }
YAML
Outputs: InstallURL: Value: !Join - '' - - 'http://' - !GetAtt - ElasticLoadBalancer - DNSName - /wp-admin/install.php Description: Installation URL of the WordPress website WebsiteURL: Value: !Join - '' - - 'http://' - !GetAtt - ElasticLoadBalancer - DNSName
各出力値に対し、名前、出力値として返される値の宣言を含む Value 属性、およびオプションで値の説明を定義します。前の例の InstallURL は、Fn::Join 関数呼び出しから返された、http://、リソース ElasticLoadBalancer の DNS 名、および /wp-admin/install.php を連結した結果の文字列です。出力値は次の例のようになります。
http://mywptests-elasticl-1gb51l6sl8y5v-206169572.us-east-2.elb.amazonaws.com/wp-admin/install.php
「はじめに」のチュートリアルでは、作成した WordPress ブログのインストールページに簡単に移動するための手段としてこのリンクを使用しました。CloudFormation は、スタックの作成が完了した後に出力値を生成します。出力値を表示するには、CloudFormation コンソールの [Outputs] (出力) タブまたは aws cloudformation describe-stacks
コマンドを使用します。
次のステップ
これまで、テンプレートの基礎と、テンプレートの使用方法について説明してきました。テンプレートについて、以下のことを学習しました。
-
リソースおよびプロパティの宣言
-
Ref 関数を使用して他のリソースを参照する方法と、Fn::GetAtt 関数を使用してリソース属性を参照する方法
-
パラメータを使用してスタックの作成時にユーザーが値を指定できるようにする方法と、制約を使用してパラメータ入力を検証する方法
-
マッピングを使用して条件値を判定する方法
-
Fn::Join 関数を使用して、パラメータ、リソース属性、およびその他の文字列に基づいて値を生成する方法
-
出力値を使用してスタックのリソースに関する情報をキャプチャする方法
テンプレート内の 2 つの最上位オブジェクト (AWSTemplateFormatVersion および Description) については触れませんでした。AWSTemplateFormatVersion は、単にテンプレートフォーマットのバージョンです。これを指定しない場合、CloudFormation は最新バージョンを使用します。
説明は、有効な JSON または YAML の文字列です。この説明は、[Create Stack] ウィザードの [Specify Parameters] ページに表示されます。詳細については、形式バージョンおよび説明を参照してください。
もちろん、より高度なテンプレート機能やスタック機能があります。いくつかの重要な機能を次に示します。
すべてのリソースで使用できるオプション属性:
-
DependsOn 属性: あるリソースに続けて別のリソースを作成する必要があることを指定できます。
-
DeletionPolicy 属性: リソースの削除を CloudFormation でどのように処理するかを指定できます。
-
Metadata 属性: リソースを含む構造化データを指定できます。
AWS::CloudFormation::Stack: テンプレート内に別のスタックをリソースとしてネストできます。