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





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

最新記事

すべて表示

Quick Sightの分析のクロスアカウントコピー

はじめに 今回のブログではQuick Sightで作成した分析をクロスアカウントコピーするための方法を紹介します。 開発環境で作成した分析を本番環境にコピーしたい時などにこの方法が使えるのではないかと思います。 2024/07/12追記...

Amazon Redshiftのクエリがなぜかたまに遅くなる原因

始めに 弊社では、膨大なデータの夜間バッチ処理にRedshiftを採用しています。 適材適所でサービスを選択しており、夜間以外はお役御免で停止しておき、費用面を抑えるよう工夫しています。 メンテナンスウィンドウも設けて運用していて概ね問題なく稼働しています。...

Comentarios


bottom of page