Amazon S3バケットを同期する際の検討ポイントをまとめてみた

S3バケットレプリケーション時のS3 Replication/S3 Batch Replication/S3 RTCの使いこなし方
2023.01.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWSのオブジェクトストレージS3は

  • コンプライアンス
  • 事業継続性
  • レイテンシーの改善
  • データのリージョン集約

などのために別のS3バケットに同期することがあります。

S3のマネージド機能を使い、リージョン間で同期する機会があったので、検討ポイントを簡単に整理します。

同期方法

同期方法は主に次の3種類があります。

手法 同期タイミング 対象オブジェクト 工数
S3 Replication ライブ 新規
S3 Batch Replication オンデマンド 既存
独自 任意 任意

S3 Replication

S3 Replication機能はS3 マネージドのライブ・レプリケーション機能です。

設定後に更新されたオブジェクトが同期対象であり、既存オブジェクトは同期対象外です。

レプリケート先は

  • アカウント(同一・別)
  • リージョン(同一・別)
  • ストレージクラス(同一・別)

など柔軟に設定可能です。

複雑な要件のために、複数の同期先や双方向の同期にも対応しています。

レプリカは作成日時を含む全てのメタデータが引き継がれます。

どういう状態のオブジェクトが同期されるのか、ドキュメントを熟読しましょう。 バージョニングやライフサイクルが絡むため、ややこしいです。

大部分のオブジェクトは15分以内にレプリケートされますが、数時間かかることもあります。 S3 Replication Time Control (S3 RTC)機能を併用すると、99.99%のオブジェクトを15分以内にレプリケートします。 同期のリアルタイム性が求められる場合は、S3 RTCを有効にしましょう。

やってみた

S3 Batch Replication

S3 Batch ReplicationはS3 マネージドのオンデマンドのレプリケーション機能です。

既存オブジェクトが同期対象です。

S3 Batch Operations機能を利用して実現されており、上記S3 Replication機能の設定を元に同期します。

既存バケット全体を新規に同期する際に、既存オブジェクトはS3 Batch Replicationで同期し、新規オブジェクトは S3 Replicationで同期というように、シームレスに併用することもできます。

ライブレプリケーションが一部失敗したときのリカバリにも使えます。

S3 Batch Replicationのオンデマンドな特性から、S3 RTC機能は併用できません。

やってみた

独自

マネージド機能を使わず、独自に実装することも可能です。

ナイーブに $ aws s3 sync コマンドでバケット間で同期したり、S3バケットへのオブジェクト単位のイベントをトリガーにリアルタイムに同期することも可能です。

前処理を挟めるなど、自由度が高い一方で、実装・運用工数も増えます。

やってみた

使い分け

  • 同期ロジックが必要 → 独自実装
  • 既存オブジェクトの同期 → S3 Batch Replication
  • 継続的同期 → S3 Replication

が大方針です。

既存オブジェクトも含めたバケット全体を継続的ニアリアルタイムに同期したい場合

  • S3 Replication
  • S3 Batch Replication
  • S3 RTC

の3機能を併用します。

同期料金

  • S3 Replication
  • S3 Batch Replication
  • S3 RTC

の3機能を利用し、東京からバージニア北部にリージョン間レプリケーション(CRR)した場合の概算コストを求めます。

主要な明細だけ列挙します。

内容 サービス Type例 Description例 適用レートのリージョン
CRRデータ転送 Data Transfer APN1-USE1-AWS-Out-Bytes $0.09 per GB - Asia Pacific (Tokyo) data transfer to US East (Northern Virginia) 同期先
S3RTC用データ転送量 S3 APN1-USE1-S3RTC-Out-Bytes $0.015 per GB - Asia Pacific (Tokyo) Data Transfer for Replication Time Control to US East (N. Virginia) 全リージョン共通
ジョブ実行 S3 APN1-BatchOperations-Jobs $0.25 per job fee for Batch Operations 同期元
ジブ実行対象オブジェクト S3 APN1-BatchOperations-Manifest $0.015 per 1 million objects in source bucket 同期元
ストレージ S3 APN1-TimedStorage-ByteHrs $0.025 per GB - first 50 TB / month of storage used 同期元/先

同一リージョンのバケットに同期する場合、「CRRデータ転送」の費用は発生しません。

概算としては

  • ストレージ
  • データ転送

の大きな数字をまず抑え、PoCなどでより精緻に算出しましょう。

例えば、毎月100GBのデータが発生し、別リージョンにレプリケートすると

  • 2バケット合わせて毎月増えるストレージコストは $0.25/GB * 100GB * 2(バケット) = $10.0
  • 毎月かかるデータ転送コストは (0.09+0.015) * 100GB = $10.5

となります。

AWSリソース設定

構成例

設定時の注意事項は次の通りです。

S3 Replication

レプリケーションの要件を熟読しましょう。

見過ごしがちな必須要件として、同期元と同期先の両方のS3バケットに対してバージョニングを有効化します。

さらに、どういうオブジェクトがレプリケートされるのか、把握しましょう。

3つのバケットを A→B→Cというように多段レプリケートできません。レプリケートされたオブジェクト(レプリカ)はレプリケーション対象外です。

同期の遅延監視

マネージド機能を利用してS3バケット間レプリケーションを利用すると、遅延状況の監視と遅延オブジェクトの通知が可能です。

CloudWatch Metricsで監視

S3バケット間の同期遅延状況は同期先リージョンのCloudWatch Metricsで監視できます。

Replicationネームスペースに以下のメトリクスが出力されます。

  • Bytes Pending Replication : レプリケーションを保留しているオブジェクトの合計バイト数。
  • Replication Latency : レプリケーションの遅延秒数
  • Operations Pending Replication : レプリケーションを保留している操作の数。

S3 RTCを有効にすると、これらメトリクスは自動的に有効化されます。 S3 RTCを利用しない場合も、有効にしましょう。

参考

S3イベントで監視

同期元のS3バケットに対してSNSなどと連携をしてイベント通知設定しておくと、レプリケーション障害時に

  • s3:Replication:OperationFailedReplication(同期失敗)

といったイベントが通知されます。

イベント通知例

{
  "Records": [
    {
      "eventVersion": "2.2",
      "eventSource": "aws:s3",
      "awsRegion": "ap-northeast-1",
      "eventTime": "2023-01-25T10:48:22.076Z",
      "eventName": "Replication:OperationFailedReplication",
      "userIdentity": {
        "principalId": "s3.amazonaws.com"
      },
      "requestParameters": {
        "sourceIPAddress": "s3.amazonaws.com"
      },
      "responseElements": {
        "x-amz-request-id": "08ba-...-fc7924841830",
        "x-amz-id-2": "VzT80+...=="
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "test",
        "bucket": {
          "name": "YOUR-SOURCE-BUCKET-NAME",
          "ownerIdentity": {
            "principalId": "123456789012"
          },
          "arn": "arn:aws:s3:::YOUR-SOURCE-BUCKET-NAME"
        },
        "object": {
          "key": "test/1.jpg",
          "size": 2583,
          "eTag": "3f2d220c530bf589efbc26e984865274",
          "versionId": "4oLoYhaCKMxWCybU7hcMIn4TSs2PC9rc",
          "sequencer": "0063D108DC7414565B"
        }
      },
      "replicationEventData": {
        "replicationRuleId": "YOUR-DEST-BUCKET-NAME",
        "destinationBucket": "arn:aws:s3:::YOUR-DEST-BUCKET-NAME",
        "s3Operation": "OBJECT_PUT",
        "requestTime": "2023-01-25T10:48:21.423Z",
        "failureReason": "DstBucketUnversioned"
      }
    }
  ]
}

特に、S3 RTCを有効にすると、99.99%の同期閾値である15分に対して、以下のイベントが通知されます。

  • OperationMissedThreshold(オブジェクトが15分間の閾値を超えても同期されていない)
  • OperationReplicatedAfterThreshold(オブジェクトが15分間の閾値を超えて同期された)

※ AWS re:Invent 2022 - Best practices for Amazon S3 replication, featuring HBO Max (STG336) から

参考

まとめ

Amazon S3のマネージド機能を積極的に活用し、S3バケットをレプリケートする方法を紹介しました。

新規オブジェクトをレプリケートしたい場合、S3 Replication機能を検討しましょう。同期のリアルタイム性が必要な場合は S3 Replication Time Control (S3 RTC)機能も併用しましょう。

既存オブジェクトの同期が必要な場合は、S3 Batch Replicationを検討しましょう。S3 Replicationの設定を流用できるため、シームレスに利用できます。

レプリケーションの遅延・失敗に備え、CloudWatch Metricsの監視やS3のレプリケーションイベントの通知も怠らないようにしましょう。

上記で実現できない場合は、何らかの作り込みを伴う可能性が高いです。

それでは。

参考