EC2 Image Builder で ISV 提供のコンポーネントを利用できるようになりました！

## はじめに

こんにちは、インサイトテクノロジーの松尾です！
本投稿は [Japan AWS Top Engineers Advent Calendar 2024](https://qiita.com/advent-calendar/2024/aws-top-engineers) の10日目の記事です！！

本投稿では、AWS re:Invent 2024 に合わせて発表された EC2 Image Builder で ISV 提供のコンポーネントが利用できるようになった件について、利用方法の紹介と、ISV として出品した立場からコメントをさせていただければと思います。

## EC2 Image Builder で ISV 提供のコンポーネントを利用できるようになりました

EC2 Image Builder で ISV(independent software vendors) 提供のコンポーネントを AWS Marketplace 製品の利用という形で利用できるようになりました。

https://aws.amazon.com/about-aws/whats-new/2024/12/aws-marketplace-ec2-image-builder-components-software-vendors/

また、それに伴い、弊社インサイトテクノロジーでは、SQLテスト自動化ツール「Insight SQL Testing」を Image Builder 用のコンポーネントとして AWS Marketplace で提供開始いたしました。

https://www.insight-tec.com/news/press/202412_5337/

https://aws.amazon.com/marketplace/pp/prodview-xwrie4lkeiopk

:::note info
！！AWS からの news にも弊社の社名が記載されています！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/7bdae6f5-11d2-15a5-1d74-15ac32b11786.png)
:::

:::note warn
なお、後述しますが、現在の Image Builder Component 向けの AWS Marketplace の出品では Free trial をサポートしていません。いずれはできるようになると思いますが、現時点では弊社で公開しているような有償ソフトウェアは、すぐに課金されるような動きとなりますのでご注意ください。当社のソフトウェアにご興味を持っていただいた場合は、お問い合わせいただくか、AMI 提供の Free trial をご使用ください。
また Image Builder で実際に AWS Markeplace 製品を試したい場合は、弊社製品ではなく無償の製品で試されることをお勧めします。
:::

## Image Builder で提供されると何がうれしいの？

これまで Insight SQL Testing は AMI という形で製品モジュールを提供してきました。AMI の利用はデプロイなどが容易な反面、企業のポリシーなどによっては AMI のようなソフトウェアアプライアンス利用が許可されないケースもあり、そういった企業で導入を困難なものにしていました。EC2 Image Builder のコンポーネントとして提供することで、AMI の利用が困難なお客様にも門戸を広げることにつながると期待しています。

また、今回は Insight SQL Testing を対象として公開しましたが、今後、弊社で AMI で公開している別の製品についても広げていきたいと思います。

## 利用方法

AMI を利用するときと同様、AWS Marketplace の製品を利用する場合はサブスクライブする必要があります。
Image Builder のメニューに AWS Marketplace が追加されているので、さっそくここからサブスクライブしてみます。タブで「コンポーネント - 新規」を選択して製品情報を入れると簡単に見つかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/6c6bbac9-f856-2053-6b1e-02e5b6d8e0c0.png)

Accept terms を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/85093657-da79-7e9e-3dc3-5d6a84e1c92b.png)

すると「サブスクリプション」からも確認できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/e7087598-6fd7-2c0a-298e-5d0a5ee1da0b.png)

なお、本コンポーネントは、以下を満たしている必要があります/または構築中に以下の変更を行います。以下の要件が満たされてない場合には、パイプライン実行中にエラーになったり期待通りのイメージが作成されない可能性があります。

* Instance type
    * m5.xlarge, m5.2xlarge, m5.4xlarge, m5.8xlarge
* ベースイメージOS
    * RHEL8, x86
* Storage
    * /dev/sda1: 32GB (ベースOSの領域)
    * /dev/sdb: 1GB以上 (メインのデータ領域)
    * /dev/sdc: 1GB
    * /dev/sdd: 10GB
* 作業ディレクトリ
    * /tmp
* その他
    * イメージレシピ実行中に `insight` ユーザーを作成するため、ベースに `insight` ユーザーがいてはならない
    * イメージレシピ実行中に SE Linux を無効にする

これらを満たすように、レシピやパイプラインを構成する必要があることにご注意ください。

### イメージレシピの作成

サブスクライブした後、そのコンポーネントを使ったイメージレシピを作成します。

https://docs.aws.amazon.com/imagebuilder/latest/userguide/integ-marketplace.html

我々が提供しているコンポーネントを利用するイメージレシピでは、前述の要件のうち、以下を満たす必要があることに注意してください。

> * ベースイメージOS
>     * RHEL8, x86
> * Storage
>     * /dev/sda1: 32GB (ベースOSの領域)
>     * /dev/sdb: 1GB以上 (メインのデータ領域)
>     * /dev/sdc: 1GB
>     * /dev/sdd: 10GB
> * 作業ディレクトリ
>     * /tmp (デフォルト)

:::note info
~~なお、変更が入った正確な日時は不明なのですが、最近の AWS コンソールの仕様変更で、UI からのイメージレシピ作成において、ベースOSの領域である `/dev/sda1` のサイズ変更ができなくなっているようです。そのため、面倒ですが、現時点では CLI や CloudFormation などからイメージレシピを作成する必要があることにご注意ください。~~

(2025/4/9 追記)
2025年4月9日時点で、GUIから `/dev/sda1` のサイズ変更もできるように戻っていました。
:::

一番シンプルなイメージレシピの作成としては、ベースのイメージに対して、弊社が提供しているコンポーネントをインストールするのみのものになると思います。
イメージレシピの作成を awscli から実行する場合は、以下のように実行することが可能です。

```bash
aws imagebuilder create-image-recipe --cli-input-json file://create_image_recipe.json --region xxxx
```

