CloudFormationの作成時にoutputの書き方に注意せずスタック作成失敗になったことがあったので今回はスタック作成時に簡単に情報を取得できるoutputの書き方と注意点について説明します。
Outputとは
Output (任意)
オプションの Outputs セクションは、他のスタックにインポートする (クロススタック参照を作成)、応答として返す (スタック呼び出しについて記述)、または、AWS CloudFormation コンソールで表示する出力値を宣言します。
なぜOutputを使用するのか?
Outputs
セクションは、スタックの作成または更新後に表示される情報を定義するために使用されます。
特定のリソースの属性やスタック内で作成されたリソースへの参照など、リソース情報を簡単に取得できます。
Outputの基本的な書き方
基本的なOutputs
セクションの構造は以下のようになります。
Outputs:
Logical ID:
Description: Information about the value
Value: Value to return
Export:
Name: Name of resource to export
-
Description
: Outputの説明。オプションですが、何の情報が出力されるのかを明確にするために推奨されます。 -
Value
: 出力する情報の値。この属性は必須です。 -
Export
: スタック間での値の共有を可能にするための名前。この名前を使用して、他のスタックからこのOutput値を参照できます。
各サービスのCloudFormationのReturn Valuesを確認
Return Valuesとは
CloudFormationのテンプレート内でリソースを定義する際、そのリソースが持つ属性や情報を他の部分で参照したい場合があります。
このときに利用するのが、各リソースのReturn Values
です。特定のリソースが作成または更新された後に利用可能な値を示しています。
各サービスのCloudFormationのUserGuidで該当サービスが返せるReturn Valuesが確認できます。
例えば、Amazon S3のCloudFormation UserGuideによれば、AWS::S3::Bucket
リソースのReturn Valuesは以下の通りです:
-
Ref
: バケットの名前を返します。 -
Fn::GetAtt
:-
Arn
: バケットのAmazon Resource Name (ARN)を返します。 -
DomainName
: バケットのドメイン名を返します。 -
DualStackDomainName
: バケットのデュアルスタックドメイン名を返します。 -
WebsiteURL
: バケットのウェブサイトURLを返します。
-
Return Valuesで確認した値をs3のCloudFormationの例に挙げて説明をします。
以下は、S3バケットを作成する簡単なCloudFormationテンプレートの例です:
Resources:
MySampleBucket:
Type: "AWS::S3::Bucket"
Outputs:
BucketName:
Description: "The name of the S3 bucket"
Value: !Ref MySampleBucket
BucketArn:
Description: "The ARN of the S3 bucket"
Value: !GetAtt MySampleBucket.Arn
BucketDomainName:
Description: "The domain name of the S3 bucket"
Value: !GetAtt MySampleBucket.DomainName
AWS::S3::Bucket
リソースを作成しましたのでOutputs
セクションでReturn Valuesを使用して情報を出力してみましょう。
-
BucketName
:!Ref
を使用してバケットの名前を出力します。 -
BucketArn
:!GetAtt
を使用してバケットのARNを出力します。 -
BucketDomainName
:!GetAtt
を使用してバケットのドメイン名を出力します。
Outputを書く際の注意点
Outputを記述する際の注意点として、変数と属性を適切に組み合わせることが重要です。使用する変数や属性が、対象となるサービスでサポートされていることを確認する必要があります。サポートされていない変数や属性を使用すると、スタック作成時にエラーが発生します。
例えば、S3のOutputにAWS::Backup::BackupPlanのoutputの属性BackupPlanArnを使用すると構文エラーが発生します。
Outputs:
#S3のoutputの属性
BucketName:
Value: !Ref BucketName
BucketARN:
Value: !GetAtt S3Bucket.Arn
#AWS::Backup::BackupPlanのoutputの属性
BackupARN:
Value: !GetAtt S3Bucket.BackupPlanArn