CloudFormation のネストされたスタックで S3 バケットを作成する際に発生したエラーについて
ネストされたスタック作成時に以下のエラーが発生して S3 バケットを作成できない事象が発生しました。
Bucket name should not contain uppercase characters
- 原因: バケット名に疑似パラメーター
AWS::StackNameを指定していたこと - 解決策: バケット名を明示的に指定する
事象発生時のテンプレート
AWSTemplateFormatVersion: "2010-09-09"
Resources:
ChildStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: "<子テンプレートの S3 URL>"
AWSTemplateFormatVersion: "2010-09-09"
Resources:
MyChildBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "${AWS::StackName}-child-bucket"
上記テンプレートで CloudFormation スタックを作成したところ、ネストされたスタック側で冒頭のエラーが発生しました。
エラーが発生したリソースを確認したところ、物理 ID である S3 バケット名が以下の名前になっていました。
- test-childstack-2D3GQIACYR3L-child-bucket
S3 バケット名には大文字を使用できないため、冒頭のエラーが発生していました。
汎用バケットの命名規則 - Amazon Simple Storage Service
バケット名は、小文字、数字、ピリオド (.)、およびハイフン (-) のみで構成できます。
子テンプレートではネストされたスタックの名前を指定できない
AWS::CloudFormation::Stack - AWS CloudFormation
These properties can be configured only when using AWS Cloud Control API. This is because the below properties are set by the parent stack, and thus cannot be configured using CloudFormation or AWS CDK but only AWS Cloud Control API.
AWS::CloudFormation::Stack のパラメータには StackName が存在するものの、CloudFormation テンプレートでは指定できない仕様でした。
試しに以下のテンプレートでスタックを作成しましたが、StackName はサポートされていないプロパティである旨のエラーが発生しました。
AWSTemplateFormatVersion: "2010-09-09"
Description: "Parent template - Demonstrates nested stacks"
Resources:
ChildStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: "<子テンプレートの S3 URL>"
StackName: child
Encountered unsupported property StackName
ネストされたスタックの名前を明示的に指定できないため、ネストされたスタックで AWS::StackName を使用して S3 バケットを作成することはできませんでした。
参考までに、ネストされたスタック名は以下のような名前で作成されていました。
- test-ChildStack-1ESZSZIVFEUSS
命名規則について記載されたドキュメントは特定できませんでしたが、以下のような規則になっていると思われました。
- <親スタックの名前>-<子スタックの論理 ID>-<大文字のランダムな文字列>
解決策
冒頭に記載したとおり、バケット名を明示的に指定することでエラーを回避できました。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
ChildStack:
Type: AWS::CloudFormation::Stack
Properties:
TemplateURL: "<子テンプレートの S3 URL>"
AWSTemplateFormatVersion: "2010-09-09"
Resources:
MyChildBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: "child-bucket"
なお、AWS::StackName で大文字が使用されることが原因であるため、AWS::StackId や AWS::Region などの疑似パラメータを使用することは可能です。
例えば、以下のテンプレートであれば S3 バケットの作成は可能です。
AWSTemplateFormatVersion: "2010-09-09"
Resources:
MyS3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "my-bucket-${AWS::AccountId}-${AWS::Region}"
S3 バケット以外のリソースでも大文字が使用できないケースはあると思われますので、ネストされたスタックから作成する際に AWS::StackName を指定している場合には命名規則を確認しましょう。
まとめ
今回は CloudFormation のネストされたスタックで S3 バケットを作成する際に発生したエラーについて紹介しました。
どなたかの参考になれば幸いです。
Discussion