はじめに
あるシステムにおいて、アカウント間でファイルをコピーしたいという要件がありました。
今回の記事ではこれを実現するための方法として、S3の機能であるオブジェクトのレプリケーションを紹介します。
実現したい事
実現したい事としては、以下の2点になります。
クロスアカウントでファイルのコピーを行いたい。
特定のフォルダのファイルをコピーしたい。
オブジェクトのレプリケーションについて
オブジェクトのレプリケーションとは?
その名の通り、Amazon S3 バケット間でオブジェクトを自動で非同期的にコピーする機能です。
オブジェクトは、単一または複数の送信先バケットにレプリケートできます。
送信先バケットは、異なる AWS リージョン でも、ソースバケットと同じリージョン内でも配置することができます。
(参考:オブジェクトのレプリケーション)
オブジェクトのレプリケーションを使うメリット
ファイルをコピーする方法として、s3にファイルが置かれたことを検知してLambdaで処理するという方法もありますが、
オブジェクトのレプリケーションのメリットとしてはプログラムを書かずに実現できるという点が大きいかなと思います。
オブジェクトのレプリケーションで出来ること
公式ドキュメント の記載そのままですが、以下が実現できます。
メタデータを保持しながらオブジェクトをレプリケート
別のストレージクラスにオブジェクトをレプリケートする
オブジェクトのコピーを別の所有権で保持する
複数の AWS リージョンに格納されたオブジェクトを保持する
15 分以内にオブジェクトをレプリケート
バケットの同期、既存オブジェクトのレプリケート、以前に失敗したオブジェクトまたはレプリケートされたオブジェクトのレプリケート
オブジェクトをレプリケートし、別のAWS リージョン のバケットにフェイルオーバーする
オブジェクトのレプリケーションで出来ないこと
ファイルをレプリケートする機能であるため、ファイルの中身の編集はできません。
ファイルの中身を編集したい場合はLambdaを使いましょう。
オブジェクトのレプリケーションをするために必要なこと
レプリケート元とレプリケート先の両方のバケットで、バージョニングを有効にする必要があります。
クロスアカウントレプリケーションを実現するためのCloudformationサンプル
オブジェクトのレプリケーションを実現するためのCloudformationサンプルを以下に記載します。
以下要件を満たすようなものとなっています。
アカウント間でのファイルのレプリケーションを行う。
複数環境(開発、本番環境)でも1つのCloudformationファイルで実現可能
特定のフォルダのみをレプリケーションする
バージョニングで古いバージョンは7日間で削除される。
送信元アカウントでの設定内容
Mappingsで送信先アカウントIDとS3のArnを指定します。
LifecycleConfigurationで古いバージョンが削除されるように設定しています。
ReplicationConfigurationでレプリケーションの設定をしています。
Filterで特定のフォルダだけをレプリケーションするように設定可能です。
AWSTemplateFormatVersion: 2010-09-09
Description: Create S3 bucket
Parameters:
Environment:
Description: Environment symbol
Type: String
AllowedValues:
- dev
- prd
RoleReplicationToArn:
Type: String
Mappings:
dev:
ReplicationConfiguration:
Account: "送信先アカウントID"
BucketArn: "送信先バケットのArn"
prd:
ReplicationConfiguration:
Account: "送信先アカウントID"
BucketArn: "送信先バケットのArn"
Resources:
DataBucket:
DeletionPolicy: Retain
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "${Environment}-バケット名"
AccessControl: Private
VersioningConfiguration:
Status: Enabled
LifecycleConfiguration:
Rules:
- Id: deleteOldVersionRule
Status: Enabled
NoncurrentVersionExpiration:
NoncurrentDays: 7
ReplicationConfiguration:
Role: !Ref RoleReplicationToArn
Rules:
- Id: ReplicationTo
Priority: 1
DeleteMarkerReplication:
Status: Enabled
Status: Enabled
Filter:
Prefix: test/
Destination:
AccessControlTranslation:
Owner: Destination
Account: !FindInMap [ !Ref Environment, ReplicationConfiguration, Account ]
Bucket: !FindInMap [ !Ref Environment, ReplicationConfiguration, BucketArn ]
送信先アカウントでの設定内容
Mappingsで送信元アカウントのIDを指定します。このパラメータはバケットポリシーで利用されます。
バケットポリシーの内容としては、バケットレプリケーションを行うために必要な権限を記載しています。
送信先バケットにもバージョニングが必要なので、LifecycleConfigurationで古いバージョンが削除されるように設定しています。
AWSTemplateFormatVersion: 2010-09-09
Description: Create S3 bucket
Parameters:
Environment:
Description: Environment symbol
Type: String
AllowedValues:
- dev
- prd
Mappings:
dev:
ReplicationConfiguration:
Account: "送信元アカウントID"
prd:
ReplicationConfiguration:
Account: "送信元アカウントID"
Resources:
Bucket:
DeletionPolicy: Retain
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub "${Environment}-バケット名"
AccessControl: Private
VersioningConfiguration:
Status: Enabled
LifecycleConfiguration:
Rules:
- Id: deleteOldVersionRule
Status: Enabled
NoncurrentVersionExpiration:
NoncurrentDays: 7
BucketPolicy:
Type: 'AWS::S3::BucketPolicy'
Properties:
Bucket: !Ref Bucket
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
AWS:
- Fn::Join:
- ''
- - 'arn:aws:iam::'
- !FindInMap [ !Ref Environment, ReplicationConfiguration, Account ]
- ':root'
Action:
- s3:GetBucketVersioning
- s3:PutBucketVersioning
- s3:ReplicateObject
- s3:ReplicateDelete
- s3:ObjectOwnerOverrideToBucketOwner
- s3:List*
- s3:GetObject
- s3:PutObject
- s3:PutObjectAcl
Resource:
- Fn::Join:
- ''
- - 'arn:aws:s3:::'
- !Ref Bucket
- Fn::Join:
- ''
- - 'arn:aws:s3:::'
- !Ref Bucket
- '/*'
さいごに
以上、クロスアカウントのS3レプリケーションを実現する方法について紹介しましたが、いかがでしたでしょうか?
S3レプリケーションを使うとCloudformationでAWSリソースの設定するだけでファイルコピーが実現出来るため、プログラムを作ってコピーする場合より少ない工数で実現できると思います。
Comentarios