M1 Mac でビルドした コンテナイメージをArm64なAWS Fargateで起動する
この記事は AWS Advent Calendar 2021 22日目の記事です。
re:Invent 2021 直前の11月25日 に AWS Fargate の AWS Graviton2 のサポートが発表されました。
今までAWS Fargateで起動するDockerイメージはx86_64(64ビット x86ベースシステム)用のコンテナイメージとしてビルドする必要がありましたが、Gravition2に対応したことにより、ARM64(64ビット ARMベースシステム)用にビルドしたコンテナイメージを起動することができるようになりました。
マルチアーキテクチャイメージやAmazon ECRでイメージマニフェストにARM64を含むイメージを利用し、AWS Fargateのアーキテクチャによって起動するイメージを切り替えることも可能となります。
今までテスト用途などでAWS Fargate用のコンテナイメージをローカルでビルドする場合は、Cloud9上でdocker buildしECRのプッシュするなどひと手間必要だったのですが、AWS FargeteがGravition2に対応したことにより、同じARM64アーキテクチャなM1 MacでビルドしたコンテナイメージをAWS Fargate上で動作させることできるようになったことが個人的にとても嬉しかったので記事にしてみました。
今回は Toriさんの everlasting-hey-yo を使ってM1 MacでビルドしたコンテナイメージをAWS Fargate上で動作させることができるか試してみます。
まず、Githubのeverlasting-hey-yoリポジトリから、Dockerfileとhey-yo.shを作業ディスプレイにPullしてきます。Dockerfile、hey-yo.shは何も編集せずにそのまま利用します。
Dockerfile
FROM busybox COPY . . RUN chmod +x ./hey-yo.sh ENTRYPOINT [ "./hey-yo.sh" ]
hey-yo.sh
$ cat hey-yo.sh #!/bin/sh DEFAULT_MSG="Hey, Yo!" ANOTHER_MSG="Check It Out! Yo!" trap IWillNeverDie 15 Output () { MSG="$1" if [ "x${TIMESTAMP}" != "x" ]; then TS=$(date -Iseconds) MSG="${TS} ${MSG}" fi echo "${MSG}" } IWillNeverDie () { if [ "x${LET_ME_DIE}" != "x" ]; then Output "Hey, he..." sleep 3 exit 0 else Output "Hey, Hey, ${DEFAULT_MSG}!!" fi } while true do MSG="${DEFAULT_MSG}" # GIVE_ME_PATTERNS if [ "x${GIVE_ME_PATTERN}" != "x" ]; then if [ $((${RANDOM} % 2)) = 1 ]; then MSG="${ANOTHER_MSG}" fi fi Output "$MSG" sleep 1 done
コンテナイメージをビルドします。
$ docker build . [+] Building 4.5s (8/8) FINISHED => [internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 36B 0.0s => [internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [internal] load metadata for docker.io/library/busybox:latest 3.4s => [internal] load build context 0.0s => => transferring context: 60B 0.0s => [1/3] FROM docker.io/library/busybox@sha256:b5cfd4befc119a590ca1a81d6bb0fa1fb19f1fbebd03 0.8s => => resolve docker.io/library/busybox@sha256:b5cfd4befc119a590ca1a81d6bb0fa1fb19f1fbebd03 0.0s => => sha256:b5cfd4befc119a590ca1a81d6bb0fa1fb19f1fbebd0397f25fae164abe1e8a 2.29kB / 2.29kB 0.0s => => sha256:db67d231d7de3d552b371543cf04d8f702482bc04d841997fcee2b1400d2cb83 527B / 527B 0.0s => => sha256:b34806a1af7a987f39848926ad7e4f8f191468473b1a97a6155ec855545bab 1.47kB / 1.47kB 0.0s => => sha256:092c822dea67ab2d03cf39c60d0f28925815e05899e5e780fd16b09c8d 828.49kB / 828.49kB 0.3s => => extracting sha256:092c822dea67ab2d03cf39c60d0f28925815e05899e5e780fd16b09c8da2756d 0.4s => [2/3] COPY . . 0.0s => [3/3] RUN chmod +x ./hey-yo.sh 0.2s => exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:62e66d37c42a889b37137ee096e8b5969aeeaee6781a7b6f8c77ce02fa720bc5 0.0s Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
続いてビルドしたイメージをECRにプッシュします。(事前にECR上のリポジトリは作成しておく必要があります)
$ docker tag 62e66d37c42a 12345678912.dkr.ecr.ap-northeast-1.amazonaws.com/everlasting-hey-yo:20a133e $ aws ecr get-login-password --region ap-northeast-1 --profile ecr-push | docker login --username AWS --password-stdin 12345678912.dkr.ecr.ap-northeast-1.amazonaws.com Login Succeeded $ docker push 12345678912.dkr.ecr.ap-northeast-1.amazonaws.com/everlasting-hey-yo:20a133e The push refers to repository [12345678912.dkr.ecr.ap-northeast-1.amazonaws.com/everlasting-hey-yo] 90ee5dfb3b89: Pushed 2da41e23cf2a: Pushed 48160e1f49aa: Pushed 20a133e: digest: sha256:5efe060bd6e2b0b82c8acdaf41df7d7bb8ce6cf8f6f066e9e67a1d6d86ebd200 size: 9
ECRのリポジトリにコンテナイメージがPushされました。
つづいてタスク定義を作成していきます。マネージメントコンソールの場合、新しいECSコンソールでなければ、アーキテクチャの選択(Graviton2なタスク定義を作成)できないので注意です。
タスク定義作成後は、これまでFargateでタスクを起動する時と同じように、サービスを登録していきます。
タスクが実行中になりましたので、実際に動作をみてみましょう。うまく動作しているのであればログに Hey, Yo! が1秒間隔で出力されているはずです。
無事動作していることが確認できました。
M1 MacでビルドしたコンテナイメージをARM64なFargate上で動作させることができました。 実際にはマルチアーキテクチャーイメージを用いるケースが多いと思いますが、テスト用にM1 MacでビルドしたコンテナイメージをAWS Fargateでサクッと動かせるのは個人的に嬉しいアップデートでした。