S3 イベント通知が特定のフォルダだけ動かないときの確認ポイント ── プレフィックスとサフィックスのフィルターを見直す

目次

概要

S3 にファイルが置かれたら Lambda 関数で処理する。この仕組みを運用していると、「invoices/ のファイルは処理されるのに、reports/ のファイルだけが処理されない」ということが起こります。Lambda のログを見てもエラーは出ておらず、そもそも関数が呼ばれた形跡がありません。

全部のファイルで失敗しているなら、Lambda の権限やタイムアウト、関数のコードを疑います。しかし特定のフォルダだけが動かず、ログにも何も残っていないなら、疑うべきは S3 側の イベント通知のフィルター(プレフィックス・サフィックス)です。フィルターに合わないオブジェクトは、そもそも通知が出ないため、関数は呼ばれません。

この記事では、イベント通知のフィルターがどう判定されるか、書き間違えやすい点(ワイルドカードは使えない、など)と、通知どうしでフィルターを重ねられない制約を整理します。実践では、わざとワイルドカードを入れたサフィックスで通知を作り、reports/ のファイルで Lambda が呼ばれないことを確かめてから直します。

フィルターに合ったオブジェクトだけが通知を出し、Lambda を呼び出す
フィルターに合ったオブジェクトだけが通知を出し、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/ のような部分を区切って見せているだけです。そのため、「フォルダごとに通知する」設定は、実際にはキーの先頭の文字列(プレフィックス)が一致するかの判定になります。

オブジェクトキーとフィルターの照合 ── 文字列の前方一致・後方一致
オブジェクトキーとフィルターの照合 ── 文字列の前方一致・後方一致

フィルターの書き方で間違えやすい点

フィルターは文字列の前方一致・後方一致で判定されます。正規表現やワイルドカードではありません。

書き方結果
サフィックス .csvreports/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 匹置いて、そこから配ってもらうのでござるな。

新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

ハンズオンガイド8 ステップ画面 5 枚

コンソールの横に開いて、チェックしながら進めましょう。

ガイドを開く

別タブで開きます。チェックはこのブラウザに保存されます。

バケット 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-fnPython。受け取ったイベントのバケット名・キー・イベント名(configurationId)をログに出すだけ。S3 からの呼び出しを許可するリソースベースポリシー付きAWS Lambda で関数を作成しイベント駆動で実行する ※S3 からの呼び出しの許可は、S3 トリガーの追加で付く
イベント通知soa-invoices-csvプレフィックス invoices/・サフィックス .csv・すべてのオブジェクト作成イベント → soa-event-lab-fn―

作成するリソース一覧

リソース種別リソース名用途
イベント通知soa-reports-csvreports/ の 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・プレフィックス reports/・サフィックス *.csv)
イベント通知の作成画面(イベント名 soa-reports-csv・プレフィックス reports/・サフィックス *.csv)

その他の項目はデフォルトのままにして、「変更の保存」をクリックします。「イベント通知」のセクションに 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 のログはどこにもありません。エラーのログも出ていません。

CloudWatch Logs のログ(invoices/2026-10.csv の受信だけが記録され、reports/ のログが無い状態)
CloudWatch Logs のログ(invoices/2026-10.csv の受信だけが記録され、reports/ のログが無い状態)

関数の権限やコードに問題があれば、invoices/ のファイルでも失敗するはずです。invoices/ は動いていて、reports/ だけは関数が呼ばれた形跡すら無いので、soa-reports-csv のフィルターを疑います。

手順 4: サフィックスを直す

S3 のコンソールに戻り、soa-event-lab-<アカウントID> の「プロパティ」タブの「イベント通知」で soa-reports-csv のチェックボックスを選択し、同じセクションの「編集」をクリックします(画面にはほかにも「編集」ボタンがあるので、イベント通知のセクションのものを押します)。

  • サフィックス: .csv(* を削除する)

「変更の保存」をクリックします。「イベント通知」の一覧の「フィルター」列で、soa-reports-csv が reports/, .csv になったことを確認します。

イベント通知の一覧(soa-invoices-csv と soa-reports-csv のプレフィックス・サフィックス)
イベント通知の一覧(soa-invoices-csv と soa-reports-csv のプレフィックス・サフィックス)

手順 5: もう一度ファイルを置く

設定の変更が反映されるまで、2〜3 分待ちます。保存した直後にアップロードすると、まだ古いフィルターで評価されて関数が呼ばれないことがあります。

CloudShell で、reports/ にもう一度アップロードします(同じキーで上書きしても、新しい作成イベントとして通知されます)。

aws s3 cp 2026-10.csv s3://$BUCKET/reports/2026-10.csv

CloudWatch Logs の /aws/lambda/soa-event-lab-fn に戻って最新のログストリームを開くと、received s3://.../reports/2026-10.csv (notification: soa-reports-csv) のログが記録されていることを確認できます。

CloudWatch Logs のログ(reports/2026-10.csv を soa-reports-csv の通知で受信したログ)
CloudWatch Logs のログ(reports/2026-10.csv を 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/ と重なり、サフィックスも同じだからです。

重なるフィルターの通知を保存しようとしたときのエラー表示(API レスポンスを展開した状態)
重なるフィルターの通知を保存しようとしたときのエラー表示(API レスポンスを展開した状態)

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

クラウドおさる

「一部だけ動かない」と「全部動かない」で、疑う場所が変わるのでござる。症状の広がり方から、フィルターか、権限か、関数そのものかを切り分けられるかが問われるでござるな。

まとめ

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

参照先

キャリア相談
クラウドおさる

独学の先に、AWS の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方も募集しています。異業種や文系からインフラエンジニアになり活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次