Amazon Lightsail Containers は ARM アーキテクチャーとしてビルドしたコンテナイメージでは動かん!
最初に結論!
はい、出落ちです!
タイトルにも書いていますが、
現在提供されている Amazon Lightsail のコンテナにおいて、CPU アーキテクチャーは x86_64/AMD だけ!ARM は対応していない!
なので、Apple Silicon Mac で何も考えずにビルドしたコンテナイメージではデプロイできない!
以上!
とはいえ、何があったの?(背景)
Amazon Lightsail Containers を使って社内の新しいサービスで活用できるかどうかを検証していたときのことです。
(特に、ECR のプライベートレジストリにあるイメージからデプロイする方法の検証をしていました。[1])
検証時の具体的な流れは以下のとおりです。
- 簡単な Java アプリ[2]を開発端末(Mac)でコンテナイメージを作成する
- 作成したイメージを ECR のプライベートレジストリにプッシュする
- Lightsail の管理コンソール上からイメージのプルとデプロイをおこなう
この流れでデプロイすると、ログにこのような文言が出て、デプロイが失敗します。
exec /usr/java/jdk-21/bin/java: exec format error
このエラーログは、Java の実行フォーマットと実行環境との間で問題があるときに出ます。
冒頭の結論にあったとおり、イメージビルドしたのは、M2 Mac(ARM)で行っており、おそらく Lightsail が x86_64/AMD なのだろうと思い、ローカルでのビルドを以下のように変更しました。
docker buildx build --platform linux/amd64 -t <image-name>:<tag> .
改めて、ECR にプッシュし、Lightsail でデプロイすると、正常に動きましたー!\(^o^)/わぁい!
公式ドキュメントにはどう書いているの?
きっと、自分が公式のドキュメントを見落としているからだと思い、公式ドキュメントを見てみました。
。
。。
。。。
が、Lightsail のドキュメントで CPU アーキテクチャーについての記載は見当たりませんでした。。。
(もし、ここだよってあればお願いします。自分でも見つけられれば、更新します!)
結果としては、上記の通り、ARM では動かず、x86_64/AMD に変更することで動いたので、実際そうなのだろうと理解しました。
また、AWS が提供している他のコンテナオーケストレーションである ECS を見ると、基本的には、x86_64
がデフォルトです。[3]
なので、Lightsail は他のサービスと比べると設定周りがシンプル・簡素にしたものなので、このあたりはデフォルト値がベースになるのかなと推測しました。[4]
逆に、費用が比較的安いということから考えると、AWS Graviton で動いているんかなーと思っていたのですが、そうではなさそうですね。(ここも推測です。)
結論(再掲)
再掲になりますが、結論は以下です。
現在提供されている Amazon Lightsail のコンテナにおいて、CPU アーキテクチャーは x86_64/AMD だけ!ARM は対応していない!
なので、Apple Silicon Mac で何も考えずにビルドしたコンテナイメージではデプロイできない!
ドキュメントも一通り眺めてみて、CPU アーキテクチャーについては記載がないですが、検証結果から推測しての結論になります。
この記事が誰かのお役にたてば幸いです。
余談(Lightsail に対しての印象)
今回は Lightsail については深く取り上げていないですが、
Lightsail 自体は AWS 上で簡単にシステムやアプリをローンチできる仕組みなので、機能の検証などには十分使えると感じました。
また、AWS の他のサービスと同じく従量課金制なので、不要な費用がかからない点も良いです。
多少の制約はありますが、個人で使ったり、遊んだりするには十分すぎるという感想です。
参考
- Amazon Lightsail
- Amazon Lightsail Documentation
- クラウド上でコンテナ化されたアプリケーションを実行する簡単な方法である Amazon Lightsail Containers の発表
-
ECR プライベートレジストリからのデプロイについては、あまり参考記事がなかったので、いずれは記事化したい! ↩︎
-
Helidon MP のクイックスタートで作ったただの Hello を返すエンドポイント。 ↩︎
-
ECS タスク定義内のランタイムプラットフォームの
cpuArchitecture
のデフォルト値がX86_64
です。 ↩︎ -
Lightsail が ECS をラップしているイメージを想像しているが、定かではない。。。 ↩︎
私たち BABY JOB は、子育てを取り巻く社会のあり方を変え、「すべての人が子育てを楽しいと思える社会」の実現を目指すスタートアップ企業です。圧倒的なぬくもりと当事者意識をもって、こどもと向き合う時間、そして心のゆとりが生まれるサービスを創出します。baby-job.co.jp/
Discussion