[JAWS-UG CLI] Amazon EC2 Systems Manager 入門 (6) リソースの削除

# この記事について

[JAWS-UG CLI専門支部 #81 Amazon EC2 Systems Manager 入門](https://jawsug-cli.doorkeeper.jp/events/57576)で実施するハンズオン用の手順書です。


# 前提条件

## 必要な権限

作業にあたっては、以下の権限を有したIAMユーザもしくはIAMロールを利用してください。

- EC2 Systems Manager(ssm)のフルコントロール権限
- EC2のフルコントロール権限
- CloudFormationの関するフルコントロール権限
- IAMの関するフルコントロール権限
- S3の関するフルコントロール権限
- SNSの関するフルコントロール権限


# 0. 準備

## 0.1. リージョンを指定

ハンズオンでは東京リージョンを利用しますが、必要に応じて他のリージョンに変更してご利用ください。（東京リージョンを他の検証目的で利用している、など）

```bash:コマンド
export AWS_DEFAULT_REGION="ap-northeast-1"
```

## 0.2. 資格情報を確認

```bash:コマンド
aws configure list
```

インスタンスプロファイルを設定したEC2インスタンスでアクセスキーを設定せずに実行した場合、以下のようになります。

```text:結果
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************QSAA         iam-role
secret_key     ****************c1xY         iam-role
    region                us-west-2              env    AWS_DEFAULT_REGION
```

## 0.3. バージョン確認

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

```text:結果
（可能な限り最新版を利用しましょう）
```

## 0.4. バージョンアップ（必要に応じて）

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

# 1. VPC環境の削除

## 1.1. CloudFormation Stackの削除

### 変数の確認

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

    CF_STACK_NAME: ${CF_STACK_NAME}

ETX
```

```text:結果

    CF_STACK_NAME: EC2SystemsManager

```


### CloudFormation Stackの削除

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

```text:結果
（返値無し）
```


### CloudFormation Stackの削除を待機

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

```text:結果
（返値無し）
```

### CloudFormation Stackが削除されたことを確認

```bash:コマンド
aws cloudformation describe-stacks \
    --query Stacks[?StackName==\'${CF_STACK_NAME}\']
```

```json:結果
[]
```


# 2. S3バケットの削除

## 2.1. S3バケットの削除

### バケット名の確認

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

    BUCKET_NAME: ${BUCKET_NAME}

ETX
```

```text:結果

    BUCKET_NAME: ec2-systems-manager-************

```

### バケットの存在を確認

```bash:コマンド
aws s3 ls | grep ${BUCKET_NAME}
```

```text:結果
2017-04-02 03:10:33 ec2-systems-manager-************
```

### バケットを削除

```bash:コマンド
aws s3 rb s3://${BUCKET_NAME} --force
```

```text:結果
（省略）
```


# 3. SNS Topicの削除

## 3.1. サブスクリプションの削除

### トピックに関連付いたサブスクリプションARNを確認

```bash:コマンド
SNS_SUBSCRIPTION_ARN=$(aws sns list-subscriptions-by-topic \
    --topic-arn ${SNS_TOPIC_ARN_FOR_EC2} \
    --query Subscriptions[].SubscriptionArn \
    --output text) \
    && echo ${SNS_SUBSCRIPTION_ARN}
```

```text:結果
arn:aws:sns:ap-northeast-1:************:ec2-topic:55880fd7-266a-4308-8252-a798b9dd174f
```

### サブスクリプションを削除

```bash:コマンド
aws sns unsubscribe \
    --subscription-arn ${SNS_SUBSCRIPTION_ARN}
```

### サブスクリプションが削除されたことを確認

```bash:コマンド
aws sns list-subscriptions-by-topic \
    --topic-arn ${SNS_TOPIC_ARN_FOR_EC2}
```

```json:結果
{
    "Subscriptions": []
}
```


## 3.2. SNS Topicの削除

### トピック名の確認

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

    SNS_TOPIC_NAME_FOR_EC2: ${SNS_TOPIC_NAME_FOR_EC2}
    SNS_TOPIC_ARN_FOR_EC2: ${SNS_TOPIC_ARN_FOR_EC2}

ETX
```

```text:結果

    SNS_TOPIC_NAME_FOR_EC2: ec2-topic
    SNS_TOPIC_ARN_FOR_EC2: arn:aws:sns:ap-northeast-1:************:ec2-topic

```

### トピックの存在を確認

```bash:コマンド
aws sns list-topics \
    | grep ${SNS_TOPIC_NAME_FOR_EC2}
```

```text:結果
            "TopicArn": "arn:aws:sns:ap-northeast-1:************:ec2-topic"
```

### トピックを削除

```bash:コマンド
aws sns delete-topic \
    --topic-arn ${SNS_TOPIC_ARN_FOR_EC2}
```

### トピックが削除されたことを確認

```bash:コマンド
aws sns list-topics \
    | grep ${SNS_TOPIC_NAME_FOR_EC2}
```



# 4. IAM Roleの削除

## 4.1. IAM Roleの削除（インスタンスプロファイル）

### ロール名の確認

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

    ROLE_NAME_FOR_INSTANCE_PROFILE: ${ROLE_NAME_FOR_INSTANCE_PROFILE}

ETX
```

```text:結果

    ROLE_NAME_FOR_INSTANCE_PROFILE: TestProfileForWindowsServer

```

### ロールの存在を確認

```bash:コマンド
aws iam get-role \
    --role-name ${ROLE_NAME_FOR_INSTANCE_PROFILE}
```

```json:結果
{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ec2.amazonaws.com"
                    }
                }
            ]
        },
        "RoleId": "AROAJGGQ4IVLH6XTAXYW6",
        "CreateDate": "2017-04-02T08:18:06Z",
        "RoleName": "TestProfileForWindowsServer",
        "Path": "/",
        "Arn": "arn:aws:iam::************:role/TestProfileForWindowsServer"
    }
}
```

### インスタンスプロファイルにロールが追加されていることを確認

```bash:コマンド
aws iam get-instance-profile \
    --instance-profile-name ${INSTANCE_PROFILE_NAME}
```

```json:結果
{
    "InstanceProfile": {
        "InstanceProfileId": "AIPAJ4OVOVFJNCMMJEG2W",
        "Roles": [
            {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Action": "sts:AssumeRole",
                            "Effect": "Allow",
                            "Principal": {
                                "Service": "ec2.amazonaws.com"
                            }
                        }
                    ]
                },
                "RoleId": "AROAJGGQ4IVLH6XTAXYW6",
                "CreateDate": "2017-04-02T08:18:06Z",
                "RoleName": "TestProfileForWindowsServer",
                "Path": "/",
                "Arn": "arn:aws:iam::************:role/TestProfileForWindowsServer"
            }
        ],
        "CreateDate": "2017-04-02T08:18:55Z",
        "InstanceProfileName": "TestProfileForWindowsServer",
        "Path": "/",
        "Arn": "arn:aws:iam::************:instance-profile/TestProfileForWindowsServer"
    }
}
```

### インスタンスプロファイルからロールを削除

```bash:コマンド
aws iam remove-role-from-instance-profile \
    --instance-profile-name ${INSTANCE_PROFILE_NAME} \
    --role-name ${ROLE_NAME_FOR_INSTANCE_PROFILE}
```

### インスタンスプロファイルに追加されていたロールが削除されたことを確認

```bash:コマンド
aws iam get-instance-profile \
    --instance-profile-name ${INSTANCE_PROFILE_NAME}
```

```json:結果
{
    "InstanceProfile": {
        "InstanceProfileId": "AIPAJ4OVOVFJNCMMJEG2W",
        "Roles": [],
        "CreateDate": "2017-04-02T08:18:55Z",
        "InstanceProfileName": "TestProfileForWindowsServer",
        "Path": "/",
        "Arn": "arn:aws:iam::************:instance-profile/TestProfileForWindowsServer"
    }
}
```


### ロールにアタッチされたポリシーを確認

```bash:コマンド
aws iam list-attached-role-policies \
    --role-name ${ROLE_NAME_FOR_INSTANCE_PROFILE}
```

```json:結果
{
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonEC2RoleforSSM",
            "PolicyArn": "arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM"
        }
    ]
}
```

### ロールからポリシーをデタッチ

```bash:コマンド
POLICY_ARN_FOR_INSTANCE_PROFILE="arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM"
```

```bash:コマンド
aws iam detach-role-policy \
    --role-name ${ROLE_NAME_FOR_INSTANCE_PROFILE} \
    --policy-arn ${POLICY_ARN_FOR_INSTANCE_PROFILE}
```

### ロールからポリシーがデタッチされたことを確認

```bash:コマンド
aws iam list-attached-role-policies \
    --role-name ${ROLE_NAME_FOR_INSTANCE_PROFILE}
```

```bash:コマンド
{
    "AttachedPolicies": []
}
```

### ロールを削除

```bash:コマンド
aws iam delete-role \
    --role-name ${ROLE_NAME_FOR_INSTANCE_PROFILE}
```

### ロールが削除されたことを確認

```bash:コマンド
aws iam get-role \
    --role-name ${ROLE_NAME_FOR_INSTANCE_PROFILE}
```

```text:結果
An error occurred (NoSuchEntity) when calling the GetRole operation: Role not found for TestProfileForWindowsServer
```


## 4.2. IAM Roleの削除（メンテナンスウィンドウ用サービスロール）

### ロール名の確認

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

    ROLE_NAME_FOR_NOTIFICATION: ${ROLE_NAME_FOR_NOTIFICATION}

ETX
```

```text:結果

    ROLE_NAME_FOR_NOTIFICATION: NotificationForEC2SystemsManager

```

### ロールの存在を確認

```bash:コマンド
aws iam get-role \
    --role-name ${ROLE_NAME_FOR_NOTIFICATION}
```

```json:結果
{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ssm.amazonaws.com"
                    }
                }
            ]
        },
        "RoleId": "AROAIXXBP2WKJZO3BO47M",
        "CreateDate": "2017-04-02T08:24:06Z",
        "RoleName": "NotificationForEC2SystemsManager",
        "Path": "/",
        "Arn": "arn:aws:iam::************:role/NotificationForEC2SystemsManager"
    }
}
```

### ロールにアタッチされたポリシーを確認

```bash:コマンド
aws iam list-attached-role-policies \
    --role-name ${ROLE_NAME_FOR_NOTIFICATION}
