前提条件
ECSへの権限
- ECSに対してフル権限があること。
EC2への権限
- EC2に対してフル権限があること。
AWS CLIのバージョン
- 
以下のバージョンで動作確認済 - AWS CLI 1.7.36
 
コマンド
aws --version
結果(例)
      aws-cli/1.7.28 Python/2.7.5 Darwin/13.4.0
- 準備
 =======
0.1. リージョンの決定
変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'
0.2. 変数の確認
変数の確認
aws configure list
結果(例)
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile   ec2ecs_full-prjZ-mbp13              env    AWS_DEFAULT_PROFILE
      access_key     ****************LOAQ shared-credentials-file
      secret_key     ****************I1O1 shared-credentials-file
          region           ap-northeast-1              env    AWS_DEFAULT_REGION
0.3. ECSクラスタ名の指定
変数の設定
ECS_CLUSTER_NAME='handson-cluster'
- ECSコンテナインスタンスの登録削除
 ====================================
1.1. ECSクラスタの確認
コマンド
aws ecs describe-clusters \
        --clusters ${ECS_CLUSTER_NAME}
結果(例)
       {
         "clusters": [
           {
             "status": "ACTIVE",
             "clusterName": "handson-cluster",
             "registeredContainerInstancesCount": 1,
             "pendingTasksCount": 0,
             "runningTasksCount": 0,
             "activeServicesCount": 0,
             "clusterArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:cluster/handson-cluster"
           }
         ],
         "failures": []
      }
1.2. ECSコンテナインスタンスの状態確認
コマンド
ECS_INSTANCES=$( \
        aws ecs list-container-instances \
          --cluster ${ECS_CLUSTER_NAME} \
          --query 'containerInstanceArns[]' \
          --output text | \
        sed 's|^arn:aws:ecs:.*:container-instance/||' \
      ) \
        && echo ${ECS_INSTANCES}
結果(例)
      xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
コマンド
ARRAY_ECS_INSTANCE_STATUS=$( \
        aws ecs describe-container-instances \
          --cluster ${ECS_CLUSTER_NAME} \
          --container-instances "${ECS_INSTANCES}" \
          --query 'containerInstances[].status' \
          --output text \
      ) \
        && echo ${ARRAY_ECS_INSTANCE_STATUS}
結果
      ACTIVE
1.3. EC2インスタンスIDの取得
コマンド
ARRAY_EC2_INSTANCE_ID=$( \
        aws ecs describe-container-instances \
          --cluster ${ECS_CLUSTER_NAME} \
          --container-instances "${ECS_INSTANCES}" \
          --query 'containerInstances[].ec2InstanceId' \
          --output text \
      ) \
        && echo ${ARRAY_EC2_INSTANCE_ID}
結果(例)
      i-xxxxxxxx
1.4. ECSコンテナインスタンスの登録削除
変数の確認
cat << ETX
        ECS_CLUSTER_NAME: ${ECS_CLUSTER_NAME}
        ECS_INSTANCES:    ${ECS_INSTANCES}
ETX
コマンド
aws ecs deregister-container-instance \
        --cluster ${ECS_CLUSTER_NAME} \
        --container-instance ${ECS_INSTANCES}
結果(例)
      {
        "containerInstance": {
          "status": "INACTIVE",
          "registeredResources": [
              {
                  "integerValue": 1024,
                  "longValue": 0,
                  "type": "INTEGER",
                  "name": "CPU",
                  "doubleValue": 0.0
              },
              {
                  "integerValue": 996,
                  "longValue": 0,
                  "type": "INTEGER",
                  "name": "MEMORY",
                  "doubleValue": 0.0
              },
              {
                  "name": "PORTS",
                  "longValue": 0,
                  "doubleValue": 0.0,
                  "stringSetValue": [
                      "22",
                      "2376",
                      "2375",
                      "51678"
                  ],
                  "type": "STRINGSET",
                  "integerValue": 0
              },
              {
                  "name": "PORTS_UDP",
                  "longValue": 0,
                  "doubleValue": 0.0,
                  "stringSetValue": [],
                  "type": "STRINGSET",
                  "integerValue": 0
              }
          ],
          "ec2InstanceId": "i-xxxxxxxx",
          "agentConnected": true,
          "containerInstanceArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:container-instance/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
          "pendingTasksCount": 0,
          "remainingResources": [
              {
                  "integerValue": 1024,
                  "longValue": 0,
                  "type": "INTEGER",
                  "name": "CPU",
                  "doubleValue": 0.0
              },
              {
                  "integerValue": 996,
                  "longValue": 0,
                  "type": "INTEGER",
                  "name": "MEMORY",
                  "doubleValue": 0.0
              },
              {
                  "name": "PORTS",
                  "longValue": 0,
                  "doubleValue": 0.0,
                  "stringSetValue": [
                      "22",
                      "2376",
                      "2375",
                      "51678"
                  ],
                  "type": "STRINGSET",
                  "integerValue": 0
              },
              {
                  "name": "PORTS_UDP",
                  "longValue": 0,
                  "doubleValue": 0.0,
                  "stringSetValue": [],
                  "type": "STRINGSET",
                  "integerValue": 0
              }
          ],
          "runningTasksCount": 0,
          "versionInfo": {
              "agentVersion": "1.2.1",
              "agentHash": "5da1555",
              "dockerVersion": "DockerVersion: 1.6.2"
          }
        }
      }
