🐭

S3の作成とライフサイクルとレプリケーションルールを一つのCloudFormationテンプレートで作成してみた

2024/10/21に公開

こんな方向けの記事です。

・S3Bucketを2つ作成して、レプリケーションルールでBucket間を同期させたい。
 ライフサイクルルールの設定をしたい。
 それを一つのCloudFormationでやりたい。

 
 

前提

・yamlで記述します。
・すべてのオブジェクトをレプリケーションします。
・すべてのオブジェクトをライフサイクルします。(今回はGLACIER)
・ライフサイクルでオブジェクトは削除しません。
 ※削除の設定も入れたい場合は「ExpirationInDays」のコメントアウトを外す
・一つのテンプレートで行うため、クロスリージョンではありません。
 ※クロスリージョンのコードは下部補足のGitHubに載せています。

コードはこちら

AWSTemplateFormatVersion: '2010-09-09'

Parameters:

  DestinationS3BucketName:
    Description: "The name of the Destination S3 bucket"
    Type: String

  SourceS3BucketName:
    Description: "The name of the Source S3 bucket"
    Type: String

  ReplicationStorageClass:
    Description: "The name of the B S3 bucket"
    Type: String #STANDARD | DEEP_ARCHIVE | GLACIER | Glacier | GLACIER_IR | INTELLIGENT_TIERING | ONEZONE_IA | STANDARD_IA

  LifecycleStorageClass:
    Description: "The name of the B S3 bucket"
    Type: String #STANDARD | DEEP_ARCHIVE | GLACIER | Glacier | GLACIER_IR | INTELLIGENT_TIERING | ONEZONE_IA | STANDARD_IA

Resources:

  DestinationS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: !Ref DestinationS3BucketName
      AccessControl: Private
      VersioningConfiguration:
        Status: Enabled

  SourceS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: !Ref SourceS3BucketName
      AccessControl: Private
      ReplicationConfiguration:
        Role: !GetAtt WorkItemBucketBackupRole.Arn
        Rules:
          - Destination:
              Bucket: !GetAtt DestinationS3Bucket.Arn
              StorageClass: !Ref ReplicationStorageClass
            Id: Backup
            Prefix: '' #全てのオブジェクトに適用
            Status: Enabled
      LifecycleConfiguration:
        Rules:
          - Id: LifecycleRule
            Prefix: '' #全てのオブジェクトに適用
            Status: Enabled
            Transitions:
              - TransitionInDays: 1
                StorageClass: !Ref LifecycleStorageClass
            #ExpirationInDays: 365
      VersioningConfiguration:
        Status: Enabled

  WorkItemBucketBackupRole:
    Type: 'AWS::IAM::Role'
    Properties:
      AssumeRolePolicyDocument:
        Statement:
          - Action:
              - 'sts:AssumeRole'
            Effect: Allow
            Principal:
              Service:
                - s3.amazonaws.com

  BucketBackupPolicy:
    Type: 'AWS::IAM::Policy'
    Properties:
      PolicyDocument:
        Statement:
          - Action:
              - 's3:GetReplicationConfiguration'
              - 's3:GetObjectVersionForReplication'
              - 's3:ListBucket'
              - 's3:GetObjectVersion'
              - 's3:GetObjectVersionAcl'
              - 's3:GetObjectVersionTagging'
            Effect: Allow
            Resource:
              - !Join
                - ''
                - - 'arn:aws:s3:::'
                  - !Ref SourceS3Bucket
              - !Join
                - ''
                - - 'arn:aws:s3:::'
                  - !Ref SourceS3Bucket
                  - /*
          - Action:
              - 's3:ReplicateObject'
              - 's3:ReplicateDelete'
              - 's3:ReplicateTags'
              - 's3:GetObjectVersionTagging'
              - 's3:ObjectOwnerOverrideToBucketOwner'
            Effect: Allow
            Resource: 
              - !Join
                - ''
                - - !GetAtt DestinationS3Bucket.Arn
                  - /*
      PolicyName: BucketBackupPolicy
      Roles:
        - !Ref WorkItemBucketBackupRole

Outputs:

  DestinationS3BucketName:
    Description: "The name of the Destination S3 bucket Name"
    Value: !Ref DestinationS3Bucket

  SourceS3BucketName:
    Description: "The name of the Source S3 bucket Name"
    Value: !Ref SourceS3Bucket

  DestinationS3BucketArn:
    Description: "The ARN of the Destination S3 bucket Arn"
    Value: !GetAtt DestinationS3Bucket.Arn

  SourceS3BucketArn:
    Description: "The ARN of the Source S3 bucket Arn"
    Value: !GetAtt SourceS3Bucket.Arn

デプロイ確認

S3Bucketが二つ出来てますね!

 
 

ライフサイクルルールとレプリケーションルールも両方設定されていますね!

 
 

試しにオブジェクトをアップロードしましょう。

正しくレプリケーションされていて、ストレージクラスも指定したものになってますね!

 
 
ライフサイクルルールも1日で設定されているので明日には
オブジェクトのストレージクラスが変わっていることでしょう!

補足

S3Bucket名が世界で一意のものでないと、Cloudformationが失敗します。
S3BucketのリージョンはCloudFormationスタックを作成したリージョンになります。
今回1つのテンプレートでの作成のため、クロスリージョンではありません。
クロスリージョンで今回のテンプレートを使用したい場合は下記GitHubのテンプレートを
利用してください。
https://github.com/MOKOMAP/s3Bucket_Lifecycle_CrossReplication

あとがき

レプリケーションルールとライフサイクルルールの
それぞれの記事やドキュメントは見かけましたが
両方記載されているものがないため、このたび書きました。
自己満足です。

この記事は下記AWSドキュメントを参考にしています。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-s3-bucket.html

Discussion