Aws/S3/クロスリージョンレプリケーションの注意点の記事で書いたS3ファイル完全削除のレプリケーションについて、Lambdaのサンプルスクリプトを記載する。
・レプリケーション元
・レプリケーション先
今回Lambda関数はPythonで作成している。
Lambda関数には、「レプリケーション先」のS3バケットのファイル削除可能なポリシーが必要
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でアラーム検知したりと色々あると思うので割愛しています。