AWS batchでdocker loginしてジョブを実行する方法


背景

「そんなのECRにイメージおけばいいじゃない?」なんですが、すでにDockerHubでレポジトリを管理するように全体設計してしまった私のような人がいると思ったので。
もしくは、自前でdockerレポジトリを管理している人がいるのだろうと思い。

前提条件

・DockerHubなりの認証が必要な場所にdockerのイメージが登録されている
・EC2でAmazon Linuxのインスタンスが起動している
・AWSのbatchを使ってジョブが起動出来る

手順

EC2のインスタンスでECSの要件を満たす

batchから起動できるAMIには下記の必要条件(マニュアルはこちら)を満たしている必要があります。

  • ECSコンテナエージェントが起動していること
  • CloudWatchにログが出力できること
  • dockerが使えること

なので、起動しているEC2インスタンスにsshでアクセスして作業します。

$ ssh -i ec2.key ec2-user@[EC2のIPアドレス]
# ECSコンテナエージェントをインストールします。
$ sudo amazon-linux-extras install -y ecs; sudo systemctl enable --now ecs
#dockerをインストールします。
$ yum install -y docker

これで要件をみたしました。

DockerHubの認証をしたAMIを作成する

次にDockerHubの認証をして、batchで起動した時にその認証情報が使えるようにします。

# DockerHubにログイン
$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don’t have a Docker ID, head over to https://hub.docker.com to create one.
Username: xxxxxxxxx
Password:
Login Succeeded

ログインをすると、「~/.docker/config.json」に下記のようなログイン情報が生成されます。
下記はDockerHubにログインした場合です。
他のレポジトリや複数のレポジトリを使う場合の記述方法

{
  "auths": {
    "https://index.docker.io/v1/": {
      "auth": "zq212MzEXAMPLE7o6T25Dk0i"
    }
  }
}

これを下記のようにbatchがEC2を起動させる時に読み込む設定ファイルに記述します。

$ sudo vi /etc/ecs/ecs.config
# 下記を記入
ECS_ENGINE_AUTH_TYPE=dockercfg
ECS_ENGINE_AUTH_DATA={"https://index.docker.io/v1/":{"auth":"zq212MzEXAMPLE7o6T25Dk0i","email":"[email protected]"}}

ここまで出来たらEC2のコンソール画面から設定をしたEC2にチェックを入れて「アクション」→「イメージとテンプレート」→「イメージを作成」と選択し、イメージ名を指定してAMIを作成します。

AMIを指定してジョブの登録

AMIの登録が完了したらAMIを使ってジョブを起動できるようにします。
まずはAWS Batchのコンソール画面で「コンピューティング環境」→「作成」と進みます。
そして、画面下の「追加設定:テンプレート、ユーザ指定のAMIを起動」を開いて、「ユーザ指定のAMI ID」の「有効化」にチェックを入れます。
すると、下記画像のようにAMI IDを入力するテキストボックスが表示されるので、先ほど登録したAMIのIDを貼り付けます。

その他の必要項目を設定したら、「コンピューティング環境の作成」をクリックし、コンピューティング環境を登録します。
次に「ジョブキュー」→「作成」と進んで先ほど登録したコンピューティング環境を使ったジョブキューを登録します。

必須項目を入力して「作成」をクリックし、ジョブキューの登録は完了です。
最後に、ジョブ定義で利用したいプライベートレポジトリのイメージを指定します。

必須項目を入力して「作成」をクリックし、ジョブ定義の登録も完了です。

あとはジョブキューとジョブ定義を使って新たにジョブを登録すれば、プライベートレポジトリのイメージを使ったdockerコンテナでジョブ定義のコマンドを実施できます。

参考URL

https://docs.aws.amazon.com/batch/latest/userguide/compute_resource_AMIs.html#batch-ami-spec
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/private-auth-container-instances.html#docker-auth-formats
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html