[JAWS-UG CLI] AWS Batch #4 環境の破棄

# 前提条件

## EC2への権限

EC2、ECS、AWS Batch などに対してフル権限があること。

# 0. 準備

## 0.1. より実践的な使い方の完了

[AWS Batch #3 より実践的な使い方](http://qiita.com/pottava/items/a1d316e5a622b705efba) が終わっていること

## 0.2. 変数の確認

`#1`, `#2`, `#3` から引き続き利用する変数を確認します

```sh:コマンド
cat << ETX

    CFN_STACK_NAME:         ${CFN_STACK_NAME}
    COMPUTE_ENV_NAME:       ${COMPUTE_ENV_NAME}
    JOB_QUEUE_NAME:         ${JOB_QUEUE_NAME}
    JOB_DEFINITION_NAME:    ${JOB_DEFINITION_NAME}

    CONRAINER_PROPS_FILE:   ${CONRAINER_PROPS_FILE}
    DOCKER_ENTRYPOINT_FILE: ${DOCKER_ENTRYPOINT_FILE}
    DOCKER_FILE:            ${DOCKER_FILE}
    DOCKER_REPO:            ${DOCKER_REPO}
    S3_BUCKET_NAME:         ${S3_BUCKET_NAME}

    Managed 編のみ
    BATCH_RESOURCES_FILE:   ${BATCH_RESOURCES_FILE}

ETX
```

```sh:結果（例）

    CFN_STACK_NAME:         aws-batch-xxxxxxxxxx
    COMPUTE_ENV_NAME:       aws-batch-managed-xxxxxxxxxx
    JOB_QUEUE_NAME:         aws-batch-job-queue-xxxxxxxxxx
    JOB_DEFINITION_NAME:    aws-batch-job-def-xxxxxxxxxx

    CONRAINER_PROPS_FILE:   aws_batch_container_props.json
    DOCKER_ENTRYPOINT_FILE: entrypoint.sh
    DOCKER_FILE:            Dockerfile
    DOCKER_REPO:            xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/aws-batch-xxxxxxxxxx/sample
    S3_BUCKET_NAME:         aws-batch-xxxxxxxxxx-xxxxxxxx-xxxxxxxxxxx

    Managed 編のみ
    BATCH_RESOURCES_FILE:   aws_batch_compute_resources.json

```

## 0.3. AWS CLIのバージョン

以下のバージョンで動作確認済

* AWS CLI 1.11.36

```sh:コマンド
aws --version
```

```sh:結果（例）
 aws-cli/1.11.36 Python/2.7.5 Darwin/13.4.0 botocore/1.4.93
```

バージョンが古い場合は最新版に更新しましょう。

```sh:コマンド
sudo -H pip install -U awscli
```

## 0.4. AWS アカウントの属性

EC2-Classic が見えない AWS アカウントであること。

```sh:コマンド
AWS_SUPPORT_PLATFORMS=$( \
         aws ec2 describe-account-attributes \
           --query 'AccountAttributes[?AttributeName == `supported-platforms`].AttributeValues[].AttributeValue' \
           --output text \
) && echo ${AWS_SUPPORT_PLATFORMS}
```

```sh:結果
 VPC
```

# 1. リソースの削除

## 1.1. 定義ファイルの削除

```sh:コマンド
rm -f ${CFN_STACK_NAME}.yaml \
    ${CFN_STACK_NAME}-ecs.yaml ${CFN_STACK_NAME}-job.yaml \
    ${CONRAINER_PROPS_FILE} ${BATCH_RESOURCES_FILE} \
    ${DOCKER_ENTRYPOINT_FILE} ${DOCKER_FILE}
```

## 1.2. ジョブ投入スタックの削除

```sh:コマンド
aws cloudformation delete-stack \
  --stack-name ${CFN_STACK_NAME}-job
```

削除が完了するまで待機します

```sh:コマンド
aws cloudformation wait stack-delete-complete \
  --stack-name ${CFN_STACK_NAME}-job
```

## 1.3. ジョブ投入のための残リソース削除

- ECR リポジトリの削除

```sh:コマンド
aws ecr delete-repository --force \
  --repository-name $( aws ecr describe-repositories \
    | jq '.repositories' \
    | jq "map(select(.repositoryUri==\"${DOCKER_REPO}\"))" \
    | jq -r '.[].repositoryName' )
```

```sh:結果（例）
{
    "repository": {
        "registryId": "xxxxxxxxxxxx",
        "repositoryName": "aws-batch-xxxxxxxxxx/sample",
        "repositoryArn": "arn:aws:ecr:us-east-1:xxxxxxxxxxxx:repository/aws-batch-xxxxxxxxxx/sample",
        "createdAt": 1488376409.0,
        "repositoryUri": "xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/aws-batch-xxxxxxxxxx/sample"
    }
}
```

- ローカルにある Docker イメージの削除

```sh:コマンド
docker rmi ${DOCKER_REPO}
```

```sh:結果
Untagged: xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/aws-batch-xxxxxxxxxx/sample:latest
Untagged: xxxxxxxxxxxx.dkr.ecr.us-east-1.amazonaws.com/aws-batch-xxxxxxxxxx/sample@sha256:be2fbdefdbfb6b08e6298333e857aa138d293d5804b77ddd61a6145900538f27
Deleted: sha256:a4c9ee04eaea67d8a2c5dc4815b8e9d2d3f064eb48d991eba110c6bd0a4f93d2
Deleted: sha256:81f188eeecd0e2755eef4252aec9248e8d75a67b3d2b637a444e3179eaf27a9a
Deleted: sha256:6a3b014a68b4ce0acd84decd60f5e77c09f0c620fdb123891f2650eb7c3b51d9
```

- CloudWatch Logs ロググループの削除

```sh:コマンド
for group in batch/job lambda/BatchJobTriggerResource
do
  aws logs delete-log-group \
    --log-group-name /aws/${group}
done
```

```sh:結果
返り値なし
```

- 結果格納用 S3 バケット  
（CloudFormation スタックとして生成したものの、オブジェクトがあるときれいに消えないためここで削除します）

```sh:コマンド
aws s3 rb s3://${S3_BUCKET_NAME} --force
```

```sh:結果
返り値なし
```

- ローカルにダウンロードした帳票ファイル

```sh:コマンド
rm ./result-*
```

```sh:結果
返り値なし
```

## 1.4. ジョブ定義の無効化

```sh:コマンド
for arn in $( aws batch describe-job-definitions \
    --job-definition-name ${JOB_DEFINITION_NAME} \
    --status ACTIVE \
    --query 'jobDefinitions[].jobDefinitionArn' \
    --output text)
do
  aws batch deregister-job-definition \
    --job-definition $arn
done
```

```sh:結果
返り値なし
```

## 1.5. ジョブキューの削除

ジョブキューを削除するには、まずキューを無効化します。

```sh:コマンド
aws batch update-job-queue \
  --job-queue ${JOB_QUEUE_NAME} \
  --state DISABLED
```

```sh:結果（例）
{
    "jobQueueArn": "arn:aws:batch:us-east-1:xxxxxxxxxxxx:job-queue/aws-batch-job-queue-xxxxxxxxxx", 
    "jobQueueName": "aws-batch-job-queue-xxxxxxxxxx"
}
```

その上で削除します

```sh:コマンド
aws batch delete-job-queue --job-queue ${JOB_QUEUE_NAME}
```

```sh:結果
返り値なし
```

[ 重要！！] 
AWS Batch にはまだ `wait` コマンドがなく不便なのですが、
順序よく消さないと `INVALID` な状態となりリソースが消せない
可能性があります。なので、確実に消えたことを確かめます。

```sh:コマンド
aws batch describe-job-queues --job-queues ${JOB_QUEUE_NAME}
```

```sh:結果
{
    "jobQueues": []
}
```

## 1.6. ECS クラスタの削除

（Unmanaged 編のみ）

```sh:コマンド
aws cloudformation delete-stack \
  --stack-name ${CFN_STACK_NAME}-ecs
```

削除が完了するまで待機します

```sh:コマンド
aws cloudformation wait stack-delete-complete \
  --stack-name ${CFN_STACK_NAME}-ecs
```

## 1.7. コンピューティング環境の削除

コンピューティング環境も、削除するにはまず無効化が必要です。

```sh:コマンド
aws batch update-compute-environment \
  --compute-environment ${COMPUTE_ENV_NAME} \
  --state DISABLED
```

```sh:結果（例）
{
    "computeEnvironmentName": "aws-batch-refarch", 
    "computeEnvironmentArn": "arn:aws:batch:us-east-1:xxxxxxxxxxxx:compute-environment/aws-batch-refarch"
}
```

その上で削除します

```sh:コマンド
aws batch delete-compute-environment \
  --compute-environment ${COMPUTE_ENV_NAME}
```

```sh:結果
返り値なし
```

[ 重要！！] しばらく待ち、こちらも正常に消えたことを確認します。

```sh:コマンド
aws batch describe-compute-environments \
  --compute-environments ${COMPUTE_ENV_NAME}
```

```sh:結果
{
    "computeEnvironments": []
}
```

## 1.8. VPC や IAM の削除

```sh:コマンド
aws cloudformation delete-stack \
  --stack-name ${CFN_STACK_NAME}
```

```sh:結果
返り値なし
```

削除が完了するまで待機します

```sh:コマンド
aws cloudformation wait stack-delete-complete \
  --stack-name ${CFN_STACK_NAME}
```

# 完了

お疲れさまでした