EC2 Image BuilderでAMIの自動作成を試してみる
Posted On 2025-01-18
TerraformとYAMLファイルで定義したイメージレシピを用い、Amazon Linux 2023にPyTorchをインストールしたカスタムAMIを自動的にビルドする手順を解説。IAMロールやセキュリティグループの設定を整えれば、定期実行や最新AMIへの追従なども効率的に行える。
目次
はじめに
- SCS勉強してたときに出てきた、AMIを自動でビルドしてくれる「EC2 Image Builder」を使ってみた
- ビルドのスクリプトをYAMLで書いて、いい感じにビルドしてくれるもの
- Dockerイメージのビルドにも使えるが今回はAMIのビルドを例に挙げる
- この例では、Amazon Linux 2023のAMIにPyTorchをインストールしたカスタムAMIを作成してみる
YAMLの書き方(component.yaml)
YAMLで書かれたイメージレシピを定義する。ステップ以下にいろいろ書いていくスタイル
EC2 Image BuilderのTerraform
EC2 Image Builderを使うためのTerraformは以下の通り
- ビルドするときに使うロール(この例では
EC2ImageBuilderRole
)が必要- ポリシーとして
AWSImageBuilderFullAccess
を付与する必要がある(絞る気ならもう少し絞れるが、これがないとPermission Deniedでビルドが失敗する)。 AmazonSSMManagedInstanceCore
もほぼ必須とされているようだ。
- ポリシーとして
- イメージレシピの部分がImage Builderで何をビルドするかで、ベースのAMI(この例ではAmazon Linux 2023)を指定し、レシピを外部のyamlファイル(
component.yaml
)で定義している - セキュリティグループ定義したり、インスタンスタイプを指定したりあたかもEC2を立ち上げるような設定をしているが、これはイメージをビルドしたりテストしたりするときに使うEC2インスタンスの設定。ビルド時に使われるもので、終わったら勝手に終了される。
- 定期実行も可能だが、今回は手動実行の例で示す
ビルドしてみる
EC2 Image Builderの「イメージパイプライン」から、「アクション」→「パイプラインを実行」
裏でEC2が立ち上がってビルドが始まる
イメージを見ると途中経過が表示される。まあまあ時間がかかる(15分ぐらい)。特にエラーなければ全部完了済みになっているはず。ロールにポリシーが付与されていないとハマるとここが失敗することがある。
使ってみる
作ったAMIを使いたいときは、EC2の起動画面から「自分のAMI」で表示される。
Session Managerなどで適当にSSHして、Pythonに入りPyTorchのバージョンを表示してみると、最新のがインストールされている。
削除時
- terraform destroyしても、手動実行したジョブによって作られたイメージは自動削除されない。別途手動で削除する必要がある
- 作ったAMIを消すときは、ロールライフサイクル移行するのに必要な権限を持ったロール(ポリシー:
EC2ImageBuilderLifecycleExecutionPolicy
)が必要で、これは最初に作ったフルアクセスとは別のロールが必要。 - イメージを削除しようとすると、自動的に作成されたサービスロール(
AWSServiceRoleForImageBuilder
)があるが、これだと権限不足で消せない - 削除用のロールを作成するときは、信頼関係を「EC2 Image Builder」にして、
EC2ImageBuilderLifecycleExecutionPolicy
をアタッチすればOK。ここが若干面倒くさい
所感
- まあなるほどねという感じ
- GPUのAMIを作るときは結構便利そう
- AMI作るときは便利そうだけど、Terraformでこう作ってしまうと最新といつつベースのAMIのIDが固定されてしまうので、CI/CDとの棲み分けが詰める必要あるかなと思った
- ただAMIのセキュリティ対策で、どんどん最新のを使いましょうというのには結構使えそう。実際は定期実行でやるのだと思われる
Shikoan's ML Blogの中の人が運営しているサークル「じゅ~しぃ~すくりぷと」の本のご案内
技術書コーナー