下記URLを参考にして、閉域網でのECS、ECR、セッションマネージャを試してみました。
- DockerイメージをECRからプライベートな接続で取得するにはPrivate Linkを使うべし
- プライベートサブネットに配置したEC2にAWS Systems Manager Session Managerを使ってアクセスする
- インターフェイス VPC エンドポイントでの CloudWatch と CloudWatch Synthetics の使用
- AWS CloudFormation の VPC エンドポイントの設定
- VPCは、インターネットゲートウェイ(IGW)を作らないのでインターネットとの通信はできません。
- ECSクラスタは、スポットインスタンス(EC2)を1台使用してECSサービスを起動します。
- ECSタスクのログをCloudWatchLogsに格納します。
- 環境は、CloudFormationを使用して構築します。
- VPCエンドポイント(インターフェース)は、作成すると料金が発生する。
NATインスタンスを使用したほうが費用は安い。
https://aws.amazon.com/jp/privatelink/pricing/
環境構築
## 作業環境(ローカル環境)
構築作業は、WSL2(ubuntu20.04)で実施します。
なお、AWSのリージョンは us-east-1を使用します。
- Windows10
- WSL2(ubuntu20.04)
- docker 19.03.12
- make 4.2.1
- aws-cli 1.17.14
1. aws-cli の設定
aws-cli実行時はプロファイルを指定します。プロファイルの設定は下記のとおり。
- blue21 という名称でプロファイルを作成
- リージョンは us-east-1 を使用し, Output形式は json
- 管理者権限のアクセスキーを使用
2. ソース一式のdownload
環境構築に必要なCloudFormationテンプレートなどは、Bitbucketに登録しています。
Bitbucketの下記URLからダウンロードできます。
レポジトリの内容は以下のとおり。
. ├── README.md ├── app │ ├── Dockerfile │ ├── docker-compose.yml │ ├── requirements.txt │ └── src │ └── app.py ├── bin │ ├── Makefile │ ├── README.md │ ├── cfn_validate.sh │ └── cfn_wait.sh ├── cfn │ ├── Makefile │ ├── README.md │ ├── cfn_ecr.yml │ ├── cfn_ecs_cluster.yml │ ├── cfn_ecs_service.yml │ └── cfn_vpc.yml └── img ├── image01.drawio └── image01.png
3.CloudFormation実行
構築は、aws-cli と CloudFormationで行います。
aws-cliのコマンドはMakefileに記述しています。
構築時にEC2のキーペア(名称: virginia_key) を使用するので、事前に同じ名称でキーペアを作成するか Makefile を修正してキーペアを変更します
# ECS Cluster (EC2) cfnecs: $(eval STACK_NAME := Blue21Ecs00PoC) aws cloudformation $(CFNCMD) \ --profile $(AWSPROFILE) \ --stack-name $(STACK_NAME) \ --template-body file://`pwd`/cfn_ecs_cluster.yml \ --parameters \ "ParameterKey=KeyName,ParameterValue=キーペア名" \ --capabilities CAPABILITY_NAMED_IAM ../bin/cfn_wait.sh $(AWSPROFILE) $(STACK_NAME)
cfnディレクトリで、下記のmakeコマンドを実行すると、CloudFormationのスタックを作成します。
$ make cfnall
cfnディレクトリで下記コマンドを実行すると、作成したスタック一覧を参照できます。
このコマンドはスタック名に "Blue21" を含むものをリストします。
$ make stackls aws cloudformation describe-stacks \ --profile blue21 \ --query 'Stacks[?contains(StackName,`Blue21`)].{StackName:StackName,StackStatus:StackStatus,Desc:Description}' \ --output table ------------------------------------------------------------------ | DescribeStacks | +-------------------------+------------------+-------------------+ | Desc | StackName | StackStatus | +-------------------------+------------------+-------------------+ | Ecs service (EC2) | Blue21Svc00PoC | CREATE_COMPLETE | | Ecs cluster (SpotFleet)| Blue21Ecs00PoC | CREATE_COMPLETE | | ECR | Blue21Ecr00PoC | CREATE_COMPLETE | | VPC & subnet (closed) | Blue21Vpc00PoC | CREATE_COMPLETE | +-------------------------+------------------+-------------------+
4.Dockerイメージ作成
ECRに登録するDockerイメージを作成します。
app ディレクトリで下記コマンドを実行します。
$ docker-compose build
下記コマンドでサンプルWEBアプリケーションの動作確認します。
$ docker-compose up -d $ curl http://localhost:10080 Hello.
5.Dockerイメージ登録
DockerイメージをECRにPushします。
Makefileにaws-cliコマンドを書いているので
cfn ディレクトリで下記コマンドを実行するとPushします。
$ make dockerpush
動作確認
環境確認
下図は、CloudFormationで作成したエンドポイントです。
下図は、CloudFormationで作成したECSクラスタです。
サービスとコンテナインスタンスが1つです。
環境構築直後は、タスクはゼロです。
なお、コンテナインスタンスがECSクラスタに認識されるまで、少し、時間がかかるので、コンテナインスタンスに「1」と表示されるまで、待ちます。
ECRからイメージを取得できるか?
CloudFormationでECSサービス「必要数」を変更し、タスクを1つ起動します。
ローカルのcfnディレクトリで下記コマンドを実行します。
$ make cfnsvc CFNCMD=update-stack ECS_COUNT=1
CloudFromation が完了し、タスクが起動すれば成功です。
下図はタスクのネットワーク設定です。
CloudWatch が使えるか?
下図のようにECSのメトリクスが、参照できます。
ECSタスクのログも、下図のようにCloudWatchLogsで参照できます。
[MEMO]
- 「タスクのスケジューリング」が使用できるか試してないが、もしかしたら、CloudWatchEventのVPCエンドポイントが必要かもしれない。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/cloudwatch-events-and-interface-VPC.html
セッションマネージャが使えるか?
下図のように表示されたら成功です。
[MEMO]
- セッションマネージャ越しにsshできます。
https://dev.classmethod.jp/articles/ssh-through-session-manager/
環境破棄
AWSコンソールで下記のスタックを上から順番に削除します。
ECRは登録したイメージを全部削除してからスタックを削除します。
------------------------------------------------------------------ | DescribeStacks | +-------------------------+------------------+-------------------+ | Desc | StackName | StackStatus | +-------------------------+------------------+-------------------+ | Ecs service (EC2) | Blue21Svc00PoC | CREATE_COMPLETE | | Ecs cluster (SpotFleet)| Blue21Ecs00PoC | CREATE_COMPLETE | | ECR | Blue21Ecr00PoC | CREATE_COMPLETE | | VPC & subnet (closed) | Blue21Vpc00PoC | CREATE_COMPLETE | +-------------------------+------------------+-------------------+