AWS CodeBuild のリザーブドキャパシティフリートで Windows の Docker イメージをビルドしてみた
はじめに
テントの中から失礼します。製造ビジネステクノロジー部の「てんとタカハシ」です!
最近は Windows コンテナを触って試して楽しんでいます。先日投稿した記事では、DockerHub から Windows の Docker イメージを取得して Fargate の起動を試しました。
実際の運用では、自前で Dockerfile を用意して Docker イメージをビルドすることが一般的です。Windows の Docker イメージをビルドする環境はいくつかありますが、2024年11月のアップデートにより CodeBuild の「リザーブドキャパシティフリート」も選択肢のひとつになりました。
今回は AWS の公式ドキュメントを参考にして、CodeBuild のリザーブドキャパシティフリートで Windows の Docker イメージをビルドする方法を試してみます。
リザーブドキャパシティフリート
CodeBuild のリザーブドキャパシティフリートは、専用のコンピューティングリソースを事前にプロビジョニングしておくことで、処理を開始するまでの待ち時間を短縮できる機能です。ビルドの頻度が高い場合や、短時間でビルドを完了させたい場合に有効な手段です。
先日のアップデートにより、Windows の Docker イメージをビルドできるようになったことで、更に柔軟なビルド環境の構築が可能になりました。
これに対して、通常のオンデマンドフリートでは、ビルド環境として Windows を選択することは可能ですが、特権モードを有効にできないため Docker イメージをビルドすることはできません。
Windows は特権モードをサポートしていません。
リザーブドキャパシティフリートについては、以下の記事でも詳しく解説されていますので、併せてご参照ください。
料金
リザーブドキャパシティフリートは、専用のコンピューティングリソースを事前にプロビジョニングする特性上、リソースの使用状況に関係なく分単位で料金が発生します。オンデマンドフリートとは異なり、ビルドが実行されていない時間帯も課金対象になります。また、最低でも60分の使用料金が課金されますので、検証する際はご注意ください。
AWS CodeBuild - リザーブドキャパシティ Amazon EC2 の料金
インスタンス料金は、新しいインスタンスのリクエストを送信してからインスタンスが終了するまでの分単位で計算され、分単位で切り上げられます。各インスタンスの最低使用料金は 60 分です。
東京リージョンで使用する場合、料金は下記の通りです(2025/01/29 時点)
- 4vCPU / メモリ 8GB:1分あたり 0.0108 USD = 1日あたり 15.552 USD
- 8vCPU / メモリ 16GB:1分あたり 0.0216 USD = 1日あたり 31.104 USD
リソースの作成
リザーブドキャパシティフリートで Windows の Docker イメージをビルドするために必要なリソースを作成します。
CodeBuild リザーブドキャパシティフリート
「コンピューティングフリート」から「フリートを作成」をクリックします。
下記の内容を入力および選択してください。
- コンピューティングフリート名:
sample-windows-fleet
- オペレーティングシステム:
Windows
- アーキテクチャ:
x86_64
- 実行モード:
インスタンス
- コンピューティング:
8 GB メモリ、4 vCPU
- キャパシティ:
1
マネージド型イメージ
- メジャーバージョン:
aws/codebuild/ami/windows-base:2022-1.0
- マイナーバージョン:
常に最新バージョンを使用
その他の設定はデフォルトのまま「フリートを作成」をクリックします。
ステータスが「有効」になったら完了です。
S3 バケット
「汎用バケット」から「バケットを作成」をクリックします。
バケット名のみ入力します(ここでは sample-windows-project-source-250126
とします)。
その他の設定はデフォルトのまま「バケットを作成」をクリックします。
CodeBuild ビルドプロジェクト
「ビルドプロジェクト」から「プロジェクトを作成する」をクリックします。
下記の内容を入力および選択してください。
- プロジェクト名:
sample-windows-project
- ソースプロバイダ:
Amazon S3
- バケット:
sample-windows-project-source-250126
- S3 オブジェクトキーまたは S3 フォルダ:
DeckerImageSample.zip
- プロビジョニングモデル:
リザーブドキャパシティ
- フリート名:
sample-windows-fleet
- サービスロール:
新しいサービスロール
- ロール名:
codebuild-sample-windows-project-service-role
- ビルド仕様:
buildspec ファイルを使用する
- Buildspec名:
buildspec.yml
その他の設定はデフォルトのまま「ビルドプロジェクトを作成する」をクリックします。
Dockerfile & buildspec.yml
Dockerfile
Windows Server 2022 の Docker イメージを使用します。ビルド時に Hello World
を出力します。
FROM mcr.microsoft.com/windows/servercore:ltsc2022
RUN powershell -Command "Write-Host 'Hello World'"
buildspec.yml
ビルドした後にコンテナを起動して、Hello World!
を出力します。
version: 0.2
phases:
pre_build:
commands:
- docker build -t helloworld .
build:
commands:
- docker images
- docker run helloworld powershell -Command "Write-Host 'Hello World!'"
各ファイルを S3 バケットに格納
上記ファイルを DockerImageSample.zip
として S3 バケットに格納します。
% tree source
source
├── Dockerfile
└── buildspec.yml
% cd source
% zip -r DockerImageSample.zip ./*
% BUCKET_NAME="sample-windows-project-source-250126"
% aws s3 cp DockerImageSample.zip "s3://${BUCKET_NAME}/DockerImageSample.zip"
ビルドの実行
作成した CodeBuild プロジェクトのページで「ビルドを開始」をクリックします。
Docker イメージのビルドが成功して、Hello World!
が出力されます。
フリートの削除
不要になったフリートの削除だけは必ず忘れないように注意しましょう。
おわりに
今回は CodeBuild のリザーブドキャパシティフリートを使用して、Windows の Docker イメージをビルドする方法を試してみました。リザーブドキャパシティフリートの特性を活かして、効率的にビルドを実行したい場合や、AWS 内のサービスで完結したい場合には有力な選択肢になります。
一方で、リソースの使用状況に関係なく料金が発生するため、コスト面での検討もお忘れなく。
最後までお読みいただきありがとうございました!この記事が少しでも参考になれば幸いです。