← ハンズオン一覧に戻る

AWS Hands-on / CI・CD

S3に置いたソースを、
CodeBuildで自動的にビルドする

AWS CodeBuild は、決められたビルド手順を自動的に実行してくれるサービスです。ソースコードをS3に置き、ビルド手順を書いた設定ファイルとあわせてCodeBuildに渡し、成果物がS3に自動的に出力されるところまでを体験します。

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

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須S3バケットの作成・ファイルアップロードの基本操作
  • あると良いYAML形式のファイルを見たことがある(インデントで構造を表す書き方)

※ このハンズオンは すべてコンソールだけで完結します。ローカルではテキストファイルの作成とZIP圧縮だけ行います。

02 — References

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

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

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

03 — Background

背景・シナリオ

ソフトウェアを配布できる形にするには、インストール・コンパイル・パッケージ化といった、いくつかの決まった手順を踏む必要があります。これらを毎回手作業で行うのは手間がかかりますし、手順を間違えるミスも起こりがちです。

AWS CodeBuild を使うと、こうしたビルド手順を「buildspec.yml」という設定ファイルにあらかじめ書いておき、ソースコードを置くだけで自動的に同じ手順を実行させられます。今回はS3に置いたソースをCodeBuildでビルドし、成果物が別のS3バケットに自動的に出力されるところまでを体験します。

CodeBuildの「ビルド」は、必ずプログラムのコンパイルが必要なの?

いいえ。CodeBuildにとっての「ビルド」は、buildspec.ymlに書かれたコマンドを順番に実行することです。コンパイルのようなプログラミング的な処理である必要はなく、ファイルのコピーや文字列の書き込みのような単純なコマンドでも構いません。

ソースはGitリポジトリじゃないとダメなの?

CodeBuildはGitHubなどのリポジトリだけでなく、Amazon S3もソースの場所として公式にサポートしています。今回はGitの準備が不要なS3を使い、ソースコードと設定ファイルをZIPにまとめてアップロードする方法で進めます。

Goal

S3に置いたソースとbuildspec.ymlをもとに、CodeBuildでビルドを実行し、成果物が出力用のS3バケットに自動的にアップロードされることを確認する。

04 — Architecture

つくる構成

入力用のS3バケットに置いたソースを、CodeBuildが取り込んでビルドし、結果を出力用のS3バケットへ送るという流れを作ります。

🪣 S3(入力) ソース+buildspec.yml
🛠️ CodeBuild ビルドコマンドを実行
🪣 S3(出力) ビルド成果物
05 — Requirements

要件

以下の要件を満たし、S3とCodeBuildによる自動ビルドの流れを体験してください。

No要件
1適当なテキストファイル1つと、ビルド手順を書いた buildspec.yml を用意し、ZIPファイルにまとめる。
2入力用・出力用のS3バケットをそれぞれ1つ作成し(同じリージョン)、入力用バケットにZIPをアップロードする。
3CodeBuildプロジェクトを1つ作成する(ソース:Amazon S3、環境:マネージド型イメージ、サービスロール:新規作成、Artifacts:Amazon S3の出力用バケット)。
4ビルドを実行し、ステータスが「Succeeded」になることを確認する。
5出力用バケットに、buildspec.ymlで指定した成果物が新しく作成されていることを確認する。
06 — Steps

構築の進め方

