この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
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}/*'