EC2 Image Builderの超詳細解説

# はじめに
この記事はDevOps on AWS大全の一部です。
DevOps on AWS大全の一覧は[こちら](https://qiita.com/tech4anyone/items/b06f88035d27c6ef13b2)。

この記事ではEC2 Image Builderはどういうサービスで何ができるのかを超詳細にまとめています。

具体的には以下流れで説明します。
- EC2 Image Builderとは
- EC2 Image Builderの仕組み
- EC2 Image Builder for Advance

AWSの区分でいう「Level 200：トピックの入門知識を持っていることを前提に、ベストプラクティス、サービス機能を解説するレベル」の内容です。

# この記事を読んでほしい人
- EC2 Image Builderがどういうサービスか説明できるようになりたい人
- EC2 Image Builderを採用するときのベストプラクティスを説明できるようになりたい人
- AWS Certified DevOps Engineer Professionalを目指している人

# EC2 Image Builderとは
EC2 Image Builderとは仮想マシンイメージまたはコンテナイメージを自動で作成するサービスです。
EC2 Image Builderという名前が誤解を与えがちですが、オンプレミスの仮想マシンイメージやコンテナイメージも作成可能です。

EC2 Image Builderを含むパイプラインを組むことで、AMIの自動再作成だけではなく、EC2の再作成まで一気通貫で行うことが可能になります。

![](https://storage.googleapis.com/zenn-user-upload/ac0b696b1af9-20231109.png)

ただし、実プロジェクトではゴールデンイメージの作成は各開発サイクルで1度だけ、EC2の再作成は開発面ごとに加えて本番環境の複数回、というパターンが多いと思います。

その場合はAMIの自動再作成パイプラインとEC2の再作成パイプラインを分けてもよいでしょう。
ただし、AMI IDの更新を忘れないようSystems Manager Parameter StoreにAMI IDを格納し、CloudFormation上は動的なパラメータとなるアーキテクチャをお勧めします。

# EC2 Image Builderの仕組み
EC2 Image Builderは裏側でEC2を起動して、AMIの構築とテストを行っています。
そのため、EC2 Image Builder自体は無料ですが裏側のEC2の料金は請求されるので注意しましょう。

![](https://storage.googleapis.com/zenn-user-upload/a4ef45f26617-20231109.png)

定義する必要があるのは3種類のリソース、1)コンポーネント、2)イメージレシピ、3)イメージパイプラインです。

![](https://storage.googleapis.com/zenn-user-upload/73434f7c0c81-20231109.png)

上に書いたサービス概要とリソースの対応付け俯瞰図をまずは書いたのでこれを頭に入れて以下を読み進めてください。

## コンポーネント
まずコンポーネントについてです。
EC2 Image BuilderはAMIの構築とテストの2段階で構成されています。
そのため、構築とテストそれぞれどんな内容を実行するか記載するコンポーネントもビルドコンポーネントとテストコンポーネントの2種類存在します。

ビルドコンポーネントはソフトウェアパッケージのダウンロード、インストール、および構成の手順を定義するドキュメントです。
OSのアップデート、MWのインストール、アプリケーションの設定などOS以上の設定を定義できます。

一方のテストコンポーネントはソフトウェアパッケージで実行するテストを定義するドキュメントです。
テスト内容はAWSで定義されたものに加えて、カスタムで実装することも可能です。

例えば、以下のようなテストを実装可能です。
- AMI がブートすることを確認するテスト
- サンプルアプリケーションが動作するかどうかのテスト
- 特定のパッチが適用されているかどうかのテスト
- セキュリティポリシーのテスト

## イメージレシピ
続いてイメージレシピです。
イメージレシピは完成するAMIイメージがどういったものになるかを定義するドキュメントです。
具体的にはビルドコンポーネントとテストコンポーネントの2つのコンポーネントに加えてソースイメージを加えた3つの組み合わせ定義したものです。

## イメージパイプライン
最後にイメージパイプラインです。
これはイメージレシピに加えてイメージ構築とイメージテストを実行するEC2の設定、完成したAMIの配布設定、EC2 Image Builderの実行頻度を設定したAMI構築パイプラインの全体像を定義しています。

実行頻度は、週次など定期的に実行するパターンと手動で実行するパターンを選択できます。

なお、EC2 Image Builderに対応しているOSは以下になります。
- Amazon Linux 2
- Windows Server 2012、2016、2019
- Ubuntu Server 16、18
- Red Hat Enterprise Linux (RHEL) 7、8
- Cent OS 7、8
- SUSE Linux Enterprise Server (SLES) 15

昔はLinux系だけでしたが、現在はWindowsにも対応しているのでWindows系のAMIだけ手動構築しないといけない、というのは避けられるようになっています。

# EC2 Image Builder for Advance
## 最新のAMI IDの自動管理
EC2 Image Builderを使うと、高頻度でAMIを構築することになるので無数のAMIが生まれることになります。

コストを抑制するためにAMIの世代管理をするのはもちろんですが、常に最新のAMI IDを管理しないと旧世代のAMIを本番環境にリリースしてしまう、という事故につながってしまいます。

そこで、AWSのベストプラクティスに沿ってAMI IDを自動で管理する方法を紹介します。

![](https://storage.googleapis.com/zenn-user-upload/0aca2b82657d-20231109.png)

実は冒頭にも書きましたが、EC2 Image BuilderでAMIを構築したらSSM Paramater StoreにAMI IDを保存しておくのがベストプラクティスです。

EC2 Image Builderから直接SSM Paramater Storeに書き込むことはできないのでSNSをかませてAMI ID書き込み用のLambdaを起動させる必要はあります。
そのため、実装には多少手間がかかりますが、長い開発の中で大量のAMI IDをExcelなどで管理する手間を考えれば実装しておいたほうが良いというのが私の経験です。

# まとめ
この記事ではEC2 Image Builderはどういうサービスで何ができるのかを超詳細にまとめました。

- EC2 Image Builderとは
- EC2 Image Builderの仕組み
- EC2 Image Builder for Advance

次回はAWS Amplifyを超詳細解説します。