CloudFormationでいろいろなS3バケットを作成してみた

はじめに

こんにちは、望月です。

CloudFormationで、いろいろなS3バケットを作成するテンプレートを作成しました。S3バケット単体の作成は、それほど手間にはなりませんが複数のS3バケットを作成するときの設定確認や、とりあえずコード化だ!というときには、お役に立つかと思います。

デフォルト設定のS3バケット

マネジメントコンソールからぽちぽちデフォルトで作成した場合のS3バケットを作成します。現在、マネジメントコンソールからS3バケットを作成した場合、デフォルトではパブリックアクセス設定が有効となりますが、CloudFormationで作成する場合は、しっかり設定を入れる必要があるため、注意しましょう。

AWSTemplateFormatVersion: '2010-09-09'
Description: This CloudFormation template to create S3 Bucket

Parameters:
  S3BucketName:
    Description: Type of this BacketName.
    Type: String

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${S3BucketName}
      AccessControl: Private
      PublicAccessBlockConfiguration:
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True

Outputs:
  S3BucketName:
    Value: !Ref S3Bucket

Webからのアクセスを許可したS3バケット

Webからのアクセスを許可した公開S3バケットを作成します。Webサイトの静的コンテンツを置く用途などで利用できます。ファイルの取扱には注意しましょう。

AWSTemplateFormatVersion: '2010-09-09'
Description: This CloudFormation template to create S3 Bucket

Parameters:
  S3BucketName:
    Description: Type of this BacketName.
    Type: String

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${S3BucketName}
      AccessControl: Private
  S3BucketPolicy:
    Type: "AWS::S3::BucketPolicy"
    Properties:
      Bucket: !Ref S3Bucket
      PolicyDocument:
        Statement:
          Action:
             - "s3:GetObject"
          Effect: "Allow"
          Resource: !Sub "arn:aws:s3:::${S3BucketName}/*"
          Principal: "*"

Outputs:
  S3BucketName:
    Value: !Ref S3Bucket

ファイルのバージョン管理をしつつ、長期保存するS3バケット

バージョニングを有効化し、180日でStandard-IAへ移行するS3バケットを作成します。バージョン管理もしっかりし、なるべくファイルを長期にコストを抑えつつ保存する用途などに利用できます。

AWSTemplateFormatVersion: '2010-09-09'
Description: This CloudFormation template to create S3 Bucket

Parameters:
  S3BucketName:
    Description: Type of this BacketName.
    Type: String

Resources:
  S3BucketName:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${S3BucketName}
      AccessControl: Private
      PublicAccessBlockConfiguration:
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True
      LifecycleConfiguration:
        Rules:
        - Id: LifeCycleRule
          Status: Enabled
          Transitions:
            - TransitionInDays: '180'
              StorageClass: STANDARD_IA
          NoncurrentVersionTransitions:
            - TransitionInDays: '180'
              StorageClass: STANDARD_IA
      VersioningConfiguration:
        Status: Enabled

Outputs:
  S3BucketName:
    Value: !Ref S3Bucket

ファイル(ログ)を決められた期間保存するS3バケット

ログなどを決められた期間保存するをS3バケットを作成します。要件によっては1年間ログを保存することなど多いかと思います。そういった場合、ライフサイクル設定により、必要な期間を過ぎた場合はファイルを削除することにより、容量増加を抑えることができます。

AWSTemplateFormatVersion: '2010-09-09'
Description: This CloudFormation template to create S3 Bucket

Parameters:
  S3BucketName:
    Description: Type of this BacketName.
    Type: String

Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${S3BucketName}
      AccessControl: Private
      PublicAccessBlockConfiguration:
        BlockPublicAcls: True
        BlockPublicPolicy: True
        IgnorePublicAcls: True
        RestrictPublicBuckets: True
      LifecycleConfiguration:
        Rules:
        - Id: LifeCycleRule
          Status: Enabled
          ExpirationInDays: '365'

Outputs:
  S3BucketName:
    Value: !Ref S3Bucket

まとめ

CloudFormationでいろいろなS3バケットを作る機会があったので、ブログにまとめました。S3以外のリソースもCloudFormationでモリモリ作成したんですが、そちらもブログにできるところはブログにしていきたいなーと思っています。

参考

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/cfn-reference-s3.html