EC2 Image Builderを使って、AMI イメージパイプラインを構築してみた

AWS

2024.5.2

Topics

はじめに

こんにちは、Shunです!

今回は、EC2 Image Builderを使って、AMI イメージパイプラインを構築する方法を解説します!

EC2 Image Builderとは

概要

簡単に言うと、EC2 Image BuilderはAMI作成プロセスをフルマネージドで提供するサービスです。

EC2 Image Builder は、カスタマイズされた安全な最新のサーバー イメージの作成、管理、デプロイメントを自動化するのに役立つフルマネージドの AWS サービスです。 AWS マネジメントコンソール、AWS コマンドラインインターフェイス、または API を使用して、AWS アカウントにカスタムイメージを作成できます。
出典: EC2イメージビルダーとは何ですか?

料金

EC2 Image Builderは、無料で利用することができます。
しかし、EC2 Image Builder内で稼働するEC2やInspectorには料金が発生します。

参考: EC2 Image Builderの価格設定

サポートOS

EC2 Image Builderでは、以下のOSがサポートされています。

Operating system/Distribution Supported versions
Amazon Linux 2 and 2023
CentOS 7 and 8
CentOS Stream 8
Red Hat Enterprise Linux (RHEL) 7 and 8
SUSE Linux Enterprise Server (SUSE) 12 and 15
Ubuntu 18.04 LTS, 20.04 LTS, and 22.04 LTS
Windows Server 2012 R2, 2016, 2019, and 2022

EC2 Image Builderの概念

EC2 Image Builderには固有の概念があるため、実施する前に確認しておきます。

引用: EC2 Image Builderの概念

イメージパイプライン

EC2 Image Builderでは、AMIの作成およびテストのフローを定義できます。この一連の流れをイメージパイプラインと呼びます。

イメージパイプラインは、イメージビルドライフサイクルのビルド、検証、およびテストフェーズを定義するイメージ recipe に関連付けられています。イメージパイプラインは、イメージの構築場所を定義するインフラストラクチャ構成に関連付けることができます。インスタンスタイプ、サブネット、セキュリティグループ、ログ記録、その他のインフラストラクチャ関連の構成などの属性を定義できます。また、イメージパイプラインをディストリビューション構成に関連付けて、イメージのデプロイ方法を定義することもできます。
出典: イメージパイプライン

ベースイメージ

ベースイメージは、AMIを作成するための元になるイメージを指します。たとえば、Amazon Linux 2023や既存の運用中のAMIなどです。

ベースイメージとは、イメージまたはコンテナレシピドキュメントで使用される、選択されたイメージとオペレーティングシステム、およびコンポーネントです。ベースイメージとコンポーネント定義を組み合わせることで、出力イメージに必要な設定が作成されます。
出典: ベースイメージ

コンポーネント

コンポーネントは、AMIを作成・テストする際に使用するコマンドを定義するものです。

コンポーネントは、イメージ作成前にインスタンスをカスタマイズする(ビルドコンポーネント)か、作成されたイメージから起動されたインスタンスをテストする(テストコンポーネント)ために必要な一連の手順を定義します。
出典: コンポーネント

イメージレシピ

イメージレシピは、どのベースイメージやコンポーネントを使用するかを定義したものです。

Image Builder イメージ recipe は、ベースイメージとベースイメージに適用するコンポーネントを定義し、必要な構成の出力イメージを生成するためのドキュメントです。イメージ recipe を使用して、ビルドを複製できます。Image Builder のイメージレシピは、コンソールウィザード、、または API を使用して共有、分岐 AWS CLI、編集できます。バージョン管理ソフトウェアでイメージ recipe を使用して、バージョン管理された共有可能なイメージ recipe を維持できます。
出典: イメージレシピ

構成図

EC2 Image Builderでは、次のような流れでAMIを作成します。

実行手順

上記で示した構成図は、以下の順序で処理を実施します。

