← ハンズオン一覧に戻る

AWS Hands-on / CI・CD

あえて失敗させて、
CloudWatch Logsで原因を探す

ビルドは失敗することがあります。重要なのは、失敗したときにどこを見て原因を特定するかです。あえて失敗するビルドを用意し、CodeBuildのフェーズ詳細とCloudWatch Logsから原因を見つけ出す練習をします。

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

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須S3バケットの作成、CodeBuildプロジェクトの作成経験
  • あると良いCloudWatch Logsを見たことがある

※ このハンズオンは すべてコンソールだけで完結します

02 — References

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

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

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

03 — Background

背景・シナリオ

ビルドは、コマンドの打ち間違いや存在しないファイルの参照など、さまざまな理由で失敗します。失敗そのものは珍しいことではありませんが、「どこで」「なぜ」失敗したのかを早く特定できるかどうかで、調査にかかる時間は大きく変わります。

今回はあえて失敗するbuildspec.ymlを用意してビルドを実行し、CodeBuildのフェーズ詳細とCloudWatch Logsのビルドログから原因を特定したうえで、修正して再実行する一連の流れを体験します。

ビルドが失敗すると、どこに記録が残るの?

ビルドの実行結果(成功・失敗)と、どのフェーズで失敗したかは、CodeBuildのビルド履歴の中に残ります。コマンドの詳しい実行結果やエラーメッセージは、CodeBuildが自動的に送っているCloudWatch Logsのログに残ります。

フェーズ詳細だけ見れば十分で、ログまで見る必要はないのでは?

フェーズ詳細で分かるのは「どのフェーズで失敗したか」までです。「具体的にどのコマンドが、どんなエラーメッセージで失敗したか」を知るには、CloudWatch Logsのログを開く必要があります。

Goal

あえて失敗するビルドを実行し、フェーズ詳細でどのフェーズが失敗したかを確認したうえで、CloudWatch Logsのビルドログからエラーメッセージの該当行を見つけ、原因に対応する修正を行って再実行し、Succeededになることを確認する。

04 — Information

見える情報の違い

フェーズ詳細だけを見る場合と、CloudWatch Logsまで見る場合とで、分かる情報の深さが変わります。

フェーズ詳細だけ見る

「BUILDフェーズが失敗した」ということは分かりますが、具体的にどのコマンドが、どんなメッセージでエラーになったのかまでは分かりません。

CloudWatch Logsまで見る

実行された各コマンドの出力がそのまま記録されており、エラーメッセージの正確な文言や、失敗したコマンドそのものを特定できます。

05 — Requirements

要件

以下の要件を満たし、失敗の調査から修正までの一連の流れを体験してください。

No要件
1あえて失敗する内容のbuildspec.ymlを含むZIPを用意し、S3の入力用バケットにアップロードする。
2CodeBuildプロジェクトを1つ作成し(ソース:Amazon S3、環境:マネージド型イメージ、サービスロール:新規作成)、ビルドを実行する。
3ビルドのステータスが「Failed」になり、フェーズ詳細でどのフェーズが失敗したかを確認する。
4CloudWatch Logsのビルドログを開き、エラーメッセージの該当行を見つける。
5原因に対応する形でbuildspec.ymlを修正し、ZIPを再アップロードしてビルドを再実行し、ステータスが「Succeeded」に変わることを確認する。
06 — Steps

構築の進め方

