Amazon S3で双方向や複数バケットのレプリケーションが可能になりました
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}/*'