🤯

Amazon Lightsail Containers は ARM アーキテクチャーとしてビルドしたコンテナイメージでは動かん!

2024/12/07に公開

最初に結論!

はい、出落ちです!

タイトルにも書いていますが、
現在提供されている Amazon Lightsail のコンテナにおいて、CPU アーキテクチャーは x86_64/AMD だけ!ARM は対応していない!
なので、Apple Silicon Mac で何も考えずにビルドしたコンテナイメージではデプロイできない!

以上!

とはいえ、何があったの?(背景)

Amazon Lightsail Containers を使って社内の新しいサービスで活用できるかどうかを検証していたときのことです。
(特に、ECR のプライベートレジストリにあるイメージからデプロイする方法の検証をしていました。[1]

検証時の具体的な流れは以下のとおりです。

  1. 簡単な Java アプリ[2]を開発端末(Mac)でコンテナイメージを作成する
  2. 作成したイメージを ECR のプライベートレジストリにプッシュする
  3. 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 の他のサービスと同じく従量課金制なので、不要な費用がかからない点も良いです。

多少の制約はありますが、個人で使ったり、遊んだりするには十分すぎるという感想です。

参考

脚注
  1. ECR プライベートレジストリからのデプロイについては、あまり参考記事がなかったので、いずれは記事化したい! ↩︎

  2. Helidon MP のクイックスタートで作ったただの Hello を返すエンドポイント。 ↩︎

  3. ECS タスク定義内のランタイムプラットフォームcpuArchitecture のデフォルト値が X86_64 です。 ↩︎

  4. Lightsail が ECS をラップしているイメージを想像しているが、定かではない。。。 ↩︎

BABY JOB  テックブログ

Discussion