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








2020年8月28日金曜日

ECSタスク(バッチ)をSSM Automationで実行する


ECSタスク(バッチ処理)をSSM Automationで実行する環境をCloudFormationで構築してみました。
構成イメージは下図のとおり。


[MEMO]

    • タスクは FargateSpotで起動します。
    • Dockerイメージにサンプルのバッチ処理を格納しています。

    環境構築


    ## 作業環境(ローカル環境)

    構築作業は、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
    │   ├── hello.sh
    │   └── run.sh
    ├── bin
    │   ├── Makefile
    │   ├── README.md
    │   ├── cfn_validate.sh
    │   └── cfn_wait.sh
    ├── cfn
    │   ├── Makefile
    │   ├── README.md
    │   ├── cfn_ecr.yml
    │   ├── cfn_ecs_cluster.yml
    │   ├── cfn_ecs_task.yml
    │   ├── cfn_ssm.yml
    │   └── cfn_vpc.yml
    └── img
        ├── image01.drawio
        └── image01.png

    3.CloudFromation


    構築は、aws-cli と CloudFormationで行います。
    aws-cliのコマンドはMakefileに記述しています。
    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    |
    +---------------------------+------------------+-------------------+
    |  SSM Automation document  |  Blue21Ssm00PoC  |  CREATE_COMPLETE  |
    |  Ecs task definition      |  Blue21Tsk00PoC  |  CREATE_COMPLETE  |
    |  Ecs cluster (FargateSpot)|  Blue21Ecs00PoC  |  CREATE_COMPLETE  |
    |  ECR                      |  Blue21Ecr00PoC  |  CREATE_COMPLETE  |
    |  VPC & subnet             |  Blue21Vpc00PoC  |  CREATE_COMPLETE  |
    +---------------------------+------------------+-------------------+
    

    4.Dockerイメージ作成


    ECRに登録するDockerイメージを作成します。
    app ディレクトリで下記コマンドを実行します。
    $ docker-compose build

    下記コマンドでサンプルのバッチ処理を実行して動作確認します。
    $ docker-compose run batch /hello.sh
    ###########################
    #     Hello!!
    #     Hello!!
    #     Hello!!
    ###########################
    

    5.Dockerイメージ登録


    DockerイメージをECRにPushします。
    Makefileにaws-cliコマンドを書いているので
    cfn ディレクトリで下記コマンドを実行するとPushします。
    $ make dockerpush

    動作確認


    SSM の Automation に登録したドキュメントを使用してECSタスクを実行します。
    CloudFormationで登録したドキュメントの名称は「Blue21Ssm00PoC-RunTask」です。


    ドキュメントの定義内容は以下のとおり。
    CloudFormation はYAML形式で記述したのですか、JSON形式で登録されました。
    {
      "outputs": [
        "RunTask.status"
      ],
      "schemaVersion": "0.3",
      "description": "ECS run task",
      "assumeRole": "{{ AutomationAssumeRole }}",
      "parameters": {
        "AutomationAssumeRole": {
          "default": "",
          "description": "(Optional) The ARN of the role that allows Automation to perform the actions on your behalf.",
          "type": "String"
        },
        "Command": {
          "default": "",
          "description": "(Required) Command",
          "type": "String"
        },
        "TaskDefName": {
          "default": "Blue21Tsk00PoC",
          "description": "(Required) Task definition name",
          "type": "String"
        }
      },
      "mainSteps": [
        {
          "outputs": [
            {
              "Type": "String",
              "Name": "status",
              "Selector": "$.tasks[0].lastStatus"
            }
          ],
          "inputs": {
            "cluster": "Blue21Ecs00PoC",
            "networkConfiguration": {
              "awsvpcConfiguration": {
                "assignPublicIp": "ENABLED",
                "subnets": [
                  "subnet-0eeac56c468ff3fff",
                  "subnet-023d81fcc629e46c9"
                ],
                "securityGroups": [
                  "sg-024f7b720af862466"
                ]
              }
            },
            "Service": "ECS",
            "Api": "RunTask",
            "taskDefinition": "{{TaskDefName}}",
            "overrides": {
              "containerOverrides": [
                {
                  "name": "batch",
                  "command": [
                    "{{Command}}"
                  ]
                }
              ]
            },
            "capacityProviderStrategy": [
              {
                "capacityProvider": "FARGATE_SPOT",
                "weight": 1,
                "base": 0
              }
            ]
          },
          "name": "RunTask",
          "action": "aws:executeAwsApi",
          "isEnd": true
        }
      ]
    }

    [Automationのリファレンス]

    ECSタスクでサンプルのバッチ処理実行


    管理者権限でAWSコンソールを使用します。
    「AWS System manager」 > 「自動化」をクリックして画面を表示し、「オートメーションの実行」ボタンをクリックします。
    下図のように、「自己所有」タブのドキュメントを選択します。


    スクロールダウンして「次へ」ボタンをクリック


    「シンプルな実行」を選択したら
    下図のようにパラメータを入力して、「実行」ボタンをクリック
    • AutomationAssumeRole
      管理者ユーザは指定不要
      管理者以外は、下記URLのIAM権限とSSMの権限が必要
      https://dev.classmethod.jp/articles/iam-pass-role/
    • TaskDefName
      ECSタスク定義の名称を入力
    • Command
      ECSタスクで実行するコマンドを入力


    実行結果は下図のとおり。
    出力のstatus が PROVISIONING であれば、ECSタスク実行が成功しています。


    ECSタスク実行結果は下図のとおり。
    FargateSpotで実行しています。


    ログは下図のとおり。


    ECSタスクが終了するとAWSコンソールから消えますが、aws-cli で確認できます。
    ただし、1時間ぐらい経過すると aws-cli でも表示されなくなるようです。
    下記のように STOPPED のタスクをリストすると表示されます。
    $ aws ecs list-tasks --cluster Blue21Ecs00PoC --desired-status STOPPED --profile blue21
    {
        "taskArns": [
            "arn:aws:ecs:us-east-1:00000000:task/d9592a1a-3226-4253-9a63-705f69a41d56"
        ]
    }
    さらに、下記のようにするとタスク実行結果の詳細をみることができます。
    $ aws ecs describe-tasks --cluster Blue21Ecs00PoC --tasks d9592a1a-3226-4253-9a63-705f69a41d56 --profile blue21
    {
        "tasks": [
            {
                "attachments": [
                    {
                        "id": "346532e7-b8e2-47b2-a882-045ec3c047a7",
                        "type": "ElasticNetworkInterface",
                        "status": "DELETED",
                        "details": [
    ~省略~
    ログは、CloudWatchLogsで参照できます。

    ECSタスクでaws-cli 実行


    タスクRoleに Ec2FullAccess を設定したので、aws-cli を実行してみます。
    実行するコマンドは、下図のとおり。サブネットの一覧を表示します。


    実行結果のログは下図のとおり。


    なお、
    タスクRole で権限を与えていないS3にアクセスすると、下記のようにエラーになります。


    [MEMO]


    環境破棄


    AWSコンソールで下記のスタックを上から順番に削除します。
    ECRは登録したイメージを全部削除してからスタックを削除します。
    --------------------------------------------------------------------
    |                          DescribeStacks                          |
    +---------------------------+------------------+-------------------+
    |           Desc            |    StackName     |    StackStatus    |
    +---------------------------+------------------+-------------------+
    |  SSM Automation document  |  Blue21Ssm00PoC  |  CREATE_COMPLETE  |
    |  Ecs task definition      |  Blue21Tsk00PoC  |  CREATE_COMPLETE  |
    |  Ecs cluster (FargateSpot)|  Blue21Ecs00PoC  |  CREATE_COMPLETE  |
    |  ECR                      |  Blue21Ecr00PoC  |  CREATE_COMPLETE  |
    |  VPC & subnet             |  Blue21Vpc00PoC  |  CREATE_COMPLETE  |
    +---------------------------+------------------+-------------------+


    2020年8月27日木曜日

    ECS Capacity providers を試す(2)

     

    前回


    これまでの関連記事は、下記のとおり


    デフォルトのキャパシティプロバイダ戦略にAutoScalingGroupを指定したEcsクラスタを試します。

    現在起動しているタスクのCPU・メモリ割り当ては下図のとおり。


    現在使用しているインスタンス(t2.small)は ENIが3つなので、起動タイプを指定してタスクを3つ起動すると下図のようなエラーになります。
    CPU・メモリは足りていますが、
    EC2インスタンスとタスク2個でENIを3つ使用するので、ENI不足でエラーになります。


    キャパシティプロバイダを使用すれば、EC2インスタンスが自動的にスケールアウトして、このエラーは発生しないと思われるので試してみます。

    既存サービスのタスクを増やす

    (1) タスクを2個にする

    タスクが1つ起動した状態では、下図のとおり、インスタンスのCPU・メモリには余裕があります。2つにしても、スケールアウトは発生しません。


    CloudFromationでサービスの「必要数」を2に変更してスタックを更新すると、タスクが増えます。
    cfnディレクトリで下記コマンドを実行して、スタックを更新します。
    $ make cfnsvc01 CFNCMD=update-stack ECS_COUNT=2

    スタック更新完了後も、インスタンスは1つです。同じインスタンスにタスクが2つ起動しています。


    (2) タスクを3個にする

    タスク2つ起動した状態では、下図のとおり、インスタンスのCPU・メモリには余裕がありますが、ENIを上限まで使っているので、スケールアウトが必要です。


    cfnディレクトリで下記コマンドを実行するとサービスの「必要数」を 3 に変更してスタックを更新します。
    $ make cfnsvc01 CFNCMD=update-stack ECS_COUNT=3

    スタック更新完了後は、インスタンスが2つに増えています。
    新しいインスタンスでタスクが1つ起動しています。


    イベントは下図のとおり。エラーはありません。


    AutoScalingグループのアクティビティは下図のように表示されます。
    リストの一番上がスケールアウトです。


    スケールアウトしたのは t3.small のスポットインスタンスです。


    既存サービスのタスクを減らす


    タスクの起動数をゼロにして、スケールインさせてみます。
    cfnディレクトリで下記コマンドを実行するとサービスの「必要数」を 0 に変更してスタックを更新します。
    $ make cfnsvc01 CFNCMD=update-stack ECS_COUNT=0

    スタック更新完了後、タスク起動数がゼロの状態で、15分以上放置すると、スケールインしてインスタンスがゼロになりました。(AutoScalingGroupの最小キャパシティをゼロにしているので)


    AutoScalingGroupのアクティビティは下図のように表示されます。


    インスタンスがゼロの状態で既存サービスのタスクを起動


    インスタンスがゼロの状態で、タスクを起動してみます。
    cfnディレクトリで下記コマンドを実行すると「必要数」を 1 に変更してスタックを更新します。
    $ make cfnsvc01 CFNCMD=update-stack ECS_COUNT=1

    スタック更新完了後、インスタンスは2つ起動していました。


    AutoScalingGroupのアクティビティは下図のように表示されます。






    2020年8月26日水曜日

    ECS Capacity providers を試す(1)

     

    前回


    これまでの関連記事は、下記のとおり


    デフォルトのキャパシティプロバイダ戦略にFargateSpot を指定したEcsクラスタを試します。

    既存サービスのタスクを増やす


    デフォルトのキャパシティプロバイダ戦略(FargateSpot)で起動したサービス(Blue21Svc00PoC)のタスクを増やしてみます。

    今回は CloudFormation で増やします。
    cfnディレクトリで下記コマンドを実行すると既存サービス(Blue21Svc00PoC)の「必要数」を2に変更して、CloudFormationのスタックを更新します。
    $ make cfnsvc00 CFNCMD=update-stack ECS_COUNT=2

    スタックの更新が完了すると、下図のようにタスクが2つに増えます。
    追加で起動したタスクも FargateSpot です。


    イベントは下図のとおり



    AWSコンソールでサービス更新


    サービス更新では、キャパシティプロバイダ戦略を変更できます。


    AWSコンソールでサービス作成


    サービスを作成するときにキャパシティプロバイダ戦略または起動タイプを指定できます。
    下図は、デフォルトのキャパシティプロバイダ戦略を指定する場合です。


    下図は、カスタムのキャパシティプロバイダ戦略を指定する場合です。
    「プロバイダーの追加」では、クラスター構築時に設定した FargateSpotしか選択できませんでした。


    「起動タイプへの切り替え」をクリックすると下図のように、起動タイプを指定できます。


    AWSコンソールでタスクのスケジューリング


    タスクをスケジューリングする場合、下図のように、起動タイプを指定できます。
    キャパシティプロバイダ戦略は指定できないようです。



    AWSコンソールでタスク実行


    AWSコンソールでタスク実行する場合は下図のとおり。
    キャパシティプロバイダ戦略か起動タイプを指定できます。





    2020年8月25日火曜日

    ECS Capacity providers を試す環境をCloudFormationで構築してみた

     

    ECS Capacity providers を試す環境をCloudFormationで構築してみました。

    構成イメージは下図のとおり。


    [MEMO]


    環境構築手順


    ## 作業環境(ローカル環境)

    構築作業は、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
    ├── bin
    │   ├── Makefile
    │   ├── README.md
    │   ├── cfn_validate.sh
    │   └── cfn_wait.sh
    ├── cfn
    │   ├── Makefile
    │   ├── README.md
    │   ├── cfn_ecs_cluster00.yml
    │   ├── cfn_ecs_cluster01.yml
    │   ├── cfn_ecs_service.yml
    │   └── cfn_vpc.yml
    └── img
        ├── image01.drawio
        └── image01.png

    3. 環境構築


    構築は、aws-cli で行います。
    aws-cliのコマンドはMakefileに記述しています。
    cfnディレクトリで、下記のmakeコマンドを実行すると、CloudFormationのスタックを作成します。
    なお、EC2用にキーペア(名称:virginia_key)を使用するので、事前に同じ名前で用意するかMakefileに記述したaws-cliコマンドのパラメータでキーペアを変更してください。
    $ 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              |  Blue21Svc01PoC  |  CREATE_COMPLETE  |
    |  Ecs service              |  Blue21Svc00PoC  |  CREATE_COMPLETE  |
    |  Ecs cluster (Ec2)        |  Blue21Ecs01PoC  |  CREATE_COMPLETE  |
    |  Ecs cluster (FargateSpot)|  Blue21Ecs00PoC  |  CREATE_COMPLETE  |
    |  VPC & subnet             |  Blue21Vpc00PoC  |  CREATE_COMPLETE  |
    +---------------------------+------------------+-------------------+


    [MEMO]

    • タスク定義の LaunchType を指定すると、キャパシティプロバイダ戦略を使用せずにECSサービスが起動する。
      LaunchTypeを指定しなければ、デフォルトのキャパシティプロバイダ戦略が使用される。
    • EcsClusterのDefaultCapacityProviderStrategyのWeightに 0 (default) を設定するとエラーになる。
    • CloudFormationでは、デフォルトのキャパシティプロバイダ戦略しか指定できない。ECSサービスやタスクにはキャパシティプロバイダ戦略を指定するパラメータが見当たらない。


    4. 環境確認

    構築した環境を確認します。

    (1) EC2の起動テンプレート

    下図は起動テンプレートです。AutoScalingGroupで使用します。
    t2.small または t3.small のECS用のSpotインスタンスを起動します。


    (2) AutoScalingGroup

    下図は、AutoScalingGroupです。ECSのCapacityProviders で使用します。
    下図の「自動スケーリング」タブに表示されたスケーリングポリシーは、CapacityProvidersによって設定されたものです。


    (3) ECSクラスタ

    下図はECSクラスタです。
    Blue21Ecs00PoCは、CapacityProvidersをFargateSpotに設定しています。
    Blue21Ecs00Pocは、CapacityProvidersをAutoScalingGroupに設定しています。


    FargateSpotのキャパシティプロバイダは下図のとおり
    デフォルトのキャパシティプロバイダ戦略を FargateSpotにしています。


    AutoScalingGroupのキャパシティプロバイダは下図のおり。
    デフォルトのキャパシティプロバイダ戦略をAutoScalingGroupにしています。


    (5) FargateSpotのサービス

    下図は、FargateSpotのサービスです。
    CapacityProvidersの管理下にあるサービスの場合は、「キャパシティプロバイダ戦略」が表示されます。


    下図は、FargateSpotのタスクです。
    CapacityProvidersの管理下にあるタスクの場合は、「キャパシティープロバイダー」が表示されます。


    (6) AutoScalingGroupのサービス

    下図は、AutoScalingGroupのサービスです。
    CapacityProvidersの管理下にあるサービスの場合は、「キャパシティプロバイダ戦略」が表示されます。


    下図は、AutoScalingGroupのタスクです。
    CapacityProvidersの管理下にあるタスクの場合は、「キャパシティープロバイダー」が表示されます。


    (7) ECSインスタンス

    下図は、ECSのEC2インスタンスです。


    5. 環境破棄


    下記のスタックをAWSコンソールで削除します。
    上から順番に削除します。

    --------------------------------------------------------------------
    |                          DescribeStacks                          |
    +---------------------------+------------------+-------------------+
    |           Desc            |    StackName     |    StackStatus    |
    +---------------------------+------------------+-------------------+
    |  Ecs service              |  Blue21Svc01PoC  |  CREATE_COMPLETE  |
    |  Ecs service              |  Blue21Svc00PoC  |  CREATE_COMPLETE  |
    |  Ecs cluster (Ec2)        |  Blue21Ecs01PoC  |  CREATE_COMPLETE  |
    |  Ecs cluster (FargateSpot)|  Blue21Ecs00PoC  |  CREATE_COMPLETE  |
    |  VPC & subnet             |  Blue21Vpc00PoC  |  CREATE_COMPLETE  |
    +---------------------------+------------------+-------------------+

    [MEMO]

    • キャパシティプロバイダのAutoScalingGroupはスタック削除のときにエラーになる場合がある。
      もし、エラーになったら、EcsCluster, EcsCapacityProvidersは残してスタックを削除し、AWSコンソールで EcsClusterを削除する。
    • キャパシティプロバイダのAutoScalingGroupはスタック削除のときにAutoScalingGroupに起動中のインスタンスがゼロなら、エラーにならない。