① ソースイメージからEC2を起動し、ビルドコンポーネントをダウンロードする。
② EC2からAMIを作成する。
③ EC2を削除する。
④ 作成したAMIからEC2を起動する。
⑤ Inspectorによる脆弱性スキャンする。
⑥ テストコンポーネントで定義したテスト内容を実施する。
⑦ EC2を削除する。

やってみた

東京リージョンで実施します

1. イメージレシピの設定

EC2 Image Builderから「イメージレシピを作成する」を選択します。

任意の名前とレシピのバージョンを指定します。

ベースイメージでは、以下のように設定します。

  • イメージを選択: 管理対象イメージを選択する
  • イメージオペレーティングシステム: Amazon Linux
  • イメージ名: Amazon Linux2023 ARM 64

インスタンスの設定と作業ディレクトリは、デフォルトのままで問題ありません。
EC2 Image Builderは、SSM経由でログインし、/tmpディレクトリで作業します。

コンポーネントにはビルドコンポーネントとテストコンポーネントがあります。
以下はビルドコンポーネントの設定です。Amazonが管理するコンポーネントと、ユーザー管理のコンポーネントのどちらも選択可能です。

ビルドコンポーネントには、以下を指定しました。

  • update-linux
  • amazon-cloudwatch-agent-linux
  • php-8_2-linux

ビルドコンポーネントの例は、以下のようなものです。

name: HelloWorldTestingDocument
description: This is hello world testing document.
schemaVersion: 1.0

phases:
  - name: test
    steps:
      - name: HelloWorldStep
        action: ExecuteBash
        inputs:
          commands:
            - echo "Hello World! Test."

続いて、テストコンポーネントには「reboot-test-linux」を選択します。

ストレージなどの設定はデフォルトのままで問題ありません。

これでイメージレシピの作成が完了しました。

2. イメージパイプラインの設定

続いて、イメージパイプラインを作成します。

任意の名前を入力し、EC2 Imageスキャンを有効にします。
これにより、Inspectorが脆弱性をチェックします。

ビルドスケジュールでは、CRONなどで定義できますが、今回は手動実行を選択します。

先ほど作成したレシピを選択します。

イメージ作成プロセスの定義では、「既定のワークフロー」を選択します。

既定のワークフローは、AWSで事前定義されている内容になります。
ワークフローは、構成図に示した通りです。

インフラストラクチャの設定では、既定のワークフローを実施するための最小限の権限を持つIAMロールが作成されます。
SNSなどを使って次のアクションを設定する場合は、カスタム設定が必要です。
(デフォルトVPCを削除しているとエラーが出るかもしれません。)

ディストリビューション設定では、他のリージョンや他のアカウントへ共有するための設定が可能です。
今回はデフォルト設定にします。

これでイメージパイプラインの作成が完了しました。

3. イメージパイプラインを実行

イメージパイプラインを実行します。
作成したイメージパイプラインを選択し、アクションから実行します。

実行すると、「出力イメージ」に実行状況が表示され、ログストリームでリアルタイムに確認できます。

完了まで30分程度かかりますので、しばらく待ちましょう。

出力リソースから作成したAMIを確認できます。

4. Inspectorの検出結果

先ほどの手順から脆弱性は検出されませんでしたが、他のOSで実施すると、Inspectorからいくつかの脆弱性が確認されました。

CVEを選択すると、影響を受けているパッケージや修正方法が提示されています。

これらの修正をビルドコンポーネントに追加し、再度AMIを作成することで、脆弱性に対応できます。

まとめ

今回は、EC2 Image Builderを使ってAMI イメージパイプラインを構築する方法を紹介しました!
パイプライン全体がフルマネージドで提供されているため、非常に便利です!

今回の記事では、EC2 Image BuilderからSNS、Lambda、Parameter Storeと連携して常に最新のAMIを参照する設定については触れませんでした!
次回はその内容を紹介できればと思います!

最後まで読んでいただきありがとうございます!

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

Shun

週8バスケしたいです。Google Cloud11冠、2024 AWS All Cert

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら