docker compose up だけで AWS にデプロイする

Deploying Docker containers on ECS をやってみたログ。

環境設定

Windows ユーザーの場合は特段の事情がなければ素直に Docker for Windows を入れたほうが早いと思うので、今回は Docker for Windows を入れた。

WSL2 上の Ubuntu に直接 docker cli をインストールしている場合、docker compose up といったコマンドは使える状態でも Docker Compose CLI をインストールしていなければ docker context create ecs myecscontext でエラーになる。

context の作成

docker context create ecs myecscontext

のコマンドを打つと対話式で context が作成できる。

私は AWS secret and token credentials で作ってみた。

リージョンについて

リージョンを選択できたので ap-northeast-1 を選択したのだが、この後のデプロイ時に実際にデプロイされた先は us-east-1(バージニア北部)だった。

この issue を見てみて、どうやら ~/.aws 配下のファイルにリージョンが書いてあるようなので見てみた。

~/.aws/config

[profile default]
region = ap-northeast-1

~/.aws/credentials

[default]
aws_access_key_id     = xxxxxxx
aws_secret_access_key = yyyyyyyyy

このコメントの人が書いている例と比較すると

  • ~/.aws/config のほうで [profile default][default] に書き換えなければいけない
  • ~/.aws/credentials のほうに region が足りない

ここを直したら東京にデプロイできるかもしれないが動作は未確認。

デプロイ

docker-compose.ymlを全自動でAWS ECSにデプロイ』をパクって下記の compose.yaml でデプロイしてみる。

services:
  db:
    image: mysql:8.0
    command: '--default-authentication-plugin=mysql_native_password'
    volumes:
      - db_data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=rootpassword
      - MYSQL_DATABASE=wordpress
      - MYSQL_USER=wpuser
      - MYSQL_PASSWORD=password
  wordpress:
    image: wordpress:latest
    ports:
      - 80:80
    environment:
      - WORDPRESS_DB_HOST=db
      - WORDPRESS_DB_USER=wpuser
      - WORDPRESS_DB_PASSWORD=password
      - WORDPRESS_DB_NAME=wordpress
volumes:
  db_data:

docker context show コマンドで現在の context を確認できる。
AWS へのデプロイ前に docker context use myecscontext を打って context を切り替えておく。

準備ができたら docker compose up してしばらく待つ。

ここで私の場合、初回はエラーとなり失敗してしまった。構築に失敗すると自動で作成された諸々が削除される。

エラー内容は下記の通り。

DbService TaskFailedToStart: ResourceInitializationError: failed to invoke EFS utils commands to set up EFS volumes: stderr: Failed to resolve “xxx.efs.us-east-1.amazonaws.com” - check that your file system ID is correct, and ensure that the VPC has an EFS mount target for this file system ID. See https://docs.aws.amazon.com/console/efs/mount-dns-name for more detail. Attempting to lookup mount target ip address using botocore. Failed to import necessary dependency botocore, please install botocore first. : unsuccessful EFS utils command execution; code: 1

EFS は compose.yml でいう volumes 部分に対応して作られていたリソースだった。

AWS から下記のようなメールが来ていたため、どうやら初回アクセス時は追加の検証が走っていたらしい。

You recently requested an AWS Service that required additional validation. Your request has now been validated for AWS US East (N. Virginia) region(s).

エラーによる削除が終わった後、再度 docker compose up したら成功した。

作成されたコンテナにアクセス

残念ながら docker compose ps で表示したエンドポイントにブラウザでアクセスしても WordPress を表示できなかった。
料金が怖かったので深追いしなかったのだが、EC2 や LB や CloudWatch のロググループなどは作成されていたし、docker compose logs を見てもデプロイされているっぽかった。
私がデプロイした先がバージニア北部になってしまっていたことが関係あるかもしれない。

削除

docker compose down コマンドで諸々削除される。

なお amazon EFS には db データの volume が残る。
ここに書いてある通り、再度デプロイすると同じ volume がアタッチされる。
もう使わないなら自分で消す必要がある。

また IAM のロールも全部は消えていなかった。

感想

コマンド一つでデプロイできるのは便利だが、何が生成されたかもわからないままデプロイできてしまうのはちょっと不安だなと思った。
もちろん実際には事前に VPC の設定などを行っておかなければバックエンド部分までパブリックサブネットにデプロイされそうなので、本当に何もわからないまま本番運用するようなことは無いと思うが……。

あと試した後で context 切り替えておかないとうっかり AWS にデプロイしてしまうので気を付ける。
もしくは最初から context 切り替えではなく --context myecscontext フラグで context を都度変えるほうが安心かもしれない。

以上