[JAWS-UG CLI] Amazon Redshift 入門 (7) VPCおよび作業用EC2インスタンスの削除

# このハンズオンについて
- このハンズオンでは、Redshiftのクラスターとそのクラスタに対してクエリを発行するインスタンスの作成を実施します。
- クエリの発行には、「psql」を利用します。本手順では、Amazon Linux上へのインストールと利用方法を説明します。


# 前提条件

## バージョン確認

このハンズオンは以下のバージョンで動作確認を行いました。

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

```text:結果
aws-cli/1.10.23 Python/2.7.10 Linux/4.4.5-15.26.amzn1.x86_64 botocore/1.4.14
```

## 必要な権限

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

- EC2に対するフルコントロール権限
- RedShiftに関するフルコントロール権限
- IAMに関するフルコントロール権限
- S3に関するフルコントロール権限
- STSに関するフルコントロール権限


# 0. 準備

## リージョンを指定

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

## 資格情報を確認

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

```text:結果
Name                    Value             Type    Location
----                    -----             ----    --------
profile                <not set>             None    None
access_key     ****************RDPA         iam-role
secret_key     ****************9GA8         iam-role
region           ap-northeast-1              env    AWS_DEFAULT_REGION
```



# 1. EC2インスタンスの削除

## パラメータを確認

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

    INSTANCE_ID: ${INSTANCE_ID}

ETX
```

```text:結果
i-********
```

## EC2インスタンスの確認

```bash:コマンド
aws ec2 describe-instances --instance-ids ${INSTANCE_ID}
```

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

## EC2インスタンスの削除

```bash:コマンド
aws ec2 terminate-instances --instance-ids ${INSTANCE_ID}
```

```json:結果
{
    "TerminatingInstances": [
        {
            "InstanceId": "i-7b972de4",
            "CurrentState": {
                "Code": 32,
                "Name": "shutting-down"
            },
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            }
        }
    ]
}
```

## EC2インスタンスが削除されたことを確認

StateがterminatedであればOK

```bash:コマンド
aws ec2 describe-instances --instance-ids ${INSTANCE_ID}
```

```json:結果
{
    "Reservations": [
        {
            "OwnerId": "************",
            "ReservationId": "r-********",
            "Groups": [],
            "Instances": [
                {
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "PublicDnsName": "",
                    "Platform": "windows",
                    "State": {
                        "Code": 48,
                        "Name": "terminated"
                    },
                    "EbsOptimized": false,
                    "LaunchTime": "2015-10-17T13:28:19.000Z",
                    "ProductCodes": [],
                    "StateTransitionReason": "User initiated (2015-10-17 16:00:38 GMT)",
                    "InstanceId": "i-********",
                    "ImageId": "ami-4623a846",
                    "PrivateDnsName": "",
                    "KeyName": "UserManagementServer",
                    "SecurityGroups": [],
                    "ClientToken": "",
                    "InstanceType": "t2.medium",
                    "NetworkInterfaces": [],
                    "Placement": {
                        "Tenancy": "default",
                        "GroupName": "",
                        "AvailabilityZone": "us-west-2a"
                    },
                    "Hypervisor": "xen",
                    "BlockDeviceMappings": [],
                    "Architecture": "x86_64",
                    "StateReason": {
                        "Message": "Client.UserInitiatedShutdown: User initiated shutdown",
                        "Code": "Client.UserInitiatedShutdown"
                    },
                    "RootDeviceName": "/dev/sda1",
                    "VirtualizationType": "hvm",
                    "RootDeviceType": "ebs",
                    "AmiLaunchIndex": 0
                }
            ]
        }
    ]
}
```

# 2. インスタンスプロファイルおよびIAMロールの削除

## 確認（インスタンスプロファイル）

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

```json:結果
{
    "InstanceProfile": {
        "InstanceProfileId": "A********************",
        "Roles": [
            {
                "AssumeRolePolicyDocument": {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Action": "sts:AssumeRole",
                            "Principal": {
                                "Service": "ec2.amazonaws.com"
                            },
                            "Effect": "Allow",
                            "Sid": ""
                        }
                    ]
                },
                "RoleId": "A********************",
                "CreateDate": "2016-04-28T10:35:37Z",
                "RoleName": "redshift-role",
                "Path": "/",
                "Arn": "arn:aws:iam::************:role/redshift-role"
            }
        ],
        "CreateDate": "2016-04-28T10:36:30Z",
        "InstanceProfileName": "redshift-role",
        "Path": "/",
        "Arn": "arn:aws:iam::************:instance-profile/redshift-role"
    }
}
```

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

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

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

## インスタンスプロファイルの削除

```bash:コマンド
aws iam delete-instance-profile --instance-profile-name ${ROLE_NAME}
```

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


## インスタンスプロファイルが削除されたことを確認

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

```text:結果
A client error (NoSuchEntity) occurred when calling the GetInstanceProfile operation: Instance Profile redshift-role cannot be found.
```

## 確認（IAM Role）

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

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

## ポリシーをデタッチ

```bash:コマンド
aws iam detach-role-policy --role-name ${ROLE_NAME} --policy-arn ${S3_POLICY_ARN}
aws iam detach-role-policy --role-name ${ROLE_NAME} --policy-arn ${RS_POLICY_ARN}
```

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

## IAM Roleを削除

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

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


## IAM Roleが削除されたことを確認

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

```text:結果
A client error (NoSuchEntity) occurred when calling the ListAttachedRolePolicies operation: Role redshift-role does not exist.
```

# 3. Key Pairおよび秘密鍵ファイルの削除

## 確認

```bash:コマンド
aws ec2 describe-key-pairs --key-names ${KEY_PAIR_NAME}

