Arm64コンテナをビルドする方法(Github Actions)
1. 目的
Fargateのx86アーキテクチャで動かしているコンテナをコスト削減とパフォーマンス向上のためにArm64に移行します。
今回の検証は開発環境で動作するアプリケーションが対象です。コンテナイメージのアーキテクチャを変更してArm64プラットフォームにデプロイします。
正常にデプロイができたら、移行後で問題なく実行できるかテストをします。
前提条件
- Github ActionsとAWSのCodeシリーズでCI/CD環境を構築
- DockerイメージはGithub Actionsでビルド
現在のビルド環境ではGithub Actionsのワークフロー内でコンテナをビルドしているので、コンテナのアーキテクチャもGithub Actions内のビルド環境に依存しています。
そこでGithub ActionsでArm64アーキテクチャのイメージをビルドするためにはQEMUというエミュレータかArm64対応Runnerを使用します。
- QEMUを使用する方法にはビルド時間が長くなるというデメリットがあるため、今回はArm64対応Runnerを採用します。
Arm64対応Runnerの概要については下記を参考にさせていただきました。
2. 移行方法
現状のx86アーキテクチャのコンテナを移行します。
- Actionsのworkflowを書き換える
- Actionsのビルド環境をArm64プラットフォームに変更する
- ECSのタスク定義を書き換えてArm64のFargate基盤を使用する
まずは新しいビルド環境を作成します。
Organizationsアカウントの Setting > Actions > Runnersを選択します。
New runner > New GitHub-hosted runnerを選択して新しいRunnerを作成します。
今回作成する環境は下記のように設定します。
項目 | 設定 |
---|---|
Platform | Linux ARM64 |
Image | Ubuntu 24.04 by Arm Limited |
Size | 2-core |
Runnerが作成されました。
workflowの変更
元のワークフローではruns-onで使用するプラットフォームを指定していました。
jobs:
build_and_push:
runs-on: ubuntu-latest
こちらを先ほど作成したRunnerの環境を使用するように変更します。
jobs:
build_and_push:
strategy:
matrix:
include:
- platform: linux/arm64
runner: Linux-Arm64_Ubuntu24.04_2-core
runs-on: ${{ matrix.runner }}
ビルド時のプラットフォームも同様に指定します。
uses: docker/build-push-action@v5
with:
push: true
platforms: ${{ matrix.platform }} // platformsを指定
続いて、ECSでコンテナを作成する際のタスク定義を変更します。
Fargateのプラットフォームを変更するにはタスク定義のrunPlatformに指定します。
"runtimePlatform": {
"cpuArchitecture": "ARM64", // X86_64からARM64に変更
"operatingSystemFamily": "LINUX"
}
taskdef.jsonのcpuArchitectureをARM64に変更しました。
タスクをデプロイして、タスクの設定を確認します。
うまくいきました!
本来環境以降の際にはベンチマークテストが必要だと思いますが、機会があればx86環境との比較も実施してみたいです。
3. まとめ
EC2をGraviton基盤に移行する際にもArm64への移行は意外と簡単だと感じていましたが、今回もコンテナの実行環境を1日で移行させることができました。
移行する際の検討材料が多いということで躊躇わず、まずは検証環境を作成して試してみると新しい発見があるかもしれません。
今回はランナーの構築から実行までの手順を通して、Arm64環境への移行がスムーズに行えることを確認できました。次回は、パフォーマンスの詳細なベンチマークやコスト削減効果を評価する予定です。
Discussion