```

```json:結果
{
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonSNSFullAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AmazonSNSFullAccess"
        }
    ]
}
```

### ロールからポリシーをデタッチ

```bash:コマンド
POLICY_ARN_FOR_NOTIFICATION="arn:aws:iam::aws:policy/AmazonSNSFullAccess"
```

```bash:コマンド
aws iam detach-role-policy \
    --role-name ${ROLE_NAME_FOR_NOTIFICATION} \
    --policy-arn ${POLICY_ARN_FOR_NOTIFICATION}
```

### ロールからポリシーがデタッチされたことを確認

```bash:コマンド
aws iam list-attached-role-policies \
    --role-name ${ROLE_NAME_FOR_NOTIFICATION}
```

```bash:コマンド
{
    "AttachedPolicies": []
}
```

### ロールを削除

```bash:コマンド
aws iam delete-role \
    --role-name ${ROLE_NAME_FOR_NOTIFICATION}
```

### ロールが削除されたことを確認

```bash:コマンド
aws iam get-role \
    --role-name ${ROLE_NAME_FOR_NOTIFICATION}
```

```text:結果
An error occurred (NoSuchEntity) when calling the GetRole operation: Role not found for NotificationForEC2SystemsManager
```


## 4.3. IAM Roleの削除（通知用サービストール）

### ロール名の確認

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

    ROLE_NAME_FOR_MAINTENANCE_WINDOW: ${ROLE_NAME_FOR_MAINTENANCE_WINDOW}

ETX
```

