サーバーレス実行LambdaでS3のトリガーを追加したら…
IoTのデモで、AWSのS3ストレージにファイルが置かれたらサーバーレスのLambdaでトリガーを掛けてREST APIを呼び出す、というアーキテクチャでデモを作っていました。
Lambdaで関数を何個か作って、S3トリガーを追加しようとしたのですが、こんなエラーが表示されてトリガー追加に失敗してしまいます。
エラーメッセージを読むと、Configuration is ambiguously defined.とあります。
trigger の作成中にエラー が発生しました: Configuration is ambiguously defined. Cannot have overlapping suffixes in two rules if the prefixes are overlapping for the same event type. (Service: Amazon S3; Status Code: 400; Error Code: InvalidArgument; Request ID: XXX; S3 Extended Request ID: XXX; Proxy: null)
AWS LambdaのS3トリガー追加のエラーメッセージ
Lambda関数は削除していても、トリガーは残っている
原因は、削除したLambda関数のトリガーが残っていたため、でした。以前Lambda関数を作ってS3トリガーを追加したときに、同じバケットに対してファイル新着のトリガーを設定していたのですが、その関数を削除したのでトリガーも消えたと思っていました。しかし、それが残っていたんです。
S3バケットの「プロパティ」タブから、
下にスクロールして「イベント通知」を見ると、「送信先」が削除されたLambda関数のイベント通知が登録されたままになっていました。これが原因で、同じバケットに対してファイル新着のトリガーが追加できなかったわけですね。分かりづらい。。。
このイベント通知を一旦削除します。
トリガーを削除して再度トリガーを追加
そしてLambdaの管理画面に戻り、新しく「トリガーを追加」ボタンからS3バケットのオブジェクト作成のイベントを追加します。
今回は問題なく追加できました。
Lambda関数のNodeJSのタイムアウトを3秒から変更したい
しかしまた躓きました。Lambda関数はNodeJS(12.x)を使ってindex.jsにREST APIの呼び出しを定義していたのですが、デフォルトだとタイムアウトが3秒なので、サーバー側のリターンが間に合わず何度やってもタイムアウトになってしまいます。
index.jsにHTTPのペイロードにtimeout: 10000
などを付けてやってみましたが、タイムアウトは3秒のまま。
どこで変えるのかと思ったら、Lambda関数の「設定」→「一般設定」にタイムアウトの時間が設定されています。「編集」ボタンをクリックして、3秒から10秒に変更したところ、無事にタイムアウトせずにREST APIが呼び出されるようになりました。
意外と躓くAWSのLambdaでした。
No responses yet