ls -al ~/.ssh | grep ${KEY_MATERIAL_FILE}
```

```json:結果
{
    "KeyPairs": [
        {
            "KeyName": "Redshift",
            "KeyFingerprint": "**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**"
        }
    ]
}
```

```text:結果
-rw------- 1 ec2-user ec2-user 1671 Apr 28 10:30 redshift.pem
```

## Key Pairおよび秘密鍵ファイルを削除

```bash:コマンド
aws ec2 delete-key-pair --key-name ${KEY_PAIR_NAME}

rm ~/.ssh/${KEY_MATERIAL_FILE}
```

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

## Key Pairおよび秘密鍵ファイルが削除されたことを確認

```bash:コマンド
aws ec2 describe-key-pairs --key-names ${KEY_PAIR_NAME}

ls -al ~/.ssh | grep ${KEY_MATERIAL_FILE}
```

```text:結果
A client error (InvalidKeyPair.NotFound) occurred when calling the DescribeKeyPairs operation: The key pair 'Redshift' does not exist
```

# 4. VPCおよびVPCに関連するリソースの削除

Management ConsoleからVPCを削除すると、関連するリソースも一括で削除してくれます。
時間が無い方は、Management Consoleから削除しましょう。

## セキュリティグループの確認

```bash:コマンド
aws ec2 describe-security-groups --group-ids ${SG_ID_SSH}
aws ec2 describe-security-groups --group-ids ${SG_ID_REDSHIFT}
```

```json:結果
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": [],
                    "PrefixListIds": []
                }
            ],
            "Description": "JAWS-UG CLI at Co-Edo",
            "IpPermissions": [
                {
                    "PrefixListIds": [],
                    "FromPort": 22,
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "ToPort": 22,
                    "IpProtocol": "tcp",
                    "UserIdGroupPairs": []
                }
            ],
            "GroupName": "SSH",
            "VpcId": "vpc-********",
            "OwnerId": "************",
            "GroupId": "sg-********"
        }
    ]
}
```

```json:結果
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": [],
                    "PrefixListIds": []
                }
            ],
            "Description": "JAWS-UG CLI at Co-Edo",
            "IpPermissions": [
                {
                    "PrefixListIds": [],
                    "FromPort": 5439,
                    "IpRanges": [
                        {
                            "CidrIp": "**.**.**.**/32"
                        }
                    ],
                    "ToPort": 5439,
                    "IpProtocol": "tcp",
                    "UserIdGroupPairs": []
                }
            ],
            "GroupName": "Redshift",
            "VpcId": "vpc-********",
            "OwnerId": "************",
            "GroupId": "sg-********"
        }
    ]
}
```

## セキュリティグループの削除

```bash:コマンド
aws ec2 delete-security-group --group-id ${SG_ID_REDSHIFT}
aws ec2 delete-security-group --group-id ${SG_ID_SSH}
```

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

## セキュリティグループが削除されたことを確認

```bash:コマンド
aws ec2 describe-security-groups --group-ids ${SG_ID_REDSHIFT}
aws ec2 describe-security-groups --group-ids ${SG_ID_SSH}
```

```text:結果
A client error (InvalidGroup.NotFound) occurred when calling the DescribeSecurityGroups operation: The security group 'sg-********' does not exist

