概要
S3 にファイルが置かれたら Lambda 関数で処理する。この仕組みを運用していると、「invoices/ のファイルは処理されるのに、reports/ のファイルだけが処理されない」ということが起こります。Lambda のログを見てもエラーは出ておらず、そもそも関数が呼ばれた形跡がありません。
全部のファイルで失敗しているなら、Lambda の権限やタイムアウト、関数のコードを疑います。しかし特定のフォルダだけが動かず、ログにも何も残っていないなら、疑うべきは S3 側の イベント通知のフィルター(プレフィックス・サフィックス)です。フィルターに合わないオブジェクトは、そもそも通知が出ないため、関数は呼ばれません。
この記事では、イベント通知のフィルターがどう判定されるか、書き間違えやすい点(ワイルドカードは使えない、など)と、通知どうしでフィルターを重ねられない制約を整理します。実践では、わざとワイルドカードを入れたサフィックスで通知を作り、reports/ のファイルで Lambda が呼ばれないことを確かめてから直します。

クラウドおさる猿山のバナナ倉庫でも、「北の棚に荷が届いたら知らせよ」と見張り番に頼んでおくと、南の棚の荷には誰も気づかぬのでござる。今日は、その見張りの頼み方(フィルター)を確かめるでござるよ。
この記事のメリット
- S3 イベント通知のプレフィックス・サフィックスのフィルターがどう判定されるかを説明できるようになる
- 「特定のフォルダだけ処理されない」ときに、権限やタイムアウトではなくフィルターを疑う理由が分かる
- フィルターにワイルドカードが使えないこと、スペースや特殊文字の書き方が分かる
- 同じイベントタイプで重なるフィルターを設定できない制約を理解できる
- コンソールでイベント通知を作成・編集し、Lambda が呼ばれたかどうかをログで確かめられるようになる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。


クラウドおさる



はじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。



基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説
S3 イベント通知の仕組み
S3 イベント通知は、バケットでオブジェクトの作成・削除などが起きたときに、その情報を送信先へ送る機能です。送信先には Lambda 関数、SQS キュー、SNS トピックを指定できます(EventBridge へ送ることもできます)。
1 つの通知設定は、次の要素でできています。
| 要素 | 内容 |
|---|---|
| イベント名 | 通知設定の名前。Lambda に届くイベントの configurationId にも入る |
| プレフィックス | オブジェクトキーがこの文字列で始まるときだけ通知する(例: reports/) |
| サフィックス | オブジェクトキーがこの文字列で終わるときだけ通知する(例: .csv) |
| イベントタイプ | どの操作で通知するか(例: すべてのオブジェクト作成イベント) |
| 送信先 | Lambda 関数・SQS キュー・SNS トピック |
S3 にフォルダの実体はありません。コンソールの「フォルダ」は、キーの先頭の reports/ のような部分を区切って見せているだけです。そのため、「フォルダごとに通知する」設定は、実際にはキーの先頭の文字列(プレフィックス)が一致するかの判定になります。


フィルターの書き方で間違えやすい点
フィルターは文字列の前方一致・後方一致で判定されます。正規表現やワイルドカードではありません。
| 書き方 | 結果 |
|---|---|
サフィックス .csv | reports/2026-10.csv は一致する |
サフィックス *.csv | 一致しない。ワイルドカード(*)はフィルターに使えず、* という文字そのものとして扱われるので、キーが *.csv で終わらない限り通知されない(試したところ、f*.csv だけが通知され、e.csv は通知されませんでした) |
プレフィックス /reports/ | 一致しない。キーは reports/2026-10.csv で、先頭に / は付かない |
プレフィックス Reports/ | 一致しない。試したところ、フィルターは大文字と小文字を区別しました(Reports/b.csv だけが通知され、reports/a.csv は通知されませんでした。サフィックス .CSV でも c.csv は通知されませんでした) |
| プレフィックス・サフィックスにスペースを含める | スペースは + に置き換えて指定する。その他の特殊文字は URL エンコード(パーセントエンコード)した形で指定する |



