はじめる前に
- 必須AWS アカウントを持っていること
- 必須マネジメントコンソールにサインインできること
- 必須Lambda 関数をコンソールで作り、テスト実行した経験があること
- 必須S3 でバケットを作り、ファイルをアップロードした経験があること
- あると良い「ログ(処理の記録)」という言葉をなんとなく知っている
※ このハンズオンは すべてコンソールだけで完結します。プログラムが動いたかどうかは、画面上の「ログ」で確認します。
🌱 プログラミングがはじめての人へ
コードはこのページにすべて用意してあります。コピーして貼り付けるだけで動きます。書いてある内容は 1 行ずつ日本語で説明するので、いま意味が分からなくても大丈夫。「ファイルを置くと、勝手にプログラムが動く」体験が目的です。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
print で出した内容を、CloudWatch Logs で確認する方法。動作確認で使います。
docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-logging.html
Python での Lambda 関数ハンドラーの定義↗
event から「どんな出来事が起きたか」の情報を受け取る、というお作法を確認できます。
docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-handler.html
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
プログラムは「テストボタンを押したら動く」だけでは、自動化になりません。実際の業務では、何かの出来事が起きたら、それをきっかけに自動で処理が走ってほしいはずです。たとえば「画像がアップロードされたら、自動で小さいサイズを作る」「ファイルが届いたら、自動で中身をチェックする」といった具合です。
こうした「出来事をきっかけに動く」やり方を イベント駆動 と呼びます。Lambda は、S3 へのファイルのアップロードなど、さまざまな出来事をきっかけ(トリガー)にして自動で動かせます。今回は、S3 にファイルを置くと Lambda が自動で動き、「どんな名前のファイルが置かれたか」をログ(記録)に書き出す仕組みを作ります。
「トリガー」って何?
トリガーとは「動き出すきっかけ」のことです。今回のきっかけは「S3 にファイルがアップロードされたこと」。このきっかけが起きると、AWS が自動で Lambda 関数を呼び出してくれます。
関数は、置かれたファイルのことをどうやって知るの?
きっかけが起きると、AWS は「どのバケットに、どんな名前のファイルが置かれたか」という情報を関数に渡します(これが event です)。関数はその中からファイル名を取り出して使えます。今回はファイルの中身までは読まず、名前だけを使います。
S3 バケットへのファイルのアップロードをきっかけに Lambda 関数が自動で動くようにし、アップロードしたファイルの名前が、ログ(CloudWatch Logs)に書き出されることを確認する。
つくる構成
S3 にファイルがアップロードされると、それをきっかけに Lambda 関数が自動で動きます。関数は、渡された情報からファイル名を取り出し、ログに書き出します。あとからログを見て、動いたことを確認します。
(これがきっかけ)
ファイル名を取り出す
ファイル名が残る
要件
以下の要件を満たし、ファイルをアップロードすると関数が自動で動くことを確認してください。
| No | 要件 |
|---|---|
| 1 | リージョンは「東京(ap-northeast-1)」を使用する。 |
| 2 | きっかけ用の S3 バケットを 1 つ作成する(名前は世界で一意。非公開のままでよい)。 |
| 3 | Lambda 関数を 1 つ作成する。ランタイムは Python(最新版でよい)。本文のサンプル(ファイル名をログに書き出す)に置き換えて保存(デプロイ)する。 |
| 4 | 関数に S3 トリガーを追加し、手順 2 のバケットへのアップロード(オブジェクト作成)をきっかけにする。 |
| 5 | バケットにファイルをアップロードして、関数を自動で動かす。 |
| 6 | 関数のログ(CloudWatch Logs)に、アップロードしたファイルの名前が記録されていることを確認する。 |
構築の進め方
「バケットを用意 → 関数を作る → きっかけ(トリガー)でつなぐ → ファイルを置いてログを見る」の順に進みます。コードは貼り付けるだけ。意味は 1 行ずつ説明します。
-
リージョンを合わせ、きっかけ用の S3 バケットを作る
リージョンが東京であることを確認し、S3 コンソールでバケットを 1 つ作成します(名前は世界で一意。非公開のままで構いません)。このバケットへのアップロードを、関数を動かすきっかけにします。
-
Lambda 関数を作り、コードを貼り付ける
Lambdaコンソールで「関数の作成」→「一から作成」を選び、関数名on-upload-function、ランタイム Python(最新版)で作成します。「コードソース」の中身をすべて消して、次のコードを貼り付け、「Deploy」で保存します。📝 ざっくり言うと:アップロードされたファイルの名前を、ログ(記録)に書き出すプログラムです。(細かい意味は、コードの下で 1 行ずつ説明します)
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」を返しています。
今回はファイルの「名前」だけを使うこのコードは、ファイルの中身は読みません。アップロードの知らせに含まれる名前だけを使います。中身を読むには別の権限が必要ですが、名前を見るだけなら追加の準備は要らず、はじめての自動化にぴったりです。
- def lambda_handler(event, context):関数の「入口」です。今回は「ファイルがアップロードされた」という出来事の情報が
-
S3 トリガー(きっかけ)を追加する
関数の画面で「トリガーを追加」を押し、ソースに S3 を選びます。バケットに手順 1 で作ったものを指定し、イベントタイプは「すべてのオブジェクト作成イベント」(アップロードを含むもの)を選びます。注意書きのチェックを確認して、追加します。
イベントタイプ
すべてのオブジェクト作成イベントアップロード方法を問わず検知するPUTPUT 操作だけを検知する↳アップロード方法によらず確実に検知できるよう「すべてのオブジェクト作成イベント」を選びます
「きっかけ」と「動くもの」をつなぐこの操作で、「このバケットにファイルが置かれたら → この関数を動かす」というつながりができます。必要な許可の設定は、コンソールが自動で行ってくれます。
-
ファイルをアップロードして、関数を自動で動かす
S3 コンソールで、手順 1 のバケットを開き、適当なファイル(例:
test.txt)をアップロードします。ボタンを押さなくても、このアップロードをきっかけに、関数が裏側で自動的に動きます。 -
ログを見て、動いたことを確認する
Lambda の関数画面で「モニタリング」タブ →「CloudWatch ログを表示」を開きます(CloudWatch の「ロググループ」から該当の関数のログを開いてもかまいません)。最新のログに、「アップロードされたファイル: test.txt」のように、置いたファイルの名前が記録されていれば成功です。
ログが出るまで少し待つアップロードから、ログに現れるまで数十秒ほどかかることがあります。すぐ見えなくても、少し待ってから最新のログストリームを開いてみましょう。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。
「アップロードしたのに、関数が動いた様子がない」
①トリガーのバケットが、実際にアップロードしたバケットと同じか、②イベントタイプにアップロード(オブジェクト作成)が含まれているか、③ログに現れるまで少し待ったかを見直しましょう。別のバケットに置いていた、というのもよくある原因です。
「関数は動いたが、エラーで止まっている」
コードが取り出そうとした情報が、渡された event の中で見つからないときに起こります。①コードを正確に貼り付け、Deploy で保存したか、②字下げ(空白)を崩していないかを確認しましょう。なお、テスト機能で動かす場合は、S3 アップロードのときと event の形が違うため、実際にファイルを置いて確認するのが確実です。
完了チェック
要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。Lambda・S3・CloudWatch のコンソールを開いて、次を順に確かめましょう。
- Lambda 関数
on-upload-functionがあり、コードが Deploy 済みになっている。 - 関数の画面に、S3 トリガーが表示され、対象バケットが正しい。
- S3 バケットに、テスト用のファイルがアップロードされている。
- 関数のログ(CloudWatch Logs)に、アップロードしたファイル名が記録されている。
- ボタンを押していないのに、アップロードをきっかけに関数が動いたことを、ログの時刻で確認できる。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- 今回は「ファイルが置かれたら動く」でした。ボタンで動かす場合と比べて、「出来事をきっかけに自動で動く(イベント駆動)」ことには、どんな良さがあるでしょうか。
ヒント
人が見張って毎回ボタンを押す必要がなくなり、出来事が起きた瞬間に・夜間でも・何度でも自動で処理が走ります。「人がやる」から「仕組みがやる」へ変わる、という観点で考えてみましょう。 - このきっかけ(ファイルのアップロード)を使って、ログに書き出す以外にどんな自動化ができそうでしょうか。身近な「ファイルが届いたら〜したい」を想像してみましょう。
ヒント
画像なら小さいサイズを自動で作る、書類なら中身を読んで仕分ける、届いたら誰かに知らせる——など、いろいろ考えられます(中身を読む処理には別の権限が必要になります)。「アップロードをきっかけに、次に何を自動でやらせたいか」を考えてみましょう。 - S3 のアップロード以外にも、Lambda を動かすきっかけはいろいろあります。たとえば「決まった時刻になったら」自動で動かしたい場合、どんなきっかけ(サービス)と組み合わせればよいか調べてみましょう。
ヒント
「毎朝 9 時に」「1 時間ごとに」のように、時刻やスケジュールをきっかけに Lambda を動かす仕組みがあります。「スケジュール」「定期実行」といったキーワードで、どのサービスと組み合わせるか調べてみましょう。
後片づけ
学習で作ったものを片づけます。きっかけ(トリガー)でつながっているので、順番に外していきます。
- S3 トリガーを外す:Lambda 関数の画面で、追加した S3 トリガーを削除します(または次の関数削除でまとめて消えます)。
- Lambda 関数を削除する:「関数」一覧で
on-upload-functionを選び、「アクション」→「削除」で消します。 - S3 のオブジェクトとバケットを削除する:アップロードしたファイルを削除し、バケットを空にしてから削除します。
- ログを削除する(任意):CloudWatch の「ロググループ」から、この関数のロググループを削除できます。
トリガーと関連リソースをまとめて片づける
トリガーを残したままバケットを使い続けると、ファイルを置くたびに関数が動き続けます。学習が終わったら、トリガー・関数・バケット・ログを片づけておきましょう。デフォルト VPC などの既定リソースは消さないようにします。
コストに関する注意: Lambda は呼び出されて動いた回数と時間に応じて課金され、毎月かなりの回数までの無料利用枠があります。S3 は保存データ量・リクエストに応じた料金(小さなファイルなら少額・無料枠の範囲が多い)、CloudWatch Logs もログの量に応じた料金(少量なら無料枠の範囲)です。今回の学習規模なら、ほぼ無料の範囲に収まることが多いですが、トリガーを残したまま大量のファイルをアップロードすると、そのぶん関数が動いて課金されます。使い終えたら、上の「後片づけ」でトリガー・関数・バケット・ログをまとめて片づけましょう。最新の料金は AWS の公式料金ページで確認してください。