AWS CodeBuild のリザーブドキャパシティフリートで Windows の Docker イメージをビルドしてみた

AWS CodeBuild のリザーブドキャパシティフリートで Windows の Docker イメージをビルドしてみた

はじめに

テントの中から失礼します。製造ビジネステクノロジー部の「てんとタカハシ」です!

最近は Windows コンテナを触って試して楽しんでいます。先日投稿した記事では、DockerHub から Windows の Docker イメージを取得して Fargate の起動を試しました。

https://dev.classmethod.jp/articles/running-windows-container-on-fargate-with-cdk/

実際の運用では、自前で Dockerfile を用意して Docker イメージをビルドすることが一般的です。Windows の Docker イメージをビルドする環境はいくつかありますが、2024年11月のアップデートにより CodeBuild の「リザーブドキャパシティフリート」も選択肢のひとつになりました。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/aws-codebuild-windows-docker-reserved-capacity-fleets/

今回は AWS の公式ドキュメントを参考にして、CodeBuild のリザーブドキャパシティフリートで Windows の Docker イメージをビルドする方法を試してみます。

https://docs.aws.amazon.com/codebuild/latest/userguide/sample-windows-docker-custom-image.html

リザーブドキャパシティフリート

CodeBuild のリザーブドキャパシティフリートは、専用のコンピューティングリソースを事前にプロビジョニングしておくことで、処理を開始するまでの待ち時間を短縮できる機能です。ビルドの頻度が高い場合や、短時間でビルドを完了させたい場合に有効な手段です。

先日のアップデートにより、Windows の Docker イメージをビルドできるようになったことで、更に柔軟なビルド環境の構築が可能になりました。

これに対して、通常のオンデマンドフリートでは、ビルド環境として Windows を選択することは可能ですが、特権モードを有効にできないため Docker イメージをビルドすることはできません。

ビルド環境のコンピューティングモードおよびタイプ

Windows は特権モードをサポートしていません。

リザーブドキャパシティフリートについては、以下の記事でも詳しく解説されていますので、併せてご参照ください。

https://dev.classmethod.jp/articles/codebuild-reserved-capacity/

料金

リザーブドキャパシティフリートは、専用のコンピューティングリソースを事前にプロビジョニングする特性上、リソースの使用状況に関係なく分単位で料金が発生します。オンデマンドフリートとは異なり、ビルドが実行されていない時間帯も課金対象になります。また、最低でも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 リザーブドキャパシティフリート

「コンピューティングフリート」から「フリートを作成」をクリックします。

スクリーンショット 2025-01-26 18.26.42

下記の内容を入力および選択してください。

  • コンピューティングフリート名:sample-windows-fleet
  • オペレーティングシステム:Windows
  • アーキテクチャ:x86_64
  • 実行モード:インスタンス
  • コンピューティング:8 GB メモリ、4 vCPU

スクリーンショット 2025-01-26 18.27.12

  • キャパシティ:1
  • マネージド型イメージ
  • メジャーバージョン:aws/codebuild/ami/windows-base:2022-1.0
  • マイナーバージョン:常に最新バージョンを使用

その他の設定はデフォルトのまま「フリートを作成」をクリックします。

スクリーンショット 2025-01-26 18.27.27

ステータスが「有効」になったら完了です。

スクリーンショット 2025-01-26 18.28.16

S3 バケット

「汎用バケット」から「バケットを作成」をクリックします。

スクリーンショット 2025-01-26 18.29.13

バケット名のみ入力します(ここでは sample-windows-project-source-250126 とします)。

スクリーンショット 2025-01-26 18.30.56

その他の設定はデフォルトのまま「バケットを作成」をクリックします。

スクリーンショット 2025-01-26 18.31.16

CodeBuild ビルドプロジェクト

「ビルドプロジェクト」から「プロジェクトを作成する」をクリックします。

スクリーンショット 2025-01-26 18.28.30

下記の内容を入力および選択してください。

  • プロジェクト名:sample-windows-project
  • ソースプロバイダ:Amazon S3
  • バケット:sample-windows-project-source-250126
  • S3 オブジェクトキーまたは S3 フォルダ:DeckerImageSample.zip

スクリーンショット 2025-01-26 18.33.14

  • プロビジョニングモデル:リザーブドキャパシティ
  • フリート名:sample-windows-fleet
  • サービスロール:新しいサービスロール
  • ロール名:codebuild-sample-windows-project-service-role

スクリーンショット 2025-01-26 18.33.56

  • ビルド仕様:buildspec ファイルを使用する
  • Buildspec名:buildspec.yml

スクリーンショット 2025-01-26 18.34.52

その他の設定はデフォルトのまま「ビルドプロジェクトを作成する」をクリックします。

スクリーンショット 2025-01-26 18.35.01

Dockerfile & buildspec.yml

Dockerfile

Windows Server 2022 の Docker イメージを使用します。ビルド時に Hello World を出力します。

Dockerfile
FROM mcr.microsoft.com/windows/servercore:ltsc2022

RUN powershell -Command "Write-Host 'Hello World'"

buildspec.yml

ビルドした後にコンテナを起動して、Hello World! を出力します。

buildspec.yml
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 プロジェクトのページで「ビルドを開始」をクリックします。

スクリーンショット 2025-01-26 18.38.05

Docker イメージのビルドが成功して、Hello World! が出力されます。

スクリーンショット 2025-01-26 18.44.57

フリートの削除

不要になったフリートの削除だけは必ず忘れないように注意しましょう。

スクリーンショット 2025-01-26 19.24.52

おわりに

今回は CodeBuild のリザーブドキャパシティフリートを使用して、Windows の Docker イメージをビルドする方法を試してみました。リザーブドキャパシティフリートの特性を活かして、効率的にビルドを実行したい場合や、AWS 内のサービスで完結したい場合には有力な選択肢になります。

一方で、リソースの使用状況に関係なく料金が発生するため、コスト面での検討もお忘れなく。

最後までお読みいただきありがとうございました!この記事が少しでも参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.