Amazon S3で双方向や複数バケットのレプリケーションが可能になりました

双方向や複数バケットとの同期が可能になったS3のレプリケーションを試してみました。
2020.12.09

AWSチームのすずきです。

2020年12月1日、Amazon S3 のレプリケーション機能 がアップデート、 双方向のレプリケーションや、複数のS3バケットをレプリケーション先とする利用が可能になりましたので、紹介させていただきます。

環境

CloudFormation(テンプレートは後述)を利用して、S3バケット を 3つ用意しました。

レプリケーション設定

Bucket1 から Bucket2

CloudFormation を利用して 設定しました。

Resources:
  Bucket1:
    Type: AWS::S3::Bucket
    Properties:
      ReplicationConfiguration: 
        Role: !GetAtt 'IamRoleS3Replication.Arn'
        Rules: 
          - Destination:
              Bucket: !Sub 'arn:aws:s3:::${Bucket2}'
            Status: Enabled

Bucket1 から Bucket3

CloudFormation、複数のS3バケットを利用するレプリケーションルールをサポートしなかったため、Webコンソールを利用して設定しました。

送信先のS3バケットを複数指定した場合、スキーマのアップグレードが発生する旨の案内がありました。

Bucket2 から Bucket1

CloudFormation の 循環参照エラーを回避するため、Webコンソールを利用して双方向のレプリケーション設定を行いました。

動作確認

Bucket1へのアップロード

Bucket2、Bucket3へ展開されたことを確認できました。

Bucket2へのアップロード

Bucket1への展開が確認できました。

Bucket2 → Bucket1 → Bucket3への多段のレプリケーションは、従来の制限通り発動しませんでした。

まとめ

これまでレプリケーション先として指定できるS3バケットは1つに限定されていたため、 複数S3バケットへの展開が必要な場合、ユーザが SNS、Lambdaを 用意、自前管理の必要がありましたが、 アップデートで解消しました。

また、双方向のレプリケーションをサポートした事で、複数のS3バケットをマルチマスター的に利用できる様になりました。 レプリケーションの優先度管理などについても評価の上、改めて紹介させて頂きたいと思います。

CloudFormation テンプレート

AWSTemplateFormatVersion: '2010-09-09'
Description: S3 replication 
Resources:
  Bucket1:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub '${AWS::StackName}-bucket1-${AWS::Region}-${AWS::AccountId}'
      VersioningConfiguration:
        Status: Enabled
      ReplicationConfiguration: 
        Role: !GetAtt 'IamRoleS3Replication.Arn'
        Rules: 
          - Destination:
              Bucket: !Sub 'arn:aws:s3:::${Bucket2}'
            Status: Enabled
  Bucket2:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub '${AWS::StackName}-bucket2-${AWS::Region}-${AWS::AccountId}'
      VersioningConfiguration:
        Status: Enabled
  Bucket3:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub '${AWS::StackName}-bucket3-${AWS::Region}-${AWS::AccountId}'
      VersioningConfiguration:
        Status: Enabled
  IamRoleS3Replication:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Sub 'iam-role-${AWS::StackName}-S3BucketAggregate'
      AssumeRolePolicyDocument:
        Version: '2012-10-17'
        Statement:
          - Effect: Allow
            Principal:
              Service: s3.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: S3Replication
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action:
                  - s3:GetReplicationConfiguration
                  - s3:ListBucket
                Resource:
                  - !Sub 'arn:aws:s3:::${AWS::StackName}-bucket1-${AWS::Region}-${AWS::AccountId}'
                  - !Sub 'arn:aws:s3:::${AWS::StackName}-bucket2-${AWS::Region}-${AWS::AccountId}'
              - Effect: Allow
                Action:
                  - s3:GetObjectVersion
                  - s3:GetObjectVersionAcl
                  - s3:GetObjectVersionTagging
                Resource:
                  - !Sub 'arn:aws:s3:::${AWS::StackName}-bucket1-${AWS::Region}-${AWS::AccountId}/*'
                  - !Sub 'arn:aws:s3:::${AWS::StackName}-bucket2-${AWS::Region}-${AWS::AccountId}/*'
              - Effect: Allow
                Action:
                  - s3:ReplicateObject
                  - s3:ReplicateDelete
                  - s3:ReplicateTags
                Resource:
                  - !Sub 'arn:aws:s3:::${AWS::StackName}-bucket1-${AWS::Region}-${AWS::AccountId}/*'
                  - !Sub 'arn:aws:s3:::${AWS::StackName}-bucket2-${AWS::Region}-${AWS::AccountId}/*'
                  - !Sub 'arn:aws:s3:::${AWS::StackName}-bucket3-${AWS::Region}-${AWS::AccountId}/*'