```text:結果

    ROLE_NAME_FOR_MAINTENANCE_WINDOW: ServiceRoleForMaintenanceWindow

```

### ロールの存在を確認

```bash:コマンド
aws iam get-role \
    --role-name ${ROLE_NAME_FOR_MAINTENANCE_WINDOW}
```

```json:結果
{
    "Role": {
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Action": "sts:AssumeRole",
                    "Effect": "Allow",
                    "Principal": {
                        "Service": "ssm.amazonaws.com"
                    }
                }
            ]
        },
        "RoleId": "AROAJYEUXJMMCM3236UOA",
        "CreateDate": "2017-04-02T14:09:05Z",
        "RoleName": "ServiceRoleForMaintenanceWindow",
        "Path": "/",
        "Arn": "arn:aws:iam::************:role/ServiceRoleForMaintenanceWindow"
    }
}
```

### ロールにアタッチされたポリシーを確認

```bash:コマンド
aws iam list-attached-role-policies \
    --role-name ${ROLE_NAME_FOR_MAINTENANCE_WINDOW}
```

```json:結果
{
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonSSMMaintenanceWindowRole",
            "PolicyArn": "arn:aws:iam::aws:policy/service-role/AmazonSSMMaintenanceWindowRole"
        }
    ]
}
```

### ロールからポリシーをデタッチ

```bash:コマンド
POLICY_ARN_FOR_MAINTENANCE_WINDOW="arn:aws:iam::aws:policy/service-role/AmazonSSMMaintenanceWindowRole"
```

```bash:コマンド
aws iam detach-role-policy \
    --role-name ${ROLE_NAME_FOR_MAINTENANCE_WINDOW} \
    --policy-arn ${POLICY_ARN_FOR_MAINTENANCE_WINDOW}
```

### ロールからポリシーがデタッチされたことを確認

```bash:コマンド
aws iam list-attached-role-policies \
    --role-name ${ROLE_NAME_FOR_MAINTENANCE_WINDOW}
```

```bash:コマンド
{
    "AttachedPolicies": []
}
```

### ロールを削除

```bash:コマンド
aws iam delete-role \
    --role-name ${ROLE_NAME_FOR_MAINTENANCE_WINDOW}
```

### ロールが削除されたことを確認

```bash:コマンド
aws iam get-role \
    --role-name ${ROLE_NAME_FOR_MAINTENANCE_WINDOW}
```

```text:結果
An error occurred (NoSuchEntity) when calling the GetRole operation: Role not found for ServiceRoleForMaintenanceWindow
```


以上