A client error (InvalidGroup.NotFound) occurred when calling the DescribeSecurityGroups operation: The security group 'sg-********' does not exist
```

## サブネットの確認

```bash:コマンド
aws ec2 describe-subnets --subnet-ids ${SUBNET_A_ID}
```

```json:結果
{
    "Subnets": [
        {
            "VpcId": "vpc-********",
            "CidrBlock": "10.0.0.0/24",
            "MapPublicIpOnLaunch": false,
            "DefaultForAz": false,
            "State": "available",
            "AvailabilityZone": "ap-northeast-1a",
            "SubnetId": "subnet-********",
            "AvailableIpAddressCount": 251
        }
    ]
}
```

## サブネットの削除

```bash:コマンド
aws ec2 delete-subnet --subnet-id ${SUBNET_A_ID}
```

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

## サブネットが削除されたことを確認

```bash:コマンド
aws ec2 describe-subnets --subnet-ids ${SUBNET_A_ID}
```

```text:結果
A client error (InvalidSubnetID.NotFound) occurred when calling the DescribeSubnets operation: The subnet ID 'subnet-********' does not exist
```

## インターネットゲートウェイの確認

```bash:コマンド
aws ec2 describe-internet-gateways --internet-gateway-ids ${IGW_ID}
```

```json:結果
{
    "InternetGateways": [
        {
            "Tags": [],
            "InternetGatewayId": "igw-********",
            "Attachments": [
                {
                    "State": "available",
                    "VpcId": "vpc-********"
                }
            ]
        }
    ]
}
```

## インターネットゲートウェイをVPCからデタッチ

```bash:コマンド
aws ec2 detach-internet-gateway --internet-gateway-id ${IGW_ID} --vpc-id ${VPC_ID}
```

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

## インターネットゲートウェイがVPCからデタッチされたことを確認

```bash:コマンド
aws ec2 describe-internet-gateways --internet-gateway-ids ${IGW_ID}
```

```json:結果
{
    "InternetGateways": [
        {
            "Tags": [],
            "InternetGatewayId": "igw-********",
            "Attachments": []
        }
    ]
}
```

## インターネットゲートウェイを削除

```bash:コマンド
aws ec2 delete-internet-gateway --internet-gateway-id ${IGW_ID}
```

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

## インターネットゲートウェイが削除されたことを確認

```bash:コマンド
aws ec2 describe-internet-gateways --internet-gateway-ids ${IGW_ID}
```

```text:結果
A client error (InvalidInternetGatewayID.NotFound) occurred when calling the DescribeInternetGateways operation: The internetGateway ID 'igw-********' does not exist
```

## VPCの確認

```bash:コマンド
aws ec2 describe-vpcs --vpc-ids ${VPC_ID}
```

```json:結果
{
    "Vpcs": [
        {
            "VpcId": "vpc-********",
            "InstanceTenancy": "default",
            "State": "available",
            "DhcpOptionsId": "dopt-********",
            "CidrBlock": "10.0.0.0/16",
            "IsDefault": false
        }
    ]
}
```

## VPCの削除

```bash:コマンド
aws ec2 delete-vpc --vpc-id ${VPC_ID}
```

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

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

```bash:コマンド
aws ec2 describe-vpcs --vpc-ids ${VPC_ID}
```

```text:結果
A client error (InvalidVpcID.NotFound) occurred when calling the DescribeVpcs operation: The vpc ID 'vpc-********' does not exist
```

以上です。お疲れ様でした。