初めに
本日 docker-compose
を使ってみた記事を書いたので、AWS ECS でも使えないかと調べたところ、ブログで見つけました。いずれ使うときが来るかもしれないのでメモとして残しておきます。
こちらが AWS ECS に Docker Compose でアプリケーションをデプロイする公式ブログになります。
以下の記事も参考にしました。デプロイの詳細な手順について非常にわかりやすく書かれております。
準備
Linux で Docker Compose CLI を使用するための前提条件があります。
1 . Docker Desktop 最新版をダウンロードしインストールしていることが必要です。
- Download for Mac
- Download for Windows
あるいは Docker Compose CLI for Linux をインストールしていることが必要です。
2 . AWS アカウントを持っていることが必要です。
こちらのドキュメントを参考にインストールスクリプトを使用します。
curl -L https://raw.githubusercontent.com/docker/compose-cli/main/scripts/install/install_linux.sh | sh
AWS コンテキストの生成
このコンテキストにより AWS への認証を行います。aws configure
コマンドで認証情報をローカルに登録後、以下のコマンドを実行します。
docker context create ecs myecscontext
なお、このコマンド実行時、以下のエラーが発生しました。インスタンスに再ログインしたところ、正常に動作しました。
"docker context create" requires exactly 1 argument. when docker context create ecs myecscontext is executed
An existing AWS profile
を選択します。
[ec2-user@ip-172-31-39-188 compose]$ docker context create ecs myecscontext
? Create a Docker context using: [Use arrows to move, type to filter]
> An existing AWS profile
AWS secret and token credentials
AWS environment variables
ECS へデプロイ
以下の記事で使用したアプリケーションを使用します。
編集前
version: '3'
services:
web:
build: .
ports:
- "8080:5000"
volumes:
- .:/code
redis:
image: "redis:alpine"
編集後
version: '3'
services:
web:
image: "123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/web-app:latest"
ports:
- "5000:5000"
redis:
image: "redis:alpine"
flask イメージはビルドではなく、ECR にプッシュしておきます。
ポート番号を 5000:5000
に変更したのは、docker compose up
コマンド実行時に以下のエラーが発生したためです。
published port can't be set to a distinct value than container port: incompatible attribute
コンテキストを切り替えます。
docker context use myecscontext
現在のコンテキストを確認するには docker context ls
コマンドを実行します。
[ec2-user@ip-172-31-39-188 compose]$ docker context ls
NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATOR
default moby Current DOCKER_HOST based configuration unix:///var/run/docker.sock swarm
myecscontext * ecs
コンテキストを切り替えた後ですが、通常の docker コマンドは使用できなくなるようです。例えば docker ps
は使えなくなりました。
[ec2-user@ip-172-31-39-188 compose]$ docker ps
Command "ps" not available in current context (myecscontext)
こういった場合、コンテキストをデフォルトに戻します。
docker context use default
compose コマンドで ECS ヘアプリケーションをデプロイします。
docker compose up
以下はコマンド実行中です。完了すると、すべて青色に変わり、ユーザー入力を受け付けるようになります。
デプロイの後、http://NLB の DNS 名:ポート番号
にアクセスします。これは例えば以下のような URL です。
http://compo-loadb-1grujljfn1mmd-06b3d6a23c13c06a.elb.ap-northeast-1.amazonaws.com:5000/
リソース削除には以下のコマンドを実行します。
docker compose down
AWS リソースの確認
docker compose up
によって新規に作成されたリソースを確認します。VPC、サブネット、セキュリティグループはデフォルトのものが用いられていました。
- クラスター
クラスター名ですが、ローカルマシンの docker-compose.yml
ファイルが存在するディレクトリのディレクトリ名が付けられていました。
- サービス
flask タスクと redis タスクのサービスがそれぞれ作成されています。
- NLB
参考記事