← ハンズオン一覧に戻る

AWS Hands-on / Serverless

ファイルが置かれたら自動でプログラムが動く

S3 にファイルがアップロードされた瞬間に、Lambda 関数が自動で動く仕組みを作ります。ボタンを押さなくても、出来事(ファイルの追加)をきっかけにプログラムが走る——「イベント駆動」という、自動化の基本のかたちを体験します。コードは 1 行ずつ言葉で説明します。

● Lv.2 基本的なリソースを作れる人 ⏱ 所要 40〜60 分 すべてコンソールで完結
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須Lambda 関数をコンソールで作り、テスト実行した経験があること
  • 必須S3 でバケットを作り、ファイルをアップロードした経験があること
  • あると良い「ログ(処理の記録)」という言葉をなんとなく知っている

※ このハンズオンは すべてコンソールだけで完結します。プログラムが動いたかどうかは、画面上の「ログ」で確認します。

🌱 プログラミングがはじめての人へ

コードはこのページにすべて用意してあります。コピーして貼り付けるだけで動きます。書いてある内容は 1 行ずつ日本語で説明するので、いま意味が分からなくても大丈夫。「ファイルを置くと、勝手にプログラムが動く」体験が目的です。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

プログラムは「テストボタンを押したら動く」だけでは、自動化になりません。実際の業務では、何かの出来事が起きたら、それをきっかけに自動で処理が走ってほしいはずです。たとえば「画像がアップロードされたら、自動で小さいサイズを作る」「ファイルが届いたら、自動で中身をチェックする」といった具合です。

こうした「出来事をきっかけに動く」やり方を イベント駆動 と呼びます。Lambda は、S3 へのファイルのアップロードなど、さまざまな出来事をきっかけ(トリガー)にして自動で動かせます。今回は、S3 にファイルを置くと Lambda が自動で動き、「どんな名前のファイルが置かれたか」をログ(記録)に書き出す仕組みを作ります。

「トリガー」って何?

トリガーとは「動き出すきっかけ」のことです。今回のきっかけは「S3 にファイルがアップロードされたこと」。このきっかけが起きると、AWS が自動で Lambda 関数を呼び出してくれます。

関数は、置かれたファイルのことをどうやって知るの?

きっかけが起きると、AWS は「どのバケットに、どんな名前のファイルが置かれたか」という情報を関数に渡します(これが event です)。関数はその中からファイル名を取り出して使えます。今回はファイルの中身までは読まず、名前だけを使います。

Goal

S3 バケットへのファイルのアップロードをきっかけに Lambda 関数が自動で動くようにし、アップロードしたファイルの名前が、ログ(CloudWatch Logs)に書き出されることを確認する。

04 — Architecture

つくる構成

S3 にファイルがアップロードされると、それをきっかけに Lambda 関数が自動で動きます。関数は、渡された情報からファイル名を取り出し、ログに書き出します。あとからログを見て、動いたことを確認します。

S3 バケット
ファイルをアップロード
(これがきっかけ)
Lambda 関数
自動で動き
ファイル名を取り出す
ログ(記録)
CloudWatch Logs
ファイル名が残る
ボタンを押さなくても、ファイルを置くだけで関数が動きます。これが「出来事をきっかけに動く(イベント駆動)」という考え方です。
05 — Requirements

要件

以下の要件を満たし、ファイルをアップロードすると関数が自動で動くことを確認してください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2きっかけ用の S3 バケットを 1 つ作成する(名前は世界で一意。非公開のままでよい)。
3Lambda 関数を 1 つ作成する。ランタイムは Python(最新版でよい)。本文のサンプル(ファイル名をログに書き出す)に置き換えて保存(デプロイ)する。
4関数に S3 トリガーを追加し、手順 2 のバケットへのアップロード(オブジェクト作成)をきっかけにする。
5バケットにファイルをアップロードして、関数を自動で動かす。
6関数のログ(CloudWatch Logs)に、アップロードしたファイルの名前が記録されていることを確認する。
06 — Steps

構築の進め方

「バケットを用意 → 関数を作る → きっかけ(トリガー)でつなぐ → ファイルを置いてログを見る」の順に進みます。コードは貼り付けるだけ。意味は 1 行ずつ説明します。

  1. リージョンを合わせ、きっかけ用の S3 バケットを作る

    リージョンが東京であることを確認し、S3 コンソールでバケットを 1 つ作成します(名前は世界で一意。非公開のままで構いません)。このバケットへのアップロードを、関数を動かすきっかけにします。

  2. Lambda 関数を作り、コードを貼り付ける

    Lambda コンソールで「関数の作成」→「一から作成」を選び、関数名 on-upload-function、ランタイム Python(最新版)で作成します。「コードソース」の中身をすべて消して、次のコードを貼り付け、「Deploy」で保存します。

    📝 ざっくり言うと:アップロードされたファイルの名前を、ログ(記録)に書き出すプログラムです。(細かい意味は、コードの下で 1 行ずつ説明します)

    lambda_function.py(このまま貼り付け)
    def lambda_handler(event, context):
        record = event["Records"][0]
        bucket = record["s3"]["bucket"]["name"]
        key = record["s3"]["object"]["key"]
        print("バケット: " + bucket)
        print("アップロードされたファイル: " + key)
        return "OK"
    • def lambda_handler(event, context):関数の「入口」です。今回は「ファイルがアップロードされた」という出来事の情報が event に入ってきます。
    • record = event["Records"][0]起きた出来事の情報を取り出しています。Records は出来事の一覧で、[0] は「その 1 件目」という意味です。
    • bucket = record["s3"]["bucket"]["name"]その出来事から、どのバケットかという名前を取り出して bucket に入れています。情報が入れ子になっているので、順にたどって取り出します。
    • key = record["s3"]["object"]["key"]アップロードされたファイルの名前(キー)を取り出して key に入れています。
    • print("バケット: " + bucket)print は「ログ(記録)に書き出す」命令です。バケット名をログに残します。あとで CloudWatch Logs で読めます。
    • print("アップロードされたファイル: " + key)同じく、ファイル名をログに書き出します。
    • return "OK"処理が終わったことを表すために「OK」を返しています。
    今回はファイルの「名前」だけを使う

    このコードは、ファイルの中身は読みません。アップロードの知らせに含まれる名前だけを使います。中身を読むには別の権限が必要ですが、名前を見るだけなら追加の準備は要らず、はじめての自動化にぴったりです。

  3. S3 トリガー(きっかけ)を追加する

    関数の画面で「トリガーを追加」を押し、ソースに S3 を選びます。バケットに手順 1 で作ったものを指定し、イベントタイプは「すべてのオブジェクト作成イベント」(アップロードを含むもの)を選びます。注意書きのチェックを確認して、追加します。

    トリガーを追加 — イベントタイプの選択(イメージ)

    イベントタイプ

    すべてのオブジェクト作成イベント
    アップロード方法を問わず検知する
    PUT
    PUT 操作だけを検知する

    アップロード方法によらず確実に検知できるよう「すべてのオブジェクト作成イベント」を選びます

    「きっかけ」と「動くもの」をつなぐ

    この操作で、「このバケットにファイルが置かれたら → この関数を動かす」というつながりができます。必要な許可の設定は、コンソールが自動で行ってくれます。

  4. ファイルをアップロードして、関数を自動で動かす

    S3 コンソールで、手順 1 のバケットを開き、適当なファイル(例:test.txt)をアップロードします。ボタンを押さなくても、このアップロードをきっかけに、関数が裏側で自動的に動きます。

  5. ログを見て、動いたことを確認する

    Lambda の関数画面で「モニタリング」タブ →「CloudWatch ログを表示」を開きます(CloudWatch の「ロググループ」から該当の関数のログを開いてもかまいません)。最新のログに、「アップロードされたファイル: test.txt」のように、置いたファイルの名前が記録されていれば成功です。

    ログが出るまで少し待つ

    アップロードから、ログに現れるまで数十秒ほどかかることがあります。すぐ見えなくても、少し待ってから最新のログストリームを開いてみましょう。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — ファイルを置いても、ログに何も出ない

「アップロードしたのに、関数が動いた様子がない」

①トリガーのバケットが、実際にアップロードしたバケットと同じか②イベントタイプにアップロード(オブジェクト作成)が含まれているか③ログに現れるまで少し待ったかを見直しましょう。別のバケットに置いていた、というのもよくある原因です。

Pitfall 02 — ログにエラー(KeyError など)が出ている

「関数は動いたが、エラーで止まっている」

コードが取り出そうとした情報が、渡された event の中で見つからないときに起こります。①コードを正確に貼り付け、Deploy で保存したか②字下げ(空白)を崩していないかを確認しましょう。なお、テスト機能で動かす場合は、S3 アップロードのときと event の形が違うため、実際にファイルを置いて確認するのが確実です。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。Lambda・S3・CloudWatch のコンソールを開いて、次を順に確かめましょう。

  • Lambda 関数 on-upload-function があり、コードが Deploy 済みになっている。
  • 関数の画面に、S3 トリガーが表示され、対象バケットが正しい。
  • S3 バケットに、テスト用のファイルがアップロードされている
  • 関数のログ(CloudWatch Logs)に、アップロードしたファイル名が記録されている。
  • ボタンを押していないのに、アップロードをきっかけに関数が動いたことを、ログの時刻で確認できる。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. 今回は「ファイルが置かれたら動く」でした。ボタンで動かす場合と比べて、「出来事をきっかけに自動で動く(イベント駆動)」ことには、どんな良さがあるでしょうか。
    ヒント
    人が見張って毎回ボタンを押す必要がなくなり、出来事が起きた瞬間に・夜間でも・何度でも自動で処理が走ります。「人がやる」から「仕組みがやる」へ変わる、という観点で考えてみましょう。
  2. このきっかけ(ファイルのアップロード)を使って、ログに書き出す以外にどんな自動化ができそうでしょうか。身近な「ファイルが届いたら〜したい」を想像してみましょう。
    ヒント
    画像なら小さいサイズを自動で作る、書類なら中身を読んで仕分ける、届いたら誰かに知らせる——など、いろいろ考えられます(中身を読む処理には別の権限が必要になります)。「アップロードをきっかけに、次に何を自動でやらせたいか」を考えてみましょう。
  3. S3 のアップロード以外にも、Lambda を動かすきっかけはいろいろあります。たとえば「決まった時刻になったら」自動で動かしたい場合、どんなきっかけ(サービス)と組み合わせればよいか調べてみましょう。
    ヒント
    「毎朝 9 時に」「1 時間ごとに」のように、時刻やスケジュールをきっかけに Lambda を動かす仕組みがあります。「スケジュール」「定期実行」といったキーワードで、どのサービスと組み合わせるか調べてみましょう。
10 — Clean up

後片づけ

学習で作ったものを片づけます。きっかけ(トリガー)でつながっているので、順番に外していきます。

  1. S3 トリガーを外す:Lambda 関数の画面で、追加した S3 トリガーを削除します(または次の関数削除でまとめて消えます)。
  2. Lambda 関数を削除する:「関数」一覧で on-upload-function を選び、「アクション」→「削除」で消します。
  3. S3 のオブジェクトとバケットを削除する:アップロードしたファイルを削除し、バケットを空にしてから削除します。
  4. ログを削除する(任意):CloudWatch の「ロググループ」から、この関数のロググループを削除できます。
Caution — つながりを残したままにしない

トリガーと関連リソースをまとめて片づける

トリガーを残したままバケットを使い続けると、ファイルを置くたびに関数が動き続けます。学習が終わったら、トリガー・関数・バケット・ログを片づけておきましょう。デフォルト VPC などの既定リソースは消さないようにします。

コストに関する注意: Lambda は呼び出されて動いた回数と時間に応じて課金され、毎月かなりの回数までの無料利用枠があります。S3 は保存データ量・リクエストに応じた料金(小さなファイルなら少額・無料枠の範囲が多い)、CloudWatch Logs もログの量に応じた料金(少量なら無料枠の範囲)です。今回の学習規模なら、ほぼ無料の範囲に収まることが多いですが、トリガーを残したまま大量のファイルをアップロードすると、そのぶん関数が動いて課金されます。使い終えたら、上の「後片づけ」でトリガー・関数・バケット・ログをまとめて片づけましょう。最新の料金は AWS の公式料金ページで確認してください。