「*.csv」と書くと、いかにも全部の CSV を拾ってくれそうに見えるのでござる。ところが S3 のフィルターはワイルドカードを解さぬので、見張り番は「*.csv という名の荷」を待ち続けるのでござるぞ。
「特定のフォルダだけ動かない」の切り分け
Lambda が S3 のイベントで動かないとき、原因によって影響の出方が違います。どこまで影響が出ているかで、見る場所を絞り込めます。
| 症状 | 疑うところ |
|---|---|
| 特定のフォルダ(プレフィックス)や拡張子だけ動かない。Lambda のログに何も出ない | イベント通知のフィルター(プレフィックス・サフィックスのつづり、ワイルドカード、大文字小文字)とイベントタイプ |
| どのフォルダでも関数が呼ばれない | 関数のリソースベースポリシー(S3 からの呼び出しの許可)、通知設定そのものが無い |
| 関数は呼ばれるが、ログにエラーが出る | 実行ロールの権限(AccessDenied)、タイムアウト、コードの不具合 |
権限やタイムアウトの問題であれば、フォルダに関係なく同じように失敗し、関数のログにエラーが残ります。ログに「呼ばれた形跡すら無い」ことと、「一部のキーだけ」という 2 つの手がかりがそろったら、フィルターを見直します。
重なるフィルターは設定できない
1 つのバケットに複数のイベント通知を作れますが、同じイベントタイプに対して、フィルターが重なる設定は作れません。重なりの判定は次のとおりです。
| 2 つの通知のフィルター(イベントタイプは同じ) | 判定 |
|---|---|
プレフィックス invoices/ と reports/ | 重ならない(有効) |
サフィックス .png と .jpg | 重ならない(両方で終わる文字列は無い。有効) |
サフィックス jpg と pg | 重なる(jpg で終わる文字列は pg でも終わる。無効) |
フィルター無し(バケット全体)と、プレフィックス images | 重なる(フィルター無しはすべてのプレフィックスと重なる。無効) |
| プレフィックスは重なるが、サフィックスが重ならない | 有効 |
イベントタイプが違えば、同じフィルターを使えます。たとえば、images/ の作成イベントを関数 A へ、images/ の削除イベントを関数 B へ送る設定は作れます。
同じオブジェクトで複数の処理を動かしたい場合は、1 つの通知を SNS トピックに送ってファンアウトするか、EventBridge に送ってルールで振り分けます。



1 つの荷に見張り番を 2 匹つけようとすると、S3 は「どちらが知らせるのか」と断ってくるのでござる。2 匹に知らせたいなら、伝令(SNS や EventBridge)を 1 匹置いて、そこから配ってもらうのでござるな。
実践
バケット soa-event-lab-<アカウントID> には、invoices/ の CSV で Lambda 関数 soa-event-lab-fn を呼ぶイベント通知 soa-invoices-csv が設定済みです。ここに reports/ の CSV 用の通知 soa-reports-csv を、わざとサフィックスを *.csv にして追加します。reports/ のファイルでは関数が呼ばれないことを確かめてから、サフィックスを直します。最後に、重なるフィルターの通知を作ろうとしてエラーになることを確かめます。
前提条件
- リージョン:
ap-northeast-1(東京) - 以下のリソースが作成済みであること
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| S3 バケット | soa-event-lab-<アカウントID> | ファイルを置くバケット。パブリックアクセスはすべてブロック | Amazon S3 でバケットを作成しオブジェクトを管理する |
| Lambda 関数 | soa-event-lab-fn | Python。受け取ったイベントのバケット名・キー・イベント名(configurationId)をログに出すだけ。S3 からの呼び出しを許可するリソースベースポリシー付き | AWS Lambda で関数を作成しイベント駆動で実行する ※S3 からの呼び出しの許可は、S3 トリガーの追加で付く |
| イベント通知 | soa-invoices-csv | プレフィックス invoices/・サフィックス .csv・すべてのオブジェクト作成イベント → soa-event-lab-fn | ― |
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| イベント通知 | soa-reports-csv | reports/ の CSV で soa-event-lab-fn を呼ぶ(最初はわざと誤ったサフィックスで作る) |
| S3 オブジェクト | invoices/2026-10.csv / reports/2026-10.csv | 通知の動作確認用 |
手順 1: 設定済みのイベント通知を確認する
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。上部の検索バーに S3 と入力し、「S3」を選択します。
バケットの一覧から soa-event-lab-<アカウントID> を開き、「プロパティ」タブを選択します。下にスクロールし、「イベント通知」のセクションに soa-invoices-csv があることを確認します。プレフィックスが invoices/、サフィックスが .csv、送信先が soa-event-lab-fn になっています。
手順 2: 誤ったサフィックスで通知を作る
「イベント通知」のセクションで「イベント通知を作成」をクリックし、以下を設定します。
- イベント名:
soa-reports-csv - プレフィックス:
reports/ - サフィックス:
*.csv(わざとワイルドカードを入れる) - イベントタイプ: 「すべてのオブジェクト作成イベント」にチェック
- 送信先: 「Lambda 関数」を選択し、「Lambda 関数から選択する」で
soa-event-lab-fnを選択


