Amazon S3 イベント通知で Lambda 関数がトリガーされないのはなぜですか?

最終更新日: 2020 年 2 月 7 日

AWS Lambda 関数をトリガーするように Amazon Simple Storage Service (Amazon S3) のイベント通知を設定しました。イベントが発生したときに関数が想定どおりにトリガーされないのはなぜですか?

簡単な説明

以下のすべてが正しく設定されていることを確認してください。

解決方法

Amazon S3 のイベントタイプ

Amazon S3 のイベント通知を設定するときは、サポートされている Amazon S3 イベントタイプ (PUT、POST、COPY、CompleteMultipartUpload など) が Amazon S3 から通知を送信するように指定します。指定しなかったイベントタイプが S3 バケットで発生しても、Amazon S3 は通知を送信しません (Lambda 関数をトリガーしません)。

たとえば、S3 バケットにオブジェクトをコピーしようとしている場合、イベント通知が POST イベントのみに設定されていると、COPY イベントによって関数がトリガーされることはありません。

オブジェクトキー名のフィルター

Amazon S3 イベント通知は、オブジェクトキー名のフィルタリングを使用するようにを設定できます。設定すると、Amazon S3 は、特定のキー名のプレフィックスまたはサフィックスを持つオブジェクトに対してのみ通知を発行して、Lambda 関数をトリガーします。

プレフィックスまたはサフィックスの値に以下の特殊文字を使用する場合は、URL エンコード (パーセントエンコード) 形式で入力する必要があります。

  • 16 進数の 00~1F (10 進数の 0~31) および 7F (10 進数の 127) の ASCII 文字範囲
  • ドル記号 (「$」)
  • アンパサンド (「&」)
  • プラス記号 (「+」)
  • カンマ (「,」)
  • コロン (「:」)
  • セミコロン (「;」)
  • 等号 (「=」)
  • 疑問符 (「?」)
  • アットマーク (「@」)
  • スペース (「 」)

たとえば、プレフィックスの値を「test=abc/」として定義するには、その値に「test%3Dabc/」と入力します。

注意: ワイルドカード文字 (「*」) は、フィルターで任意の文字を表すプレフィックスまたはサフィックスとして使用することはできません。

回避する必要がある文字のリストなどの詳細については、オブジェクトキーの命名のガイドラインを参照してください。

Lambda のアクセス許可

Lambda 関数のリソースベースのポリシー では、特定の Amazon S3 バケットが関数を呼び出すことを許可する必要があります。Amazon S3 コンソールを使用して新しいイベント通知を追加すると、これらのアクセス許可が自動的にそのポリシーに追加されます。

注意: コンソールを使用する場合とは異なり、AWS コマンドラインインターフェイス (AWS CLI) 経由で put-bucket-notification-configuration を使用して新しいイベント通知を追加しても、Lambda 関数ポリシーは更新されません。

ただし、ある時点でアクセス権限を削除した場合、Amazon S3 イベント通知が期待どおりには関数の呼び出を行わないことがあります。

ポリシーをチェックして、必要なアクセス権限があることを確認し、必要に応じて追加します。必要なアクセス許可を追加する方法については、Lambda 関数をトリガーする Amazon S3 イベント通知を作成するときに「Unable to validate the following destination configurations (以下の送信先設定を検証できません)」というエラーが表示されるのはなぜですか? を参照してください。

Lambda の同時実行

Lambda 関数は、受信する Amazon S3 イベント通知の同時実行を処理できるように設定する必要があります。関数がスケーリングできるよりも速くリクエストが届いた場合、または関数の同時実行数が最大である場合、Lambda はこれらのリクエストを調整し、自動的に再試行する前にバックオフします。詳細については、非同期呼び出しおよび AWS Lambda 関数スケーリングを参照してください。