目次

S3ファイル削除のレプリケーション

Aws/S3/クロスリージョンレプリケーションの注意点の記事で書いたS3ファイル完全削除のレプリケーションについて、Lambdaのサンプルスクリプトを記載する。

事前準備

① レプリケーションのS3バケットを作成する。

・レプリケーション元
・レプリケーション先

② Lambda関数の作成

今回Lambda関数はPythonで作成している。

Lambda関数のポリシー

Lambda関数には、「レプリケーション先」のS3バケットのファイル削除可能なポリシーが必要

Lambda関数のトリガー

Lambda関数のトリガー(イベントタイプ)に「レプリケーション元」の「オブジェクトの削除(すべて)」をアタッチ

Lambda関数のサンプル

S3のコマンド(delete_object)では、ファイル削除が正常終了したかの結果が取得できないため前後でファイルの存在確認を実施している。
削除前にファイルが存在し、削除後にファイルが存在しなければ正常、それ以外は異常終了(バケット間でファイルの整合性がとれていない)となる。

import boto3
from botocore.exceptions import ClientError

client = boto3.client('s3')
Bucket_name = 'レプリケーション先バケット名'

def lambda_handler(event, context):
    Key_name = event['Records'][0]['s3']['object']['key']
    Version_id = event['Records'][0]['s3']['object']['versionId']
    
    Before_check = getobject(event, context, Key_name, Version_id)
    
    if Before_check == True:
        #正常終了の処理を入れる(ファイルを消す)
        client.delete_object(Bucket=Bucket_name,Key=Key_name,VersionId=Version_id)
    else:
        #異常終了の処理を入れる
        print('失敗')

    After_check = getobject(event, context, Key_name, Version_id)

    if Before_check == True and After_check == False:
        #正常終了の処理を入れる
        print('成功')
    else:
        #異常終了の処理を入れる
        print('失敗')
   

def getobject(event, context, Key_name, Version_id):
    try:
      client.head_object(Bucket=Bucket_name, Key=Key_name, VersionId=Version_id,)
      return True
    except ClientError as e:
      return False

最後に

異常終了の処理には、SQSに戻したりCloudwatchLogsでアラーム検知したりと色々あると思うので割愛しています。