その他の項目はデフォルトのままにして、「変更の保存」をクリックします。「イベント通知」のセクションに soa-reports-csv が追加されます。サフィックスの * はワイルドカードではなく、ただの文字として保存されています。
手順 3: 2 つのフォルダにファイルを置く
上部のツールバーの CloudShell アイコンをクリックして AWS CloudShell を開き、次のコマンドで invoices/ と reports/ に CSV を 1 つずつアップロードします。
BUCKET=soa-event-lab-$(aws sts get-caller-identity --query Account --output text)
echo "id,amount" > 2026-10.csv
aws s3 cp 2026-10.csv s3://$BUCKET/invoices/2026-10.csv
aws s3 cp 2026-10.csv s3://$BUCKET/reports/2026-10.csv上部の検索バーに CloudWatch と入力し、「CloudWatch」を選択します。左側ナビゲーションの「ログ」→「ロググループ」を選択し、/aws/lambda/soa-event-lab-fn を開きます。最新のログストリームを開くと、received s3://.../invoices/2026-10.csv (notification: soa-invoices-csv) のログだけがあり、reports/2026-10.csv のログはどこにもありません。エラーのログも出ていません。


関数の権限やコードに問題があれば、invoices/ のファイルでも失敗するはずです。invoices/ は動いていて、reports/ だけは関数が呼ばれた形跡すら無いので、soa-reports-csv のフィルターを疑います。
手順 4: サフィックスを直す
S3 のコンソールに戻り、soa-event-lab-<アカウントID> の「プロパティ」タブの「イベント通知」で soa-reports-csv のチェックボックスを選択し、同じセクションの「編集」をクリックします(画面にはほかにも「編集」ボタンがあるので、イベント通知のセクションのものを押します)。
- サフィックス:
.csv(*を削除する)
「変更の保存」をクリックします。「イベント通知」の一覧の「フィルター」列で、soa-reports-csv が reports/, .csv になったことを確認します。


手順 5: もう一度ファイルを置く
設定の変更が反映されるまで、2〜3 分待ちます。保存した直後にアップロードすると、まだ古いフィルターで評価されて関数が呼ばれないことがあります。
CloudShell で、reports/ にもう一度アップロードします(同じキーで上書きしても、新しい作成イベントとして通知されます)。
aws s3 cp 2026-10.csv s3://$BUCKET/reports/2026-10.csvCloudWatch Logs の /aws/lambda/soa-event-lab-fn に戻って最新のログストリームを開くと、received s3://.../reports/2026-10.csv (notification: soa-reports-csv) のログが記録されていることを確認できます。





関数にもロールにも一切触れず、フィルターの * を消しただけで動いたでござる。「一部だけ動かない・ログも無い」ときは、まず S3 側の頼み方を見るのでござるな。
手順 6: 重なるフィルターの通知を作ってみる
最後に、reports/ の中の 2026/ だけを別の通知にしようとするとどうなるかを確かめます。S3 のコンソールで「イベント通知を作成」をクリックし、以下を設定します。
- イベント名:
soa-reports-2026-csv - プレフィックス:
reports/2026/ - サフィックス:
.csv - イベントタイプ: 「すべてのオブジェクト作成イベント」にチェック
- 送信先: 「Lambda 関数」で
soa-event-lab-fnを選択
「変更の保存」をクリックすると、「不明なエラー」と表示され、保存できません。エラーの「API レスポンス」を展開すると、Configuration is ambiguously defined. Cannot have overlapping suffixes in two rules if the prefixes are overlapping for the same event type. と原因が書かれています。同じイベントタイプで、プレフィックス reports/2026/ が reports/ と重なり、サフィックスも同じだからです。


確認できたら「キャンセル」をクリックします。



「一部だけ動かない」と「全部動かない」で、疑う場所が変わるのでござる。症状の広がり方から、フィルターか、権限か、関数そのものかを切り分けられるかが問われるでござるな。
まとめ
| 困りごと | 確認するところ |
|---|---|
| 特定のフォルダや拡張子だけ処理されず、Lambda のログに何も出ない | イベント通知のプレフィックス・サフィックス(つづり、*、先頭の /、大文字小文字)とイベントタイプ |
| どのファイルでも関数が呼ばれない | 通知設定の有無と、関数のリソースベースポリシー |
| 関数は呼ばれるがエラーになる | 実行ロールの権限、タイムアウト、コード |
| 通知を追加しようとするとエラーになる | 同じイベントタイプで、既存の通知とフィルターが重なっていないか |
- S3 イベント通知のフィルターは、キーの前方一致(プレフィックス)と後方一致(サフィックス)の文字列比較
- ワイルドカード(
*)はフィルターに使えない。スペースは+、その他の特殊文字は URL エンコードで指定する - 権限やタイムアウトの問題は全フォルダに影響する。一部のキーだけ・ログも無いならフィルターを疑う
- 同じイベントタイプで、プレフィックス・サフィックスが重なる通知は作れない。同じオブジェクトで複数の処理を動かすなら SNS や EventBridge で振り分ける
参照先
- Amazon S3 イベント通知 – Amazon Simple Storage Service
- オブジェクトキー名のフィルタリングを使用したイベント通知の設定 – Amazon Simple Storage Service
- Amazon S3 コンソールを使用したイベント通知の有効化と設定 – Amazon Simple Storage Service
- Lambda を使用した Amazon S3 イベント通知の処理 – AWS Lambda













