S3 バケット定義の基本
AWS CloudFormation で S3 バケットを作成・設定するには、次のようにテンプレートファイル内で AWS::S3::Bucket
タイプのリソースを定義します。
AWSTemplateFormatVersion: '2010-09-09'
Resources:
MyBucket:
Type: AWS::S3::Bucket
上記の例では、論理 ID (Logical ID) が MyBucket
の S3 バケットを定義しています。
論理 ID はこのテンプレートで生成するスタック内で一意の ID です。
実際に生成される S3 バケット名(物理 ID)は CloudFormation が自動で生成します(後述)。
このテンプレートを使って、CloudFormation スタック(ここでは S3 バケットのみ含まれる)を生成するには、次のように aws cloudformation deploy
コマンドを実行します。
$ aws cloudformation deploy --template-file template.yml --stack-name mystack
スタック内に生成された AWS リソースの一覧は次のように確認できます。
$ aws cloudformation describe-stack-resources --stack-name mystack
StackResources:
- DriftInformation:
StackResourceDriftStatus: NOT_CHECKED
LogicalResourceId: MyBucket
PhysicalResourceId: mystack-mybucket-bq8iux8uepew
ResourceStatus: CREATE_COMPLETE
ResourceType: AWS::S3::Bucket
StackId: arn:aws:cloudformation:ap-northeast-1:123456789012:stack/mystack/c7e06a46-9902-11eb-9a29-8b1f770a16f7
StackName: mystack
Timestamp: '2021-04-09T07:09:13.622000+00:00'
PhysicalResourceId
のところを見ると、実際に作成された S3 バケットの物理 ID (Physical ID) が分かります。
PhysicalResourceId: mystack-mybucket-bq8iux8uepew
S3 バケット名(物理 ID)は、このように、スタック名とテンプレートで指定した論理 ID (Logical ID) をもとに自動生成されます。 もちろん、バケット名を自分で指定することもできます(後述)。 他のスタック内の AWS リソースからこの S3 バケットを参照するときは、この物理 ID(および ARN)を使用することになります。
S3 バケットリソースの各種設定
CloudFormation テンプレート内で S3 バケットリソース (AWS::S3::Bucket
) を定義するときに、様々なプロパティを設定することができます。
これらのプロパティはすべてオプショナルです。
BucketName(バケット名を明示する)
バケット名の生成を CloudFormation に任せるのではなく、BucketName
プロパティで明示的に指定することが可能です。
Resources:
MyBucket:
Type: AWS::S3::Bucket
Properties:
BucketName: bucket-123456789012-myapp-log-march-2020
バケット名に使える名前は制約が多く、すべて小文字で、世界中でユニークになるように命名する必要があるので注意してください。 一般的には、上の例のように、単語をハイフン区切りで繋げた名前を付けます。 アカウント ID を含めると、名前の衝突を避けやすくなります。
CloudFormation の Sub 関数 と、AWS::AccountID 擬似パラメータ を使用すると、アカウント ID のハードコーディングを避けることができます。
BucketName: !Sub 'bucket-${AWS::AccountId}-myapp-log-march-2020'
DeletionPolicy(スタック削除時に S3 バケットを消さない)
CloudFormation スタックを削除すると、デフォルトではそのスタック内の S3 バケットも同時に削除されます。 プロダクション環境では、S3 バケット内のデータが簡単に削除されてしまっては困るので、次のように DeletionPolicy を設定して、スタック削除時に S3 バケットが削除されないようにします。
Resources:
MyBucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain
DeletionPolicy
は、リソース共通の設定項目なので、論理 ID (Logical ID) のすぐ下の階層で定義することに注意してください(Properties
の下ではありません)。
この状態で CloudFormation スタックを削除すると、S3 バケットはスタックから独立したリソースとして残ります。
Tags(タグを設定する)
S3 バケットにタグを割り当てるときは、Tags
プロパティで指定します。
Resources:
MyBucket:
Type: AWS::S3::Bucket
Properties:
Tags:
- Key: Department
Value: Marketing
- Key: CostCenter
Value: 1234ABCDE
何か書き方が煩わしいです。SAM のように キー: 値
という形で指定したいですね。。。
参考情報
関連記事
- AWS CloudFormation の設定例: Lambda 関数の設定いろいろ
- AWS CloudFormation 入門 (Hello World)
- AWS CloudFormation をコマンドライン (CLI) で操作する
- AWS CloudFormation で DyanamoDB のリソースを作成する
- AWS CloudFormation で Lambda 関数のリソースを生成する
- AWS CLI: Windows で HOME 環境変数を設定したときに credentials が見つからなくなる場合の対処
- AWS SDK for Node.js でプロキシ環境変数 (https_proxy) を反映させる