~~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 実践的}}