`componentArn` のところは、サブスクライブしたコンポーネントに表示されている arn の内容を貼り付けます。

```json
{
	"name": "MyImageRecipe",
	"description": "My image recipe example",
	"semanticVersion": "2019.12.03",
	"components":
	[
		{
			"componentArn": "arn:aws:imagebuilder:ap-northeast-1:aws:component/update-linux/1.0.2/1"
		},
		{
			"componentArn": "arn:aws:imagebuilder:ap-northeast-1:aws-marketplace:component/insight-sql-testing-manager-ec2-image-builder-component-4-2-0-0-xxxxxxxxxxxxx/1.0.1/1"
		}
	],
	"blockDeviceMappings":
	[
		{
			"deviceName": "/dev/sda1",
			"ebs": {
				"encrypted": false,
				"deleteOnTermination": true,
				"iops": 3000,
				"volumeSize": 32,
				"volumeType": "gp3",
				"throughput": 125
			}
		},
		{
			"deviceName": "/dev/sdb",
			"ebs": {
				"encrypted": false,
				"deleteOnTermination": true,
				"iops": 3000,
				"volumeSize": 2,
				"volumeType": "gp3",
				"throughput": 125
			}
		},
		{
			"deviceName": "/dev/sdc",
			"ebs": {
				"encrypted": false,
				"deleteOnTermination": true,
				"iops": 3000,
				"volumeSize": 1,
				"volumeType": "gp3",
				"throughput": 125
			}
		},
		{
			"deviceName": "/dev/sdd",
			"ebs": {
				"encrypted": false,
				"deleteOnTermination": true,
				"iops": 3000,
				"volumeSize": 10,
				"volumeType": "gp3",
				"throughput": 125
			}
		}
	],
	"parentImage": "arn:aws:imagebuilder:us-east-1:aws:image/red-hat-enterprise-linux-8-x86/x.x.x"
}
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/2f9d817a-7f33-6840-4091-6b2629bf6fe8.png)

### イメージパイプラインの作成と実行

イメージレシピの作成ができたら、パイプラインの作成と実行は AWS コンソールから実行することができます。インスタンスタイプの要件により、AMI 構築時に使用されるインスタンスタイプとして以下のいずれかが使われるよう設定をする必要があります。インフラストラクチャの設定のデフォルトでは m5.large が使われるようなので、m5.xlarge が使われるようインフラストラクチャの設定を行ってください。

> * Instance type
>     * m5.xlarge, m5.2xlarge, m5.4xlarge, m5.8xlarge

また、我々が提供しているコンポーネントには限りませんが、AWS Marketplace のコンポーネントを利用する場合には、パイプライン実行時に `imagebuilder:GetMarketplaceResource` の権限が必要になりますので、事前に付与するようにしてください。(`EC2InstanceProfileForImageBuilder` ロールに権限を追加するか、独自に作成)

その他の設定は特に変更が必要なものはありません。

:::note warn
なお、前述の通り、現在の Image Builder Component 向けの AWS Marketplace の出品では Free trial をサポートしていません。いずれはできるようになると思いますが、現時点では弊社で公開しているような有償ソフトウェアは、すぐに課金されるような動きとなりますのでご注意ください。当社のソフトウェアにご興味を持っていただいた場合は、お問い合わせいただくか、AMI 提供の Free trial をご使用ください。そのため、本記事でもここまでの記述にとどめます。
:::

## ISV としての出品エクスペリエンスと感想

AWS Marketplace への出品は、通常の AMI であれば AWS Marketplace Management Console という画面から GUI で行うことができるのですが、今回はまだ機能のリリースタイミングということもあり、GUI からの製品登録や情報の更新など、一部のオペレーションは awscli から実施する必要がありました。今後それらは GUI から実施できるよう整備が進んでいくものと思われます。

https://docs.aws.amazon.com/marketplace/latest/userguide/ec2-ib-component-products.html

https://docs.aws.amazon.com/marketplace/latest/APIReference/work-with-ec2-image-builder-products.html

前述のとおり、課金についても現在は Free trial をサポートしていないため、もともと無償提供しているものなどが当面は中心になっていくかもしれません。

もともと yum でインストールするような軽量なコンポーネントであればあまり問題にはならないのですが、"製品" をセットアップするとなると、我々のコンポーネントのように、インストールにあたって、ベースイメージに対して様々な前提条件が必要になるケースも多いと思います。本記事にはドキュメントベースで前提条件を記載していますが、本コンポーネントがより多く使われるようになると、パイプライン実行時の様々なエラーが発生することが容易に想像できます。レシピ作成時のエラーチェックや、パイプライン実行時のエラーチェックなど、正しく実行できない構成をいかに事前に排除するか、実行中のエラーにどう対応するか、が、キーとなりそうな気はします。

## さいごに

本投稿では、AWS re:Invent 2024 に合わせて発表された EC2 Image Builder で ISV 提供のコンポーネントが利用できるようになった件について、利用方法の紹介と、ISV として出品した立場からのコメントをさせていただきました。

これまで我々は各製品を AMI という形で AWS Marketplace を通して提供してきました。AMI の利用はデプロイなどが容易な反面、企業のポリシーなどによっては AMI のようなソフトウェアアプライアンス利用が困難なケースもあり、そういった企業での導入が煩雑になっていました。EC2 Image Builder のコンポーネントとして提供することで、製品導入方式の選択肢が増え導入のハードルを下げることにつながると期待しています。

本投稿が、何かの参考になれば幸いです！

## 参考文献

クラスメソッドさんが早速記事にされていましたのでこちらも是非参考にしていただければと思います！

https://dev.classmethod.jp/articles/marketplace-ec2-image-builder-component/