まくろぐ

AWS CloudFormation で S3 バケットのリソースを作成する

更新:
作成:

S3 バケット定義の基本

AWS CloudFormation で S3 バケットを作成・設定するには、次のようにテンプレートファイル内で AWS::S3::Bucket タイプのリソースを定義します。

template.yml
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 コマンドを実行します。

mystack スタックを生成
$ 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 のように キー: 値 という形で指定したいですね。。。

参考情報

参考リンク

関連記事

まくろぐ
サイトマップまくへのメッセージ