🐳

AWS ECSの使用メモ

2021/02/06に公開

公開しますが自分用のメモです。
もっと整理できれば書き直すかもしれません。

ECS概要

ECS(Elastic Container Service)は、AWS上でDockerコンテナを起動してサービス提供したい場合に使う。

コンテナの実行環境として、EC2インスタンスを利用する方法とAWS Fargateを使用する方法がある。
定常的に動かすのであればEC2インスタンスを使用する方法を採用することになるため、ここではEC2インスタンスのみを記す。


クラスター作成

ECSの実行環境となるEC2インスタンスは、クラスターという単位で管理される。

複数のEC2インスタンスでクラスターを構成することができ、複数構成で外部からのアクセスを受け付ける場合にはALB(Application Load Balancer)にクラスターを関連付けるようなシステム構成をとる必要がある。また、コンテナ間の通信に関しても複数台構成の場合は注意を払う必要がある。
冗長性の必要やリソース不足が無ければ単一インスタンスで動かしても問題ないようだ。

空のクラスターを作成

クラスター作成時にEC2インスタンスを作成する方法もあるが、とりあえず空のクラスターを作成する。

新規EC2インスタンスをクラスター登録

既存のEC2インスタンスを登録するのはECSエージェントを入れたりといろいろ難解になるようなので、ECS用のAMIを使って新規にインスタンスを起動する。
このとき、インスタンスの作成時に一回だけ実行される処理として、クラスターへの参加の処理を記述すると良いらしい。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/bootstrap_container_instance.html


タスク実行

ECSのコンテナ実行には、タスクとサービスという2段階の管理がある。
さしあたり、docker runコマンドに相当する内容をタスク登録してタスクを起動すればサービスなどなくても実行できる。

配布されているコンテナの利用

一例としてNginxのコンテナのタスク登録。この場合、dockerイメージはdocker公式のリポジトリにあるNginxのイメージを直接指定すれば良い。
基本的にはサーバ上で実行するdocker runコマンドの内容を入力してやればよいが、メモリ制限の記述が必須となる。
ちょっとわかりにくいのが、ボリューム関連のところ。あらかじめボリュームを定義しておき、コンテナの設定でそれを選択する。
自分の場合はコンフィグのためにEFSのディレクトリをボリュームとして利用したが、この場合、手動でインスタンスにマウントなどしなくてもEFSをボリュームとして指定できる。インスタンスからEFSへのアクセスに関しては、セキュリティグループで許可しておく。

独自作成したコンテナの利用

独自開発のアプリケーションをコンテナ実行したい場合は、イメージをAWS ECRにプッシュしておく。
権限が必要となるため、開発用EC2インスタンスにECRへのアクセス権を持つIAMアカウントを関連付けて実施する形にした。
コンテナ用のインスタンスからECRへのアクセスは、インスタンスに関連付けたIAMロールで許可している。
あとはECRにあるイメージを指定するだけで、上記公式イメージのタスク登録と同じ。

タスク実行

クラスターの管理画面から、またはタスクの管理画面から、タスクを実行することができる。
クラスター上でタスクを実行し、成功すればコンテナが正常に動いている。実際にインスタンスに入ってdocker psコマンドで見ても実行されているのがわかる。


TIPS

ECRにコンテナイメージをアップロード

権限のために、docker loginする必要がある。そのdocker loginに使用する情報を取得するため、AWS CLIをインストールして使えるようにしておく。
また、ECRのタグがめちゃくちゃ長くて鬱陶しいので、通常使いイメージタグとは別にして管理している。通常使いはバージョン情報なしで、ECRにプッシュする時だけバージョンをつけてECR用のタグを設定し、プッシュ後すぐにタグを削除する。それをアプリケーションごとにシェルスクリプトにしておいた。
https://docs.aws.amazon.com/ja_jp/AmazonECR/latest/userguide/getting-started-cli.html

# docker login
aws ecr get-login-password --region ap-northeast-1 | docker login \
--username AWS --password-stdin ****.dkr.ecr.ap-northeast-1.amazonaws.com

# ECR-push.sh 
cd $(dirname $0)
VERSION=$(<version)
IMAGE_ID=$(docker images --digests MYNAME:APPNAME --format "{{.ID}}")
docker tag ${IMAGE_ID} ****.dkr.ecr.ap-northeast-1.amazonaws.com/APPNAME:${VERSION}
docker push ****.dkr.ecr.ap-northeast-1.amazonaws.com/APPNAME:${VERSION}
docker rmi ****.dkr.ecr.ap-northeast-1.amazonaws.com/APPNAME:${VERSION}

Code Commitにソースコードを保存

ECSやコンテナとは関係ないけれど。
これもやはりアクセス権限をちゃんとしておく必要があり、SSHキーを作成してIAMユーザーと関連付けて使用するようにした。
https://docs.aws.amazon.com/ja_jp/codecommit/latest/userguide/setting-up-ssh-unixes.html

# 初期設定&リポジトリ設定
git init
git config user.name myname
git config user.email mymail
git remote add origin ssh://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/APPNAME
git config -l

Discussion