MY Scribbling...

AWS Community Hero Masanori YAMAGUCHI の 雑なメモ

M1 Mac でビルドした コンテナイメージをArm64なAWS Fargateで起動する

この記事は AWS Advent Calendar 2021 22日目の記事です。

re:Invent 2021 直前の11月25日 に AWS Fargate の AWS Graviton2 のサポートが発表されました。

aws.amazon.com

今まで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されました。

f:id:kinunori:20211222191302p:plain

つづいてタスク定義を作成していきます。マネージメントコンソールの場合、新しいECSコンソールでなければ、アーキテクチャの選択(Graviton2なタスク定義を作成)できないので注意です。

f:id:kinunori:20211222191322p:plain f:id:kinunori:20211222191338p:plain

タスク定義作成後は、これまでFargateでタスクを起動する時と同じように、サービスを登録していきます。

f:id:kinunori:20211222191356p:plain

タスクが実行中になりましたので、実際に動作をみてみましょう。うまく動作しているのであればログに Hey, Yo! が1秒間隔で出力されているはずです。

f:id:kinunori:20211222191426p:plain

無事動作していることが確認できました。

f:id:kinunori:20211222191456p:plain

M1 MacでビルドしたコンテナイメージをARM64なFargate上で動作させることができました。
実際にはマルチアーキテクチャーイメージを用いるケースが多いと思いますが、テスト用にM1 MacでビルドしたコンテナイメージをAWS Fargateでサクッと動かせるのは個人的に嬉しいアップデートでした。