AWS LambdaのS3トリガー追加のエラー

IoTのデモで、AWSのS3ストレージにファイルが置かれたらサーバーレスのLambdaでトリガーを掛けてREST APIを呼び出す、というアーキテクチャでデモを作っていました。

Lambdaで関数を何個か作って、S3トリガーを追加しようとしたのですが、こんなエラーが表示されてトリガー追加に失敗してしまいます。

AWS LambdaのS3トリガー追加のエラー
AWS 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関数を作ってS3トリガーを追加したときに、同じバケットに対してファイル新着のトリガーを設定していたのですが、その関数を削除したのでトリガーも消えたと思っていました。しかし、それが残っていたんです。

S3バケットの「プロパティ」タブから、

S3バケットのプロパティ
S3バケットのプロパティ

下にスクロールして「イベント通知」を見ると、「送信先」が削除されたLambda関数のイベント通知が登録されたままになっていました。これが原因で、同じバケットに対してファイル新着のトリガーが追加できなかったわけですね。分かりづらい。。。

S3バケットのイベント通知
S3バケットのイベント通知

このイベント通知を一旦削除します。

そしてLambdaの管理画面に戻り、新しく「トリガーを追加」ボタンからS3バケットのオブジェクト作成のイベントを追加します。

今回は問題なく追加できました。

AWS LambdaでS3トリガー追加に成功
AWS LambdaでS3トリガー追加に成功

しかしまた躓きました。Lambda関数はNodeJS(12.x)を使ってindex.jsにREST APIの呼び出しを定義していたのですが、デフォルトだとタイムアウトが3秒なので、サーバー側のリターンが間に合わず何度やってもタイムアウトになってしまいます。

index.jsにHTTPのペイロードにtimeout: 10000などを付けてやってみましたが、タイムアウトは3秒のまま。

どこで変えるのかと思ったら、Lambda関数の「設定」→「一般設定」にタイムアウトの時間が設定されています。「編集」ボタンをクリックして、3秒から10秒に変更したところ、無事にタイムアウトせずにREST APIが呼び出されるようになりました。

AWS Lambdaのタイムアウト時間の設定
AWS Lambdaのタイムアウト時間の設定

意外と躓くAWSのLambdaでした。

Categories:

No responses yet

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です