はじめに
本記事ではS3レプリケーション機能を使用して、S3オブジェクトが同一アカウントバケット間でレプリケーションされることを確認します。
なお、AWSリソース作成にはCloudFormationを使用します。
※S3やCloudFormationなどの具体的なサービスの説明は、本記事では割愛します。
概要
作成するAWSリソース
同一アカウントでS3オブジェクトをレプリケーションする際には、以下のAWSリソースを作成します。
※S3レプリケーションの詳しい内容を知りたい方は、AWS公式サイトなどをご参照ください。
リソース | 概要 | リソース物理名 |
---|---|---|
S3バケット | 1.レプリケーション元のS3バケット 2.レプリケーション先のS3バケット |
1.s3-replicationtest-stack-source 2.s3-replicationtest-stack-destination |
IAM Role | レプリケーション元からレプリケーション先へのレプリケーション権限を付与したIAM Role | s3-replicationtest-stack-bucket-source-role |
別アカウント間でのレプリケーションを行う場合や、サーバ側で暗号化したオブジェクトをレプリケーションする場合には、一部設定や作成するAWSリソースが異なります。
テンプレート
リソースの作成には以下のテンプレートを使用します。
ポイント
レプリケーション元とレプリケーション先で、バケットのバージョニングが有効になっている必要があります。
AWSTemplateFormatVersion: '2010-09-09'
Description: "S3 Replication Template"
Resources:
S3BucketSource: # レプリケーション元バケット
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "${AWS::StackName}-source"
VersioningConfiguration:
Status: Enabled
ReplicationConfiguration:
Role: !GetAtt S3BucketSourceRole.Arn
Rules:
- Destination:
Bucket: !Sub "arn:aws:s3:::${AWS::StackName}-destination"
Status: Enabled
AccessControl: Private
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
S3BucketDestination: # レプリケーション先バケット
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "${AWS::StackName}-destination"
VersioningConfiguration:
Status: Enabled
AccessControl: Private
PublicAccessBlockConfiguration:
BlockPublicAcls: true
BlockPublicPolicy: true
IgnorePublicAcls: true
RestrictPublicBuckets: true
S3BucketSourceRole: # レプリケーション元バケットのレプリケーションルールにアタッチするロール
Type: AWS::IAM::Role
Properties:
RoleName: !Sub "${AWS::StackName}-bucket-source-role"
Description: "Role For S3"
Path: "/service/"
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- s3.amazonaws.com
Action:
- sts:AssumeRole
Policies:
- PolicyName: "s3-replication-policy"
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- s3:ListBucket
- s3:GetReplicationConfiguration
Resource:
- !Sub "arn:aws:s3:::${AWS::StackName}-source"
- Effect: Allow
Action:
- s3:GetObjectVersionForReplication
- s3:GetObjectVersionAcl
- s3:GetObjectVersionTagging
Resource:
- !Sub "arn:aws:s3:::${AWS::StackName}-source/*"
- Effect: Allow
Action:
- s3:ReplicateObject
- s3:ReplicateDelete
- s3:ReplicateTags
Resource:
- !Sub "arn:aws:s3:::${AWS::StackName}-destination/*"
リソース作成してみた
作成コマンド
今回はローカル環境からAWS CLIコマンドを使用して、スタックの作成を行います。
AWS CLIコマンドを使用するためのアクセスキーの設定に関しては、こちらをご参照ください。
aws cloudformation deploy \
--template template.yaml \
--stack-name s3-replicationtest-stack \
--capabilities CAPABILITY_NAMED_IAM
アクセスキー使用時の注意点
アクセスキーは、万が一流出した場合のセキュリティリスクが高いため、以下の対応などを検討してください。
・MFAを有効にする
・IAMユーザへの権限は最小にし、実行コマンドの権限を持ったIAMロールを作成し、スイッチロールで一時的なセキュリティ認証情報を取得してコマンドを実行する
・アクセスキーを使わないように、EC2やCloudShellでIAM Roleによる認証を行ってコマンドを実行する
参考:AWS アクセスキーを管理するためのベストプラクティス
https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-access-keys-best-practices.html
レプリケーションされるか確認してみる
レプリケーション元バケットにファイルをアップロードしていきます。
レプリケーション先のバケットを見てみると、ファイルがレプリケーションされていることが確認できます。
おまけ
各オブジェクトのレプリケーションステータスはどうなっているか確認してみましょう。
レプリケーション元バケットのオブジェクトは「COMPLETED」になっており、レプリケーションが成功したことがわかります。
レプリケーション先バケットのオブジェクトは「REPLICA」になっており、レプリケーションされたオブジェクトであることがわかります。
ちなみに、以下の場合は「-」になります。
・レプリケーション先バケットに直接アップロードしたオブジェクト
・レプリケーションを設定していないバケットにアップロードされたオブジェクト
おわりに
今回は同一アカウントでのS3レプリケーションを試しました。
次回は、別アカウント間のレプリケーションや多段レプリケーションなど様々なパターンを試してみようと思います。