2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

CloudFormationでS3レプリケーションを試してみた

Last updated at Posted at 2022-06-04

はじめに

本記事では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リソースが異なります。

テンプレート

リソースの作成には以下のテンプレートを使用します。

ポイント
レプリケーション元とレプリケーション先で、バケットのバージョニングが有効になっている必要があります。

template.yaml
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

作成したスタックは以下になります。
CFnデプロイ結果.PNG

レプリケーションされるか確認してみる

レプリケーション元バケットにファイルをアップロードしていきます。
アップロード画面.PNG
アップロード画面2.PNG
レプリケーション元にファイルをアップロード.PNG

レプリケーション先のバケットを見てみると、ファイルがレプリケーションされていることが確認できます。
レプリケーション先にファイルがレプリケートされていることを確認.PNG

おまけ

各オブジェクトのレプリケーションステータスはどうなっているか確認してみましょう。

レプリケーション元バケットのオブジェクトは「COMPLETED」になっており、レプリケーションが成功したことがわかります。
レプリケーション元にファイルをアップロード2.PNG

レプリケーション先バケットのオブジェクトは「REPLICA」になっており、レプリケーションされたオブジェクトであることがわかります。
レプリケーション先にファイルがレプリケートされていることを確認2.PNG

ちなみに、以下の場合は「-」になります。
・レプリケーション先バケットに直接アップロードしたオブジェクト
・レプリケーションを設定していないバケットにアップロードされたオブジェクト
レプリケーション先バケットにファイルを直接アップロード.PNG

おわりに

今回は同一アカウントでのS3レプリケーションを試しました。
次回は、別アカウント間のレプリケーションや多段レプリケーションなど様々なパターンを試してみようと思います。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?