[アップデート] AWS CodeBuild のリザーブドキャパシティを使ってみました

2024.01.21

いわさです。

先日のアップデートで AWS CodeBuild にリザーブドキャパシティの概念が登場しました。

一瞬、CodeBuild にも RI/SP なのが来たのかと思ったのですがアナウンスやドキュメントを見てみるとちょっと違うようです。
本日は実際に使ってみたのでその様子を紹介したいと思います。

※ 一部動作が期待した動きになっていなかったり、料金周りの確認がまだ済んでいなかったりしますが、そのあたりは後日この記事に追記しようと思います。

変更点と使い方の確認

CodeBuild ではビルドプロジェクトを作成し、プロジェクトごとにビルド環境を設定します。
ビルドが開始されるとその構成にしたがってコンピュートリソースがプロビジョニングされ、その中で Buildspec ファイルに従ってビルド処理が実行され、ビルドが終了するとプロビジョニングされたコンピュートリソースは破棄されます。

今回のアップデートでは、その時のコンピュートリソースを事前に予約しておくことが出来るようになりました。

コンソール上の変更点として、プロジェクトの環境設定では次のように新たに「プロビジョニングモデル」という選択が追加されています。

オンデマンドが従来のモデルで、リザーブドキャパシティが今回のアップデートで追加されたモデルです。
リザーブドキャパシティを選択する際にはコンピューティングリソースの設定は行わずに、事前に作成した「フリート」を選択する仕組みとなっています。

リザーブドキャパシティ用にフリートを作成するとコンピュートリソースがその時点から常に起動された状態となります。
そのためにプロビジョニングに時間がかかるようなビルド環境の場合はビルド時間を短縮出来る可能性があります。また、環境が破棄されずに複数のビルドプロジェクトで共用利用することも可能です。
一方で常に稼働している状態となるためプロジェクトのビルドが実行されていなくてもフリートがプロビジョニングされている限りは料金が発生し続けます。

リザーブドキャパシティ用にコンピュートフリートを作成する

リザーブドキャパシティを使うためにはフリートを作成する必要があります。
CodeBuild コンソールのサイドメニューに「コンピュートフリート」が追加されているので、そちらから新規作成します。

フリートではコンピュートリソースの構成情報を選択します。 このあたりは普段 CodeBuild プロジェクトを作成する際とあまり変わらないと思います。

特徴的なのは、キャパシティやスケーリングモードの設定かなと思います。
キャパシティはフリートに割り当てられるインスタンスの数で、フリートは複数のビルドプロジェクトで共用利用が可能なのですが、キャパシティの値によってお並行して実行出来るビルドの数が定義されます。

また、キャパシティの容量を超えた時の挙動としてスケーリングモードを設定します。
超えていた場合にビルドキューに入って待機して良い場合は「追加のフリート容量が使用可能になるまで待機する」を選択します。
追加でオンデマンドリソースでのプロビジョニングをさせたい場合は「オンデマンドで追加の容量をプロビジョニングする」を選択します。後者の場合はリザーブドキャパシティに加えて、超過分のオンデマンドリソースの料金も発生します。

フリートの作成はこれで終了です。
最低請求時間はあるものの、フリート削除後に伴い料金が発生しなくなるので、RI/SP のように長期利用をコミットするような機能もありません。

使ってみる

あとは冒頭少し紹介しましたが、ビルドプロジェクトのプロビジョニングモデルでリザーブドキャパシティを選択し、フリート名で作成済みのフリートを選択します。

ちなみに、リザーブドキャパシティが設定されているビルドプロジェクトは次のようにフリート ARN が設定されます。

あとはリザーブドキャパシティフリートが設定されたプロジェクトを通常どおり実行するだけです。
今回試した環境だとデフォルトの Amzon Linux 環境で Sleep コマンドを実行するだけのものだったのでほとんどリザーブドキャパシティの恩恵はありませんでした。

ビルド頻度が多かったり、あるいは開始までの実行時間に課題がある場合、プロビジョニング時のキャッシュ設定で高速化が図れるビルド環境の場合はん、ビルド時間短縮のためのオプションとして利用出来ると思います。

上限エラーが発生

リザーブドキャパシティを使ってビルド実行は出来たのですが、もう一度そのプロジェクトのビルドを実行しようとしたところ次のエラーが発生しました。

上限緩和申請などもしつつ色々試しているところではあるのですが、リザーブドキャパシティが並列実行状態でない場合はすぐにリザーブドキャパシティのリソースを使ってビルドしてほしいところですが、解放出来ていない感じでしょうか。5 時間くらい待ってみましたがずっとこの状態でした。

ちなみに、フリートのインスタンスタイプを変更した場合はまたビルド実行が出来ました。

料金

前述のとおり、リザーブドキャパシティは常にインスタンスが稼働している状態となるため、プロジェクトのビルドが実行されていなくてもフリートがプロビジョニングされている限りは料金が発生し続けます。

また、注意点としてインスタンスの実行時間に関係なく、リザーブドキャパシティのフリートにはインスタンスごとに 1 時間の初期料金がかかり、その後は追加分ごとに請求される形となります。

公式の CodeBuild 料金ページ(英語)にもリザーブドキャパシティについて追記されていますがこちらも併せて確認してください。

参考までに東京リージョンの Amazon Linux x86 large (8vCPU/15GB) の料金はオンデマンドで $0.02 USD/分、リザーブドキャパシティの場合は $0.012 USD/分となっていました。

私は見たことがないのですが、とんでもないビルド時間の環境であればコスト削減効果もあるのかもしれないですね。

さいごに

本日は AWS CodeBuild のリザーブドキャパシティを使ってみました。

ビルド頻度や実行時間によってはコスト的にかなり膨らみそうなので、採用する際にはよく気をつけたいところです。

また、リザーブドキャパシティの場合は、バッチビルドや VPC 接続などいくつかの機能が使えないのでそもそも採用出来ないケースも多そうですのでその点も注意しましょう。

いつでもどこでも気軽に採用する機能ではないイメージですね。CodeBuild をかなり集中的な使い方をしていてビルド時間短縮する方法を探している場合に検討してみては、という感じでしょうか。