- 新しい順
- 投票が多い順
- コメントが多い順
私のAWSアカウントで試してみました。
S3→Lambda→S3の構成で無限ループさせましたが止まりませんでした。
Lambdaのコードは以下のようにしてS3にアップロードしています。(テストする際は注意してください)
import json
import boto3
from datetime import datetime
s3 = boto3.client('s3')
def lambda_handler(event, context):
file_contents = '[{"name": "tomoki","age": 21},{"name": "yamaoka","age": 21}]'
bucket = 'kobayashi-lambda'
key = 'test_' + datetime.now().strftime('%Y-%m-%d-%H-%M-%S') + '.json'
response = s3.put_object(Body=file_contents, Bucket=bucket, Key=key)
return response
結果としては以下のように65個オブジェクトが作成されました。(途中でS3の設定とLambdaを削除して無理やり止めました)
上記のS3→Lambda→S3の構成は止まらないと以下のブログでも紹介されていました。
おそらく2024年10月現在はこの構成では対応していないのではないかと思います。
https://thaimai.tech/aws-lambda-recursion-detection-feature-added-s3/
通知の内容は、S3とLambda間で直接的なループが発生する場合(S3→Lambda→S3→Lambda)にも適用されます。
AWS Lambdaは、関数の再帰的な呼び出しを検出し、一定回数後に終了させる機能を持っています。この機能は、S3がLambda関数のイベントソースやトリガーとして直接設定されていない場合でも、S3を経由して間接的に再帰呼び出しが発生するシナリオをカバーするように拡張されました。
つまり、S3→Lambda→S3→Lambdaのようなパターンでも、約16回の再帰呼び出し後に検出され、終了されます。この仕組みは、意図しない無限ループによるリソースの過剰消費や予期せぬコストの発生を防ぐために実装されています。
ただし、S3、SNS、Lambda間など、より複雑なループパターンについても同様に検出される可能性がありますが、具体的な動作はループの構造や各サービスの設定によって異なる場合があります。
重要なのは、この機能がS3とLambda間の直接的な再帰呼び出しだけでなく、S3を経由する間接的な再帰呼び出しも対象としていることです。したがって、システム設計時にはこの動作を考慮し、意図しない再帰呼び出しが発生しないよう注意する必要があります。
Sources
Invoke a Lambda function from an Amazon S3 trigger - AWS Lambda
Tutorial: Using an Amazon S3 trigger to invoke a Lambda function - AWS Lambda
関連するコンテンツ
- AWS公式更新しました 10ヶ月前