Amazon ECS CLIでローカル環境の起動テストを行った。
プロローグ
受託しているシステム開発で、EC2インスタンス内で動いているPyrhonアプリをECS(Amazon Elastic Container Service)に追い出すことにした。
Pythonで書かれている部分は4週ごとに使用され利用が集中するためである。いつも動いているならインスタンスをスケールアップするかスケールアウトするかなのだが、ウチが請けた時点で出来上がっているJavaアプリは思いっきりステートフルなのでスケールアウトできないし、4週ごとに集中するだけでその間は全く使用されないため、インスタンスをスケールアップするのはコスト的にもったいない。
そもそも発注元が他社に投げて作らせて、まったくお気に召さないということで再度ウチに発注してきたものなので、もしかするとPythonじゃなくなるかもしれないのだが、周期的に集中するのは利用ユーザの制度上変わりがない。
ちょっと試してみただけで、一発で16.9%、2多重で起動したら33.8%まで上がった。ざっくり6多重~7多重で走ったら完全に他のアプリに影響する。
これはコンテナ化してECSに追い出すのが妥当である。
というわけなのだが、手元でDocker ComposeしたままECSで動けばいいのだが、ECSは独自仕様とのこと。Kubernetes(K8s)を使うほどのこともないのでEKS(Amazon Elastic Kubernetes Service)よりはECSがいいだろう。
ECSタスク定義でローカル起動
で、専務に試しておくように言われて下記を参考に環境を作ってみた。
dev.classmethod.jp
タイトルで説明されているが、Docker ComposeではなくECS CLIで作成したタスク定義がローカルマシンで動く。
最初WSL2のUbuntu上で実行していたのだが、Dockerが動かない。
shigeo-t.hatenablog.com
shigeo-t.hatenablog.com
Dockerが動いているUbuntuだと思ったのだがインストールされていない。そこで使わなくなったUbuntuのVMを3本ほど消去してVMでやり直した。Ubuntu18.04をクリーンインストールである。
DockerとDocker Composeインストール
こんな感じでインストール。
qiita.com
komone-life.com
ECS CLIインストール
こちらはAWS標準の手順で。
docs.aws.amazon.com
インストールを行う。
ubuntu180401@ubuntu:~$ sudo curl -Lo /usr/local/bin/ecs-cli https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-linux-amd64-latest
[sudo] ubuntu180401 のパスワード:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 35.6M 100 35.6M 0 0 2355k 0 0:00:15 0:00:15 --:--:-- 2572k
ubuntu180401@ubuntu:~$ sudo apt-get install gpg -y
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
gpg はすでに最新バージョン (2.2.4-1ubuntu1.4) です。
以下のパッケージが自動でインストールされましたが、もう必要とされていません:
python3-click python3-colorama
これを削除するには 'sudo apt autoremove' を利用してください。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 1 個。
ubuntu180401@ubuntu:~$ sudo apt autoremove
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージは「削除」されます:
python3-click python3-colorama
アップグレード: 0 個、新規インストール: 0 個、削除: 2 個、保留: 1 個。
この操作後に 332 kB のディスク容量が解放されます。
続行しますか? [Y/n] y
(データベースを読み込んでいます ... 現在 167022 個のファイルとディレクトリがインストールされています。)
python3-click (6.7-3) を削除しています ...
python3-colorama (0.3.7-1) を削除しています ...
ubuntu180401@ubuntu:~$ sudo gpg --keyserver hkp://keys.gnupg.net --recv BCE9D9A42D51784F
gpg: *警告*: homedir '/home/ubuntu180401/.gnupg'の安全でない所有
gpg: key BCE9D9A42D51784F: 鍵がないため5個の署名は検査しません
gpg: 鍵BCE9D9A42D51784F: 公開鍵"Amazon ECS <ecs-security@amazon.com>"をインポートしました
gpg: 究極的に信用する鍵が見つかりません
gpg: 処理数の合計: 1
gpg: インポート: 1
ubuntu180401@ubuntu:~$ curl -Lo ecs-cli.asc https://amazon-ecs-cli.s3.amazonaws.com/ecs-cli-linux-amd64-latest.asc
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 821 100 821 0 0 1055 0 --:--:-- --:--:-- --:--:-- 1053
署名の検証では日本語で表示されるとこうなる。AWSの説明でも問題ないと書いているので問題ないということで進める。
ubuntu180401@ubuntu:~$ sudo gpg --verify ecs-cli.asc /usr/local/bin/ecs-cli
gpg: *警告*: homedir '/home/ubuntu180401/.gnupg'の安全でない所有
gpg: Mon 21 Dec 2020 02:39:57 PM PSTに施された署名
gpg: RSA鍵DE3CBD61ADAF8B8Eを使用
gpg: "Amazon ECS <ecs-security@amazon.com>"からの正しい署名 [不明の]
gpg: *警告*: この鍵は信用できる署名で証明されていません!
gpg: この署名が所有者のものかどうかの検証手段がありません。
主鍵フィンガープリント: F34C 3DDA E729 26B0 79BE AEC6 BCE9 D9A4 2D51 784F
副鍵フィンガープリント: EB3D F841 E2C9 212A 2BD4 2232 DE3C BD61 ADAF 8B8E
インストールされている。
ubuntu180401@ubuntu:~$ sudo chmod +x /usr/local/bin/ecs-cli
ubuntu180401@ubuntu:~$ ecs-cli --version
ecs-cli version 1.21.0 (bb0b8f0)
ECSタスク定義を作ってローカル環境で動かす
参考例にそのまま従ってやってみる。wp-mysql.jsonを作った。
ubuntu180401@ubuntu:~/ecs$ ls -las
合計 12
4 drwxrwxr-x 2 ubuntu180401 ubuntu180401 4096 Jun 13 20:51 .
4 drwxr-xr-x 21 ubuntu180401 ubuntu180401 4096 Jun 13 20:50 ..
4 -rw-rw-r-- 1 ubuntu180401 ubuntu180401 655 Jun 13 20:51 wp-mysql.json
なお、オレはdockerコマンドでそれぞれ起動するのは自分でできるが、docker-composeコマンドはよくわかってない。そのため準備として事前にこんなのを読んでた。そもそもDockerにしても触るのが半年ぶりで覚えてないw
matsuand.github.io
Docker Composeファイルのローカル生成はうまくいった。
ubuntu180401@ubuntu:~/ecs$ ecs-cli local create --task-def-file wp-mysql.json --output docker-compose.wp-mysql.yml
INFO[0000] Reading task definition from /home/ubuntu180401/ecs/wp-mysql.json
INFO[0000] Successfully wrote docker-compose.wp-mysql.yml
INFO[0000] Successfully wrote docker-compose.wp-mysql.override.yml
ecs-cliコマンドのコマンドラインリファレンスにはecs-cli localが無い。
docs.aws.amazon.com
別建てになってた。
docs.aws.amazon.com
次はローカル実行してみる。
ubuntu180401@ubuntu:~/ecs$ sudo ecs-cli local up --task-def-compose docker-compose.wp-mysql.yml
INFO[0000] Creating network: ecs-local-network...
INFO[0000] Created network ecs-local-network with ID d4bd5d6043f33590f988314b5b0b5b3763c3234beb5c27cb426116c2519bcf30
INFO[0000] Pulling image amazon/amazon-ecs-local-container-endpoints
INFO[0013] Pulled image amazon/amazon-ecs-local-container-endpoints
INFO[0014] Created the amazon-ecs-local-container-endpoints container with ID f21dfbaa74e1e15f703daea43e9b7fa2c69f4c81618ba375d2ae79b14e526978
INFO[0015] Started container with ID f21dfbaa74e1e15f703daea43e9b7fa2c69f4c81618ba375d2ae79b14e526978
FATA[0015] Failed to create a SSM client to decrypt secrets due to
failed to create a new AWS session due to Set a region using ecs-cli configure command with the --region flag or AWS_REGION environment variable or --profile flag: Set a region using ecs-cli configure command with the --region flag or AWS_REGION environment variable or --profile flag
Failed to create a SSM clientである。よく考えたらクリーンインストールしたUbuntuにDocker関係とECS CLIを入れただけだった。AWS CLIと、
docs.aws.amazon.com
Session Manager plugin をインストールする。
docs.aws.amazon.com
そしてaws configureしてKey IDやAccess Keyなどを設定する。
ubuntu180401@ubuntu:~/ecs$ sudo aws configure
AWS Access Key ID [None]: AKIほげほげV6
AWS Secret Access Key [None]: RWR9ほげほげほげほげYF+LVP
Default region name [None]: ap-northeast-1
Default output format [None]: json
今度は動いた。
ubuntu180401@ubuntu:~/ecs$ sudo ecs-cli local up --task-def-compose docker-compose.wp-mysql.yml
INFO[0000] The network ecs-local-network already exists
INFO[0000] The amazon-ecs-local-container-endpoints container already exists with ID f21dfbaa74e1e15f703daea43e9b7fa2c69f4c81618ba375d2ae79b14e526978
INFO[0000] Started container with ID f21dfbaa74e1e15f703daea43e9b7fa2c69f4c81618ba375d2ae79b14e526978
INFO[0000] Using docker-compose.wp-mysql.yml, docker-compose.wp-mysql.override.yml files to start containers
Pulling mysql (mysql:latest)...
latest: Pulling from library/mysql
69692152171a: Pull complete
1651b0be3df3: Pull complete
951da7386bc8: Pull complete
0f86c95aa242: Pull complete
37ba2d8bd4fe: Pull complete
6d278bb05e94: Pull complete
497efbd93a3e: Pull complete
f7fddf10c2c2: Pull complete
16415d159dfb: Pull complete
0e530ffc6b73: Pull complete
b0a4a1a77178: Pull complete
cd90f92aa9ef: Pull complete
Digest: sha256:d50098d7fcb25b1fcb24e2d3247cae3fc55815d64fec640dc395840f8fa80969
Status: Downloaded newer image for mysql:latest
Pulling wordpress (wordpress:latest)...
latest: Pulling from library/wordpress
69692152171a: Already exists
2040822db325: Pull complete
9b4ca5ae9dfa: Pull complete
ac1fe7c6d966: Pull complete
5b26fc9ce030: Pull complete
3492f4769444: Pull complete
1dec05775a74: Pull complete
77107a42338e: Pull complete
f58e4093c52a: Pull complete
d32715f578d3: Pull complete
7a73fb2558ce: Pull complete
667b573fcff7: Pull complete
75e2da936ffe: Pull complete
759622df3a7b: Pull complete
c2f98ef02756: Pull complete
50e11300b0a6: Pull complete
de37513870b9: Pull complete
f25501789abc: Pull complete
0cf8e3442952: Pull complete
d45ce270a7e6: Pull complete
534cdc5a6ea6: Pull complete
Digest: sha256:e9da0d6c867249f364cd2292ea0dd01d7281e8dfbcc3e4b39b823f9a790b237b
Status: Downloaded newer image for wordpress:latest
Creating ecs_mysql_1 ...
Creating ecs_mysql_1 ... done
Creating ecs_wordpress_1 ...
Creating ecs_wordpress_1 ... done
確認してみる。参考例と同じようにWordpressの初期設定画面が出た。
ps も見てみる。
ubuntu180401@ubuntu:~/ecs$ sudo ecs-cli local ps -all
[sudo] ubuntu180401 のパスワード:
CONTAINER ID IMAGE STATUS PORTS NAMES TASKDEFINITION
261ec16fa5eb wordpress Up About a minute 0.0.0.0:8080->80/tcp, :::8080->80/tcp /ecs_wordpress_1 /home/ubuntu180401/ecs/wp-mysql.json
f68ef9870064 mysql Up About a minute :0->33060/tcp, :0->3306/tcp /ecs_mysql_1 /home/ubuntu180401/ecs/wp-mysql.json
ubuntu180401@ubuntu:~/ecs$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
261ec16fa5eb wordpress "docker-entrypoint.s…" 2 minutes ago Up About a minute 0.0.0.0:8080->80/tcp, :::8080->80/tcp ecs_wordpress_1
f68ef9870064 mysql "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 3306/tcp, 33060/tcp ecs_mysql_1
f9db6e53bad7 amazon/amazon-ecs-local-container-endpoints "/local-container-en…" 2 minutes ago Up 2 minutes 80/tcp amazon-ecs-local-container-endpoints
なお参照例には起動方法は書いてあるが停止方法は書かれていない。コマンドリファレンスを見て下記を実行。
ubuntu180401@ubuntu:~/ecs$ sudo ecs-cli local down --all
INFO[0000] Searching for all running containers
INFO[0000] Stop and remove 2 container(s)
INFO[0001] Stopped container with id ed5824c2d990
INFO[0001] Removed container with id ed5824c2d990
INFO[0002] Stopped container with id 37cd3b4fe3f2
INFO[0002] Removed container with id 37cd3b4fe3f2
INFO[0002] The network ecs-local-network has no more running tasks
INFO[0003] Stopped container with name amazon-ecs-local-container-endpoints
INFO[0003] Removed container with name amazon-ecs-local-container-endpoints
INFO[0003] Removed network with name ecs-local-network
今回はここまで。