「あえて失敗するソースを準備する」→「実行して失敗を確認する」→「ログで原因を特定し、修正する」という順番で進めます。

  1. フェーズ1 — あえて失敗するソースを準備する
  2. マネジメントコンソールにサインインし、リージョンを合わせる

    ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。

  3. あえて失敗するbuildspec.ymlを作成し、ZIPにまとめる

    次の内容で buildspec.yml を作成します。cat コマンドが、存在しないファイルを読み込もうとする内容です。

    version: 0.2
    
    phases:
      build:
        commands:
          - echo "ビルドを開始します"
          - cat does-not-exist.txt

    このファイル1つだけをZIPにまとめます(他のファイルは不要です)。

  4. S3バケットを作成し、ZIPをアップロードする

    入力用のS3バケットを1つ作成し(名前は一意に、例:codebuild-debug-input-yourname)、手順2で作成したZIPをアップロードします。

  5. フェーズ2 — 実行して失敗を確認する
  6. CodeBuildプロジェクトを作成し、ビルドを実行する

    CodeBuildコンソールで、ソースプロバイダーに「Amazon S3」を選び、手順3のバケットとZIPのオブジェクトキーを指定してプロジェクトを作成します。環境はマネージド型イメージ・Amazon Linux・Standardのままでよく、Artifactsは「No artifacts」のままで構いません。プロジェクトを作成したら「ビルドを開始」を選びます。

  7. フェーズ詳細でステータスを確認する

    ビルドが完了すると、ステータスが「Failed」になります。フェーズ詳細の一覧で、どのフェーズ(おそらくBUILD)に失敗のマークが付いているかを確認します。

  8. フェーズ3 — ログで原因を特定し、修正する
  9. CloudWatch Logsのビルドログを開く

    ビルド詳細ページの「ビルドログ」を確認し、「View entire log(ログ全体を表示)」からCloudWatch Logsのログストリームを開きます。ログの末尾付近に、実行したコマンドとエラーメッセージが記録されています。

    [Container] ビルドを開始します
    cat: does-not-exist.txt: No such file or directory
  10. buildspec.ymlを修正し、再実行する

    原因(存在しないファイルを参照していること)に対応する形で、cat does-not-exist.txt の行を削除(または存在するファイルを参照する内容に変更)し、ZIPを作り直して同じS3バケットにアップロードします。CodeBuildプロジェクトの設定でオブジェクトキーが同じであれば、再度「ビルドを開始」するだけで新しい内容が反映されます。

    これがゴール

    最初は何が起きているのか分からなかった失敗が、ログを見て原因が特定でき、修正後にSucceededへ変わる——この一連の流れを確認できたら、このハンズオンの目的は達成です。

07 — Pitfalls

つまずきポイント

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

Pitfall 01 — どのフェーズで失敗したか分からない

「Failedとは表示されるが、どこで失敗したのか見つけられない」

フェーズ詳細の一覧を上から順に見て、ステータス列に失敗を示す表示がどの行に付いているかを見直しましょう。

Pitfall 02 — ログのどこが原因か分かりにくい

「ログの量が多くて、エラー箇所を見つけられない」

エラーは多くの場合、ログの末尾近く(処理が止まった直前)に現れます。「Filter events(イベントのフィルター)」機能でキーワードを絞り込む方法も見直してみましょう。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。

  • 最初のビルドの履歴で、ステータスが「Failed」になっている。
  • フェーズ詳細で、BUILD フェーズに失敗のマークが付いている。
  • CloudWatch Logsのログに、No such file or directory のようなエラーメッセージが表示されている。
  • 修正後に再実行したビルドの履歴で、ステータスが「Succeeded」に変わっている。
09 — Think

考えてみよう

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

  1. ログを見る習慣がない場合、原因の特定にどれくらい時間がかかりそうでしょうか。
    ヒント
    エラーメッセージを読まずに、コードを推測だけで直そうとした場合との違いを考えてみましょう。
  2. 同じような失敗が何度も起きる場合、どのような対策が考えられるでしょうか。
    ヒント
    毎回ログを見て直す方法と、最初からミスが起きにくい仕組みにしておく方法、それぞれの手間を比べてみましょう。
  3. ビルドが失敗したことに、人が気づかずに放置されてしまうと、どんな問題が起こり得るでしょうか。
    ヒント
    失敗を自動的に知らせる仕組みがない場合、誰がいつ気づくのかを考えてみましょう(このハンズオンでは扱っていない発展的な内容です)。
10 — Clean up

後片づけ

作成したリソースを順番に削除します。

  1. CodeBuildプロジェクトを削除する:CodeBuildコンソールのプロジェクト一覧から削除します。
  2. CloudWatch Logsのロググループを削除する:プロジェクトを削除してもログは自動的には消えません。不要であれば、CloudWatch Logsコンソールから該当のロググループ(/aws/codebuild/プロジェクト名)を削除します。
  3. 自動作成されたIAMロールを削除する:プロジェクト作成時に新規作成したサービスロールが残っている場合は、IAMコンソールから削除します。
  4. S3バケットを空にして削除する:入力用バケットの中身を削除してから、バケット本体を削除します。

コストに関する注意: CodeBuild は、ビルドの実行時間(分)に応じて課金されます。失敗したビルドも、実行された時間分は課金の対象です。CloudWatch Logs は、ログの取り込み量と保存量に応じて課金されます。少量のログであれば料金はごく小さく済みますが、ロググループを削除せずに放置すると蓄積され続けるため、不要になったら削除しましょう。S3の保存容量・リクエストにも別途料金がかかりますが、少量であれば無料利用枠の範囲内に収まることが多いです。最新の料金は AWS の公式料金ページで確認してください。