🙆

【エンジニア中級~エンジニア上級】AWS環境でDockerバージョンアップ後に生じたデプロイエラーについて

2024/10/31に公開

はじめに

インストールしているDockerのバージョンが古くなっていて、バージョンアップの対応が必要だったため、バージョンアップした後にデプロイエラーが生じた事象がありました。バージョンアップによるもので生じるエラーなどはあったりしますが、今回の事象とその解決策を紹介します。

レベル

  • エンジニア中級~エンジニア上級
    ※わかりやすい説明を心がけておりますが、それでも難易度は高めだと思います。

環境

  • AWS
  • Docker 25.03
  • PHP 7.3
  • Python 3.8

デプロイ方法

  1. Bitbucketで対象ブランチに対してタグ番号入力してタグ付けをする。
  2. AWSCodeBuildでBitbucketにタグ付けした値でDockerイメージを作成。
  3. ビルド成功したタグ番号で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 でデプロイして管理することが一般的です。

エラー内容

  • 下記の手順でエラーを確認する。
  1. AWSコンソールに入る。
    https://ap-northeast-1.console.aws.amazon.com/

  2. 検索欄で「ECS」を検索する。

  3. 対象のクラスターをクリックする。

  4. 対象のサービスをクリックする。

  5. [ログ]をクリックし、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