ECSのコンテナインスタンス上でコンテナをちょっとだけ立ち上げてデバッグする

2021.07.06

こんにちは!DA(データアナリティクス)事業本部 インテグレーション部の大高です。

先日、EC2を利用したECSコンテナインスタンス上で「タスク」を動かそうとしていたのですが、「タスク」の起動直後にエラーが発生して即座に「タスク」が停止してしまうので困っていました。

この原因の調査の際に、該当「タスク」で利用しているイメージのコンテナをECSコンテナインスタンス上で起動して、ログイン・調査する方法を調べたので、まとめておきたいと思います。

前提

今回は以下のようなケースを前提としています。

単純なものであればローカル環境のDockerで該当イメージのコンテナを起動すれば良いのですが、下記のような状況の為に「ローカル環境のDockerでのデバッグが難しく、ECSコンテナインスタンス上でデバッグをした」という経緯となっています。

  • ECSは起動タイプ「EC2」を利用している(Fargateではない)
    • EC2インスタンスにはAWS Systems Manager(SSM)の「セッションマネージャー」でログインができる
  • ECS上で起動する「タスク」の「コンテナ」イメージはECR上のイメージを利用
  • 「タスク」には「ボリューム」が「Bind Mount」で設定してあり、コンテナ上からマウントポイント経由でアクセスできる
    • 「EC2」上のバインドマウントするディレクトリはEFSのファイルシステムがマウントされている
  • 「タスク」の「コンテナ」環境変数には、パラメータストアから取得した変数が設定される
  • コンテナの処理において、該当のコンテナインスタンスからしかアクセスできないデータベースにアクセスをする
  • 利用しているリージョンは「ap-northeast-1」

コンテナインスタンス上でコンテナを立ち上げる

では、本題です。具体的には下記のコマンドでコンテナを立ち上げてログインしました。ログイン後にはbash上で色々操作可能なので、あとは必要に応じてデバッグを行うだけです。

## ECRにログイン
aws ecr get-login-password \
    --region=ap-northeast-1 \
| sudo docker login \
    --username AWS \
    --password-stdin \
    123456789012.dkr.ecr.ap-northeast-1.amazonaws.com

## 指定イメージのコンテナを立ち上げてログイン
sudo docker run \
  --mount type=bind,src=/efs,dst=/etc/efs \
  --rm -t -i \
  123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/foo/bar:latest \
  /bin/bash

以下、各コマンドの簡単な説明です。

aws ecr get-login-password

こちらはECRのレジストリにログインするためのコマンドです。イメージをECRに登録しているため、こちらを実行しています。 なお、aws ecr get-loginはAWS CLI v2では廃止されているのでaws ecr get-login-passwordを利用しています。

ECRのレジストリは、自身で利用しているAWSアカウント、リージョンに合わせて指定をします。

sudo docker run

Dockerコンテナを起動してログインします。

--mount type=bind,src=/efs,dst=/etc/efs の箇所では、コンテナにディレクトリをバインドマウントしています。この例だとEC2上の/efsディレクトリを、コンテナ側の/etc/efsに割り当てています。

また、--rmオプションを指定することで、コンテナ終了時に、自動的に削除するようにしています。なお、コンテナのイメージが未取得の場合には、このコマンドの実行時に自動的に取得されます。

まとめ

以上、ECSのコンテナインスタンス上でコンテナをちょっとだけ立ち上げてデバッグしてみました。

「どうしてもECSコンテナインスタンスでコンテナを動かさないとデバッグが捗らない!」という場合に役立つかもしれません。

どなたかのお役に立てば幸いです。それでは!