~~NOCACHE~~ ## S3ファイル削除のレプリケーション [[Aws:S3:NotesCrossRegionReplication|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でアラーム検知したりと色々あると思うので割愛しています。 {{tag>AWS Lambda 実践的}}