「ソースを準備する」→「S3とCodeBuildプロジェクトを作る」→「ビルドを実行して成果物を確認する」という順番で進めます。

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

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

  3. ソースファイルとbuildspec.ymlを作成し、ZIPにまとめる

    ローカルに適当なテキストファイル(例:greeting.txt)を1つ作成し、同じ階層に次の内容で buildspec.yml を作成します。

    version: 0.2
    
    phases:
      build:
        commands:
          - echo "ビルドを開始します"
          - mkdir -p output
          - cp greeting.txt output/
          - echo "ビルド日時: $(date)" >> output/build-info.txt
    artifacts:
      files:
        - output/**/*

    2つのファイルを、フォルダを含めずに直接ZIP圧縮します(ZIPの中を開くと greeting.txtbuildspec.yml が直接見える状態にします)。

    YAMLのインデントに注意

    buildspec.ymlはYAML形式のため、半角スペースの数で構造が決まります。タブ文字は使わず、上の例と同じインデントでそろえましょう。

  4. フェーズ2 — S3とCodeBuildプロジェクトを作る
  5. 入力用・出力用のS3バケットを作成し、ZIPをアップロードする

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

  6. CodeBuildプロジェクトを作成する

    CodeBuildコンソールで「ビルドプロジェクトを作成する」を選びます。ソースプロバイダーは「Amazon S3」を選び、バケットとオブジェクトキー(ZIPファイル名)を指定します。環境はマネージド型イメージのまま、オペレーティングシステムは「Amazon Linux」、ランタイムは「Standard」を選びます。サービスロールは「新しいサービスロール」のままにし、Artifactsのタイプは「Amazon S3」を選び、出力用バケットを指定します。

  7. フェーズ3 — ビルドを実行して成果物を確認する
  8. ビルドを実行する

    作成したプロジェクトを選び、「ビルドを開始」を選びます。フェーズごとの進行状況(SUBMITTED → ... → COMPLETED)が表示され、最終的にステータスが「Succeeded」になることを確認します。

  9. 出力用バケットで成果物を確認する

    出力用バケットを開き、output/ フォルダの中に greeting.txtbuild-info.txt が作成されていることを確認します。

    これがゴール

    手作業でファイルをコピーしていないのに、ビルドを実行しただけで出力用バケットに成果物が現れている——この状態を確認できたら、このハンズオンの目的は達成です。

07 — Pitfalls

つまずきポイント

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

Pitfall 01 — ビルドがすぐに失敗する

「ビルドを開始した直後にFailedになる」

buildspec.ymlのインデント(半角スペースの数)が崩れていないか、ZIPファイルの中にフォルダを含めず直接buildspec.ymlが置かれているかを見直しましょう。

Pitfall 02 — 成果物が出力されない

「ビルドはSucceededなのに、出力用バケットに何も現れない」

buildspec.ymlの artifacts: に書いたパス(output/**/*)と、build フェーズで実際にファイルを置いたパスが一致しているかを見直しましょう。

08 — Checklist

完了チェック

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

  • ビルドの履行(ビルド履歴)で、ステータスが「Succeeded」になっている。
  • フェーズの詳細に、DOWNLOAD_SOURCEからCOMPLETEDまで各フェーズが「成功」と表示されている。
  • 出力用バケットに、ビルド実行時刻に近いタイムスタンプの新しいファイルが作成されている。
  • build-info.txt を開くと、ビルドを実行した日時が記録されている。
09 — Think

考えてみよう

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

  1. buildspec.ymlの中で、フェーズ(install・pre_build・build・post_buildなど)を分けて書く意味は何でしょうか。
    ヒント
    1つのフェーズに全部のコマンドを詰め込んだ場合と比べて、ログの読みやすさや役割の整理という観点で考えてみましょう。
  2. ソースをS3ではなくGitリポジトリにした場合、何が変わるでしょうか。
    ヒント
    ファイルの変更履歴や差分の追跡ができるかどうか、毎回ZIPを作ってアップロードする手間と比べて考えてみましょう。
  3. このビルドを毎日決まった時刻に自動的に実行したい場合、どうすればよいでしょうか。
    ヒント
    CodeBuildのビルドを定期的に起動する仕組みがあります。手動で毎回「ビルドを開始」を押す方法との違いを考えてみましょう(このハンズオンでは扱っていない発展的な内容です)。
10 — Clean up

後片づけ

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

  1. CodeBuildプロジェクトを削除する:CodeBuildコンソールのプロジェクト一覧から削除します。
  2. 自動作成されたIAMロールを削除する:プロジェクト作成時に新規作成したサービスロールが残っている場合は、IAMコンソールから削除します。
  3. S3バケットを空にして削除する:入力用・出力用バケットの中身を削除してから、バケット本体を削除します。

コストに関する注意: CodeBuild は、ビルドの実行時間(分)に応じて課金されます。今回のような短時間のビルドであれば料金はごく小さく済みますが、検証が終わったら不要なプロジェクトは削除しましょう。S3の保存容量・リクエストにも別途料金がかかりますが、少量であれば無料利用枠の範囲内に収まることが多いです。最新の料金は AWS の公式料金ページで確認してください。