先日、AWSから Amazon S3 ライフサイクルに関する重要な仕様変更のメールが届きました。

現在、S3 ライフサイクルでは、レプリケーションが失敗した場合でも、対象であればオブジェクトが有効期限切れになるか、移行されます。Amazon S3 は、レプリケーションステータス が FAILED の間、ライフサイクルがオブジェクトの有効期限切れや移行をブロックするように変更します。レプリケーションが成功し、ステータスが COMPLETED に変わると、ライフサイクルはそれらのオブジェクトの処理を再開します。

この仕様変更によって、ライフサイクルがオブジェクトを削除したりストレージクラスを変更する前に、レプリケーション設定の問題を修正する猶予期間ができるというメリットがありますね。

しかし、大きな注意点もあります!

今後は、レプリケーションが失敗したオブジェクトに気付かないと、そのオブジェクトはずっと元のストレージクラスに残り続け、想定外のストレージ料金が発生し続ける可能性があるのです。

業務でも検証する機会があったので、レプリケーション失敗を検知して通知する仕組みを構築してみました!
今回はその手順をご紹介します。

今回構築する仕組みと手順

  1. SNSトピックとサブスクリプションの作成
  2. S3バケットの作成
  3. レプリケーションルールの作成
  4. イベント通知の設定
  5. 検証

SNSトピックとサブスクリプションの作成

まずは通知の受け皿となるSNSトピックを作成し、Eメールで通知を受け取れるように設定します。

  • AWSマネジメントコンソールで「Simple Notification Service (SNS)」を検索し、移動します。
  • 左側のメニューから [トピック] を選択し、[トピックの作成] をクリックします。

  • タイプは [スタンダード] を選択します。
  • 名前にわかりやすい名前(例: S3ReplicationFailureTopic)を入力します。

  • トピックポリシーはアドバンストを選び、公式ドキュメントを参考に記入して[トピックの作成] をクリックします。
    ※S3ソースバケットの作成後に、またこのコードを修正します!

  • 作成したトピックを選択し、[サブスクリプションの作成] をクリックします。
  • プロトコル: [Eメール] を選択します。
  • エンドポイント: 通知を受け取りたいご自身のEメールアドレスを入力します。

  • [サブスクリプションの作成] をクリックします。

入力したメールアドレスに「AWS Notification – Subscription Confirmation」という件名の確認メールが届きます。メール本文内の [Confirm subscription] リンクをクリックして、承認を完了させてください。

このページに遷移したら、サブスクリプションの作成は完了です!

参考記事:宛先にイベント通知メッセージを発行するアクセス許可の付与

S3バケットの作成

次に、レプリケーションの元と先になる2つのS3バケットを作成します。

  • S3のコンソール画面に移動します。
  •  [バケットを作成] をクリックします。ソースバケットを作成します。バケット名: 一意のわかりやすい名前を付けます(例: msuzu-source-bucket)。

  • バージョニング: [有効にする] を選択します。

  • その他の設定はデフォルトのままで、[バケットを作成] をクリック!
  •  同様の手順で、デスティネーションバケットも作成します。
    ※こちらも必ずバージョニングの有効設定は忘れずに!

レプリケーションルールの作成

ソースバケットに、デスティネーションバケットへファイルをコピーするためのルールを設定します。

  • 作成したソースバケットを選択し、 [管理] タブ→[レプリケーションルール] セクションで [レプリケーションルールの作成] をクリックします。
  • レプリケーションルール名: わかりやすい名前を入力します(例: ReplicateToDestination)。
  • スコープ: [バケット内のすべてのオブジェクトに適用] を選択します。
  • 送信先: [このアカウントのバケットを選択] を選び、[参照] から先ほど作成したデスティネーションバケット(例: msuzu-destination-bucket)を選択します。
  • IAMロール: [新しいロールを作成する] を選択します。これにより、S3がレプリケーションを行うために必要な権限が自動で設定されます。

  • レプリケーションメトリクスにチェックします。

  •  [保存] をクリックしてルールを作成します。
  •  既存のオブジェクトをレプリケートしますか?と問われるので、今回は「いいえ、既存のオブジェクトをレプリケートしません。」を選択します。

イベント通知の設定

最後に、レプリケーションが失敗した際にSNSへ通知を送る設定を行います。

  • 引き続きソースバケット(msuzu-source-bucket)の設定画面を開き、[プロパティ] タブを選択します。
  •  [イベント通知] までスクロールし、[イベント通知を作成] をクリックします。

  • イベント名: 任意のわかりやすい名前を入力します。
  • イベントタイプは、 Replication: Operation failed replication にチェックを入れます。

  • 送信先: [SNS トピック] を選択します。ドロップダウンメニューから、最初に作成したSNSトピック(S3ReplicationFailureTopic)を選択します。
  •  [変更の保存] をクリックします。

以上で全ての設定は完了です!

今後、このソースバケットからのレプリケーションが何らかの理由(例: 送信先のバケットが存在しない、権限がないなど)で失敗すると、指定したEメールアドレスに通知が届くようになるはずです!

実際に通知が届くのか検証してみた

それではまず、ソースバケットに簡易ファイルをアップロードしてみます!

送信先バケットにもしっかりレプリケーションされたのを確認しました!

次に、先ほど作成したソースバケットのレプリケーションルールで、IAMロールをわざと誤ったものに設定して、あえてレプリケーションを失敗させてみました。

すると、しっかりレプリケーション失敗の通知がメールに届いていました!

便利ですね!
検証記事は以上になります。

最後までお読みいただきありがとうございました!