top of page
検索
  • 執筆者の写真toshiki nishio

クロスアカウントのS3レプリケーション

はじめに

 

あるシステムにおいて、アカウント間でファイルをコピーしたいという要件がありました。

今回の記事ではこれを実現するための方法として、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リソースの設定するだけでファイルコピーが実現出来るため、プログラムを作ってコピーする場合より少ない工数で実現できると思います。





閲覧数:6回0件のコメント

最新記事

すべて表示

データ状態により異なるSQLを実行させたい

はじめに 近頃担当する業務は夜間バッチでのデータ更新処理が多く、特にDWH的にテーブル再構築(TRUNCATE/INSERT)のパターンを多く使用しています。 その中でSQLで処理を組み上げる時、エラー処理などで条件分岐で異なるSQLを実行したくなる事は珍しくありません。 多くのシステムでは呼び出し側でSQLの実行結果を参照し、次に実行するSQLを選択/実行していると思います。 また、SQLだけで

Comments


bottom of page