S3にアップロードしたファイルを時間経過で自動削除するタイマー機能を実装してみる

S3を一時的なファイル置き場として利用したくて、アップロードから一定時間でファイル削除できないかなと思っていました。
S3には標準でライフサイクル設定があるので、そちらを使用してもよかったのですが、日数でしかコントロールができず、 さらにファイル単位で制御できないので機能を作りこんでみました。
このサイトの機能を作成するとS3にファイルがアップロードされた後に設定した秒数だけ保持してファイル削除されます。
S3には標準でライフサイクル設定があるので、そちらを使用してもよかったのですが、日数でしかコントロールができず、 さらにファイル単位で制御できないので機能を作りこんでみました。
このサイトの機能を作成するとS3にファイルがアップロードされた後に設定した秒数だけ保持してファイル削除されます。
使用例
このページのLambdaと他のAWSサービスを使用することで以下のようなことが実現できます。
各サービスとの連携はAWSのサービスドキュメントを確認しながら実装してください。
- ユーザーが自由にファイルを置けるS3バケットにて、ファイルの配置しておける時間を6時間とする。
- S3でファイルの受け渡しを行うが、機密レベルが高いファイルなのでアップロード後15分で自動削除する。
各サービスとの連携はAWSのサービスドキュメントを確認しながら実装してください。
構成図
S3からイベント通知でLambdaを起動して、StepFunctionsの実行を開始させます。
StepFunctionsはタイマー機能です。
既定の時間が過ぎると次のファイル削除用のLambdaを実行してS3上のファイルを削除します。
StepFunctionsはタイマー機能です。
既定の時間が過ぎると次のファイル削除用のLambdaを実行してS3上のファイルを削除します。

Lambdaソースコード
◆StepFunctions起動用import boto3
import json
stepfunctions_client = boto3.client('stepfunctions')
def lambda_handler(event, context):
stepfunctions_client.start_execution(
stateMachineArn='<実行対象のStepFunctionsのARN>',
input=json.dumps(event)
)
return 0
◆S3ファイル削除用
import boto3
import json
s3_client = boto3.resource('s3')
def lambda_handler(event, context):
bucketName = event["Records"][0]["s3"]["bucket"]["name"]
objectKey = event["Records"][0]["s3"]["object"]["key"]
s3_client.Object(bucketName, objectKey).delete()
return 0
権限(IAMロール設定)
LambdaにアタッチするIAMロールに「states:StartExecution」、「s3:DeleteObject」の権限を付与してください。
解説
紹介した機能のフローは以下の通りです。
①S3のプロパティ画面から「イベント通知を作成」から始めます。

②イベント名にお好きな名前を入れて、イベントタイプは「すべてのオブジェクト作成イベント」にします。

③送信先ではStepFunctions起動用のLambdaを指定します。

StepFunctionsのフロー内容も紹介しておきます。
①第1ステートで「Wait State」を設定します。秒の設定欄で待機時間を指定できます。
※画像では12時間待機の設定にしています。

②第2ステートで「Lambda: Invoke」を設定します。関数名にS3ファイル削除用のLambdaを指定します。

S3のアップロードイベントから直接StepFunctionsが起動できないので、一度Lambdaを経由させる構成にしています。
削除までの猶予時間が15分以内ならStepFunctionsを使わず、Lambdaだけでもいいのですが、Lambdaは最大15分しか実行できないのでStepFunctionsで待機させる方式にしています。
S3にアップロードされたファイル名等の情報はイベント通知からLambda、StepFunctionsを経由していく中でそれぞれ引数を受け渡ししています。
最後のS3ファイル削除用Lambdaまで最初にアップロードされたS3ファイルの情報が伝わり、そのファイルが削除されます。
一度に複数のファイルがアップロードされても、StepFunctionsが並行で稼働するのでファイル毎に待機が管理されます。
- S3のイベント通知機能でStepFunctions起動用Lambdaを実行
- StepFunctionsを起動
- StepFunctionsのWait Stateで既定の時間で待機
- Lambda InvokeからS3ファイル削除用Lambdaを実行
①S3のプロパティ画面から「イベント通知を作成」から始めます。

②イベント名にお好きな名前を入れて、イベントタイプは「すべてのオブジェクト作成イベント」にします。

③送信先ではStepFunctions起動用のLambdaを指定します。

StepFunctionsのフロー内容も紹介しておきます。
①第1ステートで「Wait State」を設定します。秒の設定欄で待機時間を指定できます。
※画像では12時間待機の設定にしています。

②第2ステートで「Lambda: Invoke」を設定します。関数名にS3ファイル削除用のLambdaを指定します。

S3のアップロードイベントから直接StepFunctionsが起動できないので、一度Lambdaを経由させる構成にしています。
削除までの猶予時間が15分以内ならStepFunctionsを使わず、Lambdaだけでもいいのですが、Lambdaは最大15分しか実行できないのでStepFunctionsで待機させる方式にしています。
S3にアップロードされたファイル名等の情報はイベント通知からLambda、StepFunctionsを経由していく中でそれぞれ引数を受け渡ししています。
最後のS3ファイル削除用Lambdaまで最初にアップロードされたS3ファイルの情報が伝わり、そのファイルが削除されます。
一度に複数のファイルがアップロードされても、StepFunctionsが並行で稼働するのでファイル毎に待機が管理されます。
使い方
StepFunctionsのWait Stateでファイルを削除するまでの待機時間を設定します。
1時間なら3600、6時間なら21600、12時間なら43200に設定すればOKです。
後は、S3にファイルが配置されるためにイベント通知からLambdaを経由してStepFunctionsが起動されますので、そこで削除までの猶予時間を待機されます。
猶予時間が終わるとS3ファイル削除用のLambdaが起動するのでアップロードされたファイルが自動的に削除されます。
1時間なら3600、6時間なら21600、12時間なら43200に設定すればOKです。
後は、S3にファイルが配置されるためにイベント通知からLambdaを経由してStepFunctionsが起動されますので、そこで削除までの猶予時間を待機されます。
猶予時間が終わるとS3ファイル削除用のLambdaが起動するのでアップロードされたファイルが自動的に削除されます。