はじめる前に
- 必須AWS アカウントを持っていること
- 必須マネジメントコンソールにサインインできること
- あると良いLambda 関数をコンソールで作成した経験(無くても進められます。簡単なコードはこのページ内に用意します)
※ コマンドラインや SSH などの操作は一切ありません。コードはコンソールに貼り付けるだけです。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
プログラムがエラーを起こしたり、想定外の動きをしたりしたとき、「何が起きたか」を知る手がかりはログです。AWS 上で動かしたプログラム(今回は Lambda)の出力は、何も設定しなくても自動的に CloudWatch Logs という場所に集約されます。
今回は実際にログを出すプログラムを動かし、その記録がどこに・どんな構造で残るかを確かめます。
ログを残すために何か設定が必要?
いいえ。Lambda の場合、コードの中で print した内容などは自動的に CloudWatch Logs へ送られます。特別な設定は不要です。
ロググループとログストリームって何が違うの?
ロググループは「この関数のログ全部」をまとめる入れ物です。ログストリームはその中の、実行ごと(あるいは一定期間ごと)の 1 本のまとまりです。1 つのロググループの中に、複数のログストリームが並びます。
ログを出力する Lambda 関数を 1 つ作って複数回実行し、CloudWatch Logs でロググループ・ログストリームをたどって自分の出力内容を見つけ、フィルタパターンで検索する。
つくる構成
Lambda 関数が print で出力した内容が、自動的に CloudWatch Logs に記録される流れです。エージェントの追加や、ログ転送のための特別な設定は必要ありません。
出力
自動で記録
要件
以下の要件を満たし、Lambda 関数の実行記録が CloudWatch Logs に残っていることを確認してください。
| No | 要件 |
|---|---|
| 1 | リージョンは「東京(ap-northeast-1)」を使用する。 |
| 2 | Lambda 関数を 1 つ作成する。ランタイムは Python、名前は自由(例:log-demo-function)。コードは下記のものを貼り付ける。 |
| 3 | 関数を 2〜3 回テスト実行し、ログが複数件たまった状態にする。 |
| 4 | CloudWatch Logs で対応するロググループを開き、最新のログストリームから出力内容を確認し、フィルタパターンで特定の文字列を検索する。 |
import random
def lambda_handler(event, context):
request_id = random.randint(1000, 9999)
# 処理の開始をログに出力する
print(f"処理を開始しました。リクエストID: {request_id}")
print("何らかの処理をしています...")
# 処理の完了をログに出力する
print(f"処理が完了しました。リクエストID: {request_id}")
return {"requestId": request_id}
構築の進め方
「関数を作る → 動かす → ログを探す → 検索する」という順番で進みます。
-
マネジメントコンソールにサインインし、リージョンを合わせる
ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。
-
Lambda 関数を作成する
Lambda コンソールを開き、「関数の作成」→「一から作成」を選びます。関数名を自由に決め(例:
log-demo-function)、ランタイムはPythonの任意のバージョンを選んで作成します。名前は後で識別しやすいものにあとで CloudWatch Logs 側からロググループを探すとき、関数名がそのままロググループ名の一部になります。覚えやすい名前にしておきましょう。
-
コードを貼り付けて保存(Deploy)する
コードエディタの中身を、上記の要件セクションに掲載したコードに置き換えます。貼り付けたら「Deploy」ボタンを押して保存します。
-
「テスト」を 2〜3 回実行する
画面上部の「テスト」ボタンを押して関数を実行します。テストイベントの内容は今回は使わないので、初期状態のままで構いません。同じボタンをもう 2〜3 回押して、複数回実行します。
毎回違うリクエストIDに注目コードの中で
random.randintを使っているため、実行するたびに異なるリクエスト ID がログに出力されます。後でログを見比べるときの目印になります。 -
CloudWatch Logs でロググループを開く
画面上部の検索バーに
CloudWatchと入力してコンソールを開き、左メニューの「ログ」→「ロググループ」を選びます。/aws/lambda/関数名(例:/aws/lambda/log-demo-function)という名前のロググループを開き、最新のログストリームをクリックして中身を確認します。複数のログストリームが並ぶ実行のタイミングによって、ログストリームが 1 本にまとまっていたり、複数に分かれていたりします。まずは一番上(最新)のものから開いてみましょう。
-
フィルタパターンで検索する
ロググループの画面にある「ログの検索」(フィルタパターンの入力欄)に、特定の文字列(例:
完了)を入力して、その文字列を含む行だけに絞り込みます。
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。
「CloudWatch Logs を開いても、対応するロググループが出てこない」
ロググループの名前は 命名規則 /aws/lambda/関数名 になっています。一覧の検索欄にこの形式で関数名を入力してみましょう。また、最初の実行が終わるまでロググループは作られません。関数を作っただけでまだ一度も実行していない場合は、テスト実行を行ってから探してみてください。
「複数回実行したのに、同じストリームに見えたり、別々に見えたりする」
一定時間内に行われた実行は、同じログストリームに追記されることがあります。逆に、時間が空いたり実行環境が新しく用意されたりすると、新しいログストリームが作られます。「実行回数 = ログストリームの数」とは限らない、という前提で見直してみましょう。
完了チェック
要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。Lambda・CloudWatch Logs のコンソールを開いて、次を順に確かめましょう。
- Lambda コンソールで、関数を2〜3 回テスト実行した結果(実行結果やレスポンス)が表示されている。
- CloudWatch Logs の「ロググループ」一覧に、
/aws/lambda/関数名という名前のロググループが存在している。 - そのロググループの中に、ログストリームが 1 つ以上存在している。
- ログストリームの中に、自分のコードで出力した「処理を開始しました」「処理が完了しました」などの文字列と、ランダムなリクエスト ID が表示されている。
- 「ログの検索」にフィルタパターンを入力すると、該当する行だけに絞り込まれる。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- ログが自動で残る設計になっていることは、トラブル対応にどう役立つでしょうか。
ヒント
プログラムが予期しないエラーを起こしたとき、何も記録が残っていなければ「何が起きたか」を後から調べる手段がありません。実行のたびに自動で記録が残ることで、問題が起きてから原因を遡って調べられる、という観点で考えてみましょう。 - 同じ関数を同時に複数回実行すると、ログストリームはどうなりそうでしょうか。
ヒント
Lambda は、同時に来た複数のリクエストを処理するために、実行環境を並行していくつも用意することがあります。それぞれの実行環境が別々にログを書き出すとすれば、ログストリームの数と実行のタイミングの関係はどうなるか、考えてみましょう。 - ログの量がどんどん増えていくと、何が起きると思いますか。
ヒント
ログをずっと保持し続けると、保存量に応じた料金が積み重なっていきます。また、量が増えるほど、見たい行を探し出すのも大変になります。「どれくらいの期間残すか(保持期間)」と「検索のしやすさ」のバランスという観点で考えてみましょう。
後片づけ
作成したリソースを片づけます。Lambda 関数本体と、それに紐づくロググループの両方を確認しましょう。
- Lambda 関数を削除する:Lambda コンソールの関数一覧から、作成した関数(例:
log-demo-function)を選び、削除します。 - 対応するロググループを削除する:Lambda 関数を削除しても、CloudWatch Logs 側のロググループは自動では消えない場合があります。CloudWatch Logs コンソールの「ロググループ」一覧から
/aws/lambda/関数名を選び、削除します。
削除するのは、このハンズオンで自分が作った関数のロググループだけ
ロググループの一覧には、すでに動いている他の Lambda 関数や仕組みのロググループが並んでいるかもしれません。間違えて削除しないよう、このハンズオンのために付けた関数名に対応するロググループだけを選んで削除してください。
コストに関する注意: Lambda の実行は、今回のような少量のテスト実行であれば無料利用枠の範囲内に収まることが多いです。CloudWatch Logs はログの取り込み量・保存量に応じた料金がかかりますが、今回程度の少量のログであれば、こちらも無料利用枠の範囲内に収まることが多いです。ただし、ロググループの保持期間を「失効しない」のままにしておくと、ログが積み重なり続けて料金に影響することがあります。学習が終わったら、上の「後片づけ」でロググループを削除するか、保持期間を短く設定しておくとよいでしょう。