2020年8月31日月曜日

閉域網でECS・ECR・セッションマネージャを使う


下記URLを参考にして、閉域網でのECS、ECR、セッションマネージャを試してみました。


[MEMO]
  • 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

セッションマネージャが使えるか?


下図のようにECSインスタンスを選択して、「セッションを開始する」をクリック


下図のように表示されたら成功です。


[MEMO]

環境破棄


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  |
+-------------------------+------------------+-------------------+