いろいろやってみるにっき

てきとーに生きている奴の日記

古いエントリのサムネイル画像がリンク切れになってたりするけど、チマチマ修正中


Amazon ECS CLIでローカル環境テスト

Amazon ECS CLIでローカル環境の起動テストを行った。

 

プロローグ

受託しているシステム開発で、EC2インスタンス内で動いているPyrhonアプリをECS(Amazon Elastic Container Service)に追い出すことにした。

Pythonで書かれている部分は4週ごとに使用され利用が集中するためである。いつも動いているならインスタンスをスケールアップするかスケールアウトするかなのだが、ウチが請けた時点で出来上がっているJavaアプリは思いっきりステートフルなのでスケールアウトできないし、4週ごとに集中するだけでその間は全く使用されないため、インスタンスをスケールアップするのはコスト的にもったいない。

そもそも発注元が他社に投げて作らせて、まったくお気に召さないということで再度ウチに発注してきたものなので、もしかするとPythonじゃなくなるかもしれないのだが、周期的に集中するのは利用ユーザの制度上変わりがない。

 

ちょっと試してみただけで、一発で16.9%、2多重で起動したら33.8%まで上がった。ざっくり6多重~7多重で走ったら完全に他のアプリに影響する。

f:id:shigeo-t:20210615100303p:plain

これはコンテナ化して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だと思ったのだがインストールされていない。そこで使わなくなったUbuntuVMを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の初期設定画面が出た。

f:id:shigeo-t:20210615105713p:plain


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

 

今回はここまで。

お時間あったら、他のエントリもクリックして頂ければ幸いです。