1.5. ECSコンテナインスタンスの状態確認
コマンド
ARRAY_ECS_INSTANCE_STATUS=$( \
        aws ecs describe-container-instances \
          --cluster ${ECS_CLUSTER_NAME} \
          --container-instances "${ECS_INSTANCES}" \
          --query 'containerInstances[].status' \
          --output text \
      ) \
        && echo ${ARRAY_ECS_INSTANCE_STATUS}
結果
      INACTIVE
1.6. ECSクラスタの確認
コマンド
aws ecs describe-clusters \
        --clusters ${ECS_CLUSTER_NAME}
結果(例)
      {
        "clusters": [
          {
              "status": "ACTIVE",
              "clusterName": "handson-cluster",
              "registeredContainerInstancesCount": 0,
              "pendingTasksCount": 0,
              "runningTasksCount": 0,
              "activeServicesCount": 0,
              "clusterArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:cluster/handson-cluster"
          }
        ],
        "failures": []
      }
- EC2インスタンス削除
 ======================
2.1. EC2インスタンス削除
変数の設定
EC2_INSTANCE_ID=$(echo ${ARRAY_EC2_INSTANCE_ID} | sed 's/ .*$//') \
        && echo ${EC2_INSTANCE_ID}
変数の確認
cat << ETX
        EC2_INSTANCE_ID: ${EC2_INSTANCE_ID}
ETX
コマンド
aws ec2 terminate-instances --instance-ids ${EC2_INSTANCE_ID}
結果(例)
      {
        "TerminatingInstances": [
          {
              "InstanceId": "i-xxxxxxxx",
              "CurrentState": {
                  "Code": 32,
                  "Name": "shutting-down"
              },
              "PreviousState": {
                  "Code": 16,
                  "Name": "running"
              }
          }
        ]
      }
2.2. EC2インスタンスの状態確認
コマンド
EC2_INSTANCE_STATE=` \
        aws ec2 describe-instances \
        --instance-ids ${EC2_INSTANCE_ID} \
        --query 'Reservations[].Instances[].State.Name' \
        --output text \
      ` \
        && echo ${EC2_INSTANCE_STATE}
結果
      terminated
同一リージョンでインスタンスが起動していないことを確認します。
コマンド
ARRAY_EC2_INSTANCE_ID=` \
        aws ec2 describe-instances \
          --filters Name=instance-state-name,Values=running \
          --query 'Reservations[].Instances[].InstanceId' \
          --output text \
      ` \
        && echo ${ARRAY_EC2_INSTANCE_ID}
結果
      (戻り値なし)
- ECSクラスタの削除
 ====================
3.1. ECSクラスタの確認
コマンド
aws ecs describe-clusters \
        --clusters ${ECS_CLUSTER_NAME}
結果(例)
      {
        "clusters": [
          {
              "status": "ACTIVE",
              "clusterName": "handson-cluster",
              "registeredContainerInstancesCount": 0,
              "pendingTasksCount": 0,
              "runningTasksCount": 0,
              "activeServicesCount": 0,
              "clusterArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:cluster/handson-cluster"
          }
        ],
        "failures": []
      }
3.2. ECSクラスタの削除
変数の確認
cat << ETX
        ECS_CLUSTER_NAME: ${ECS_CLUSTER_NAME}
ETX
コマンド
aws ecs delete-cluster \
        --cluster ${ECS_CLUSTER_NAME}
結果(例)
      {
        "cluster": {
          "status": "INACTIVE",
          "clusterName": "handson-cluster",
          "registeredContainerInstancesCount": 0,
          "pendingTasksCount": 0,
          "runningTasksCount": 0,
          "activeServicesCount": 0,
          "clusterArn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:cluster/handson-cluster"
        }
      }
3.3. ECSクラスタの確認
コマンド
aws ecs describe-clusters \
        --clusters ${ECS_CLUSTER_NAME}
結果(例)
      {
        "clusters": [],
        "failures": [
          {
              "reason": "MISSING",
              "arn": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:cluster/handson-cluster"
          }
        ]
      }
コマンド
aws ecs list-clusters 
結果
      {
          "clusterArns": []
      }