🙆
【エンジニア中級~エンジニア上級】AWS環境でDockerバージョンアップ後に生じたデプロイエラーについて
はじめに
インストールしているDockerのバージョンが古くなっていて、バージョンアップの対応が必要だったため、バージョンアップした後にデプロイエラーが生じた事象がありました。バージョンアップによるもので生じるエラーなどはあったりしますが、今回の事象とその解決策を紹介します。
レベル
- エンジニア中級~エンジニア上級
※わかりやすい説明を心がけておりますが、それでも難易度は高めだと思います。
環境
- AWS
- Docker 25.03
- PHP 7.3
- Python 3.8
デプロイ方法
- Bitbucketで対象ブランチに対してタグ番号入力してタグ付けをする。
- AWSCodeBuildでBitbucketにタグ付けした値でDockerイメージを作成。
- ビルド成功したタグ番号でEC2(Jenkinsをインストール)に対してデプロイ。
構成
事象
- インストールしているDockerのバージョンが古くなっていて、バージョンアップの対応が必要だったため、バージョンアップしましや。その後、前述のデプロイ方法でデプロイをしようとしたところ、デプロイができない事象が発生しました。
- 調査し、ECSのタスクのPlatformとECRのコンテナイメージのPlatformに相違があることが原因であることは突き止めました。ECSのオペレーティングシステム/アーキテクチャは"Linux/X86_64"で"Linux/X86_64"をイメージ指定する場合、AWS CodeBuildの4.0以上のイメージ(Amazon Linux)になるのですが、これを指定するとビルドが失敗します。また、一度ECSで新しいリビジョンを作成し、その後OS/アーキテクチャを指定して作成し、作成時は"Linux/X86_64"が表示されるのですがデプロイしようとすると結果として失敗し、OS/アーキテクチャは"Linux/X86_64"ではなく、"-(ハイフン)"の表示となる事象が発生しました。
- ECSのオペレーティングシステム/アーキテクチャは Amazon Elastic Container Service > 対象のクラスター > 対象のサービス > タスク > 対象のタスク > オペレーティングシステム/アーキテクチャ で確認可能です。
- CodeBuildのイメージは "CodeBuild" > ビルドプロジェクト > 対象のビルドプロジェクト > 編集 > イメージ で確認可能です。
ECRとECS
- この記事を理解するためにECRとECSについて簡単に説明します。
- ECR (Elastic Container Registry) はコンテナイメージの保存と管理に特化したサービスです。
- ECS (Elastic Container Service) はコンテナのデプロイと管理を行うオーケストレーションサービスです。
- これらのサービスは連携して使用されることが多く、ECR に保存されたコンテナイメージを ECS でデプロイして管理することが一般的です。
エラー内容
- 下記の手順でエラーを確認する。
-
AWSコンソールに入る。
https://ap-northeast-1.console.aws.amazon.com/ -
検索欄で「ECS」を検索する。
-
対象のクラスターをクリックする。
-
対象のサービスをクリックする。
-
[ログ]をクリックし、Docker関連のエラーが生じていることを確認する。
exec /usr/local/bin/docker-php-entrypoint: exec format error
推測
- デプロイの際に"buildspec.yml"の中身を確認した際、"python:3.8"と定義されており、CodeBuild側で対応しているイメージは、Amazon Linux 2AArch64standard:2.0となります。
"Amazon Linux 2AArch64standard:2.0"でビルドした情報をECS側でデプロイしようとすると、"exec format error"となることからECS側でも、アーキテクチャを指定する必要があるのかもしれないと推測しました。
https://docs.aws.amazon.com/ja_jp/codebuild/latest/userguide/available-runtimes.html
対応方法
- buildspec.ymlファイルをPython3.8⇒Python3.9へ定義変更することで、ビルド・デプロイが成功しました。バージョンアップ自体はどうしても動作不良のリスクが生じるので、それに対応できる適応力が改めて必要だと思いました!
Discussion