前回の「AWSでVPCを作る」の続きです。
今回は、作成した VPC 環境を破棄する、後片付けの手順になります。


・消去の順番
消去/破棄する順番に特に意味があるわけではありませんが…。
ルーティングやgateway を破棄してしまうと、VPC内部にアクセスできなくなってしまいます。
そのため、先に、VPC内のインスタンスを破棄し、その後、ルーティングテーブル、Gateway、EIP、VPC…と破棄していくことにします。
インスタンスの shutdown 時に、他のサーバと通信してデータを保存する…とかあったら困るので。



・EC2の破棄
特に何も言うことは無く、EC2インスタンスを shutdown して terminate させます。
# インスタンスをSTOPさせる
$ ec2-stop-instances  i-f3e1f0f0
INSTANCE        i-f3e1f0f0      running stopping

# TerminationProtection を無効にする
$ ec2-modify-instance-attribute \
     i-f3e1f0f0 \
     --disable-api-termination false

disableApiTermination   i-f3e1f0f0      false

# インスタンスをTERMINATEさせる
$ ec2-terminate-instances i-f3e1f0f0
INSTANCE        i-f3e1f0f0      stopped terminated

# インスタンスの状態を確認
$ ec2-describe-instances i-f3e1f0f0
RESERVATION     r-e95723ea      488224276535
INSTANCE        i-f3e1f0f0      ami-20ad1221                    terminated      innerkey        0               t1.micro        2013-03-14T09:13:51+0000 ap-northeast-1a aki-ec5df7ed                    monitoring-disabled                                     ebs                                      paravirtual     xen                     default false


・ルーティングテーブルの破棄
# ルーティングテーブル一覧確認
$ ec2-describe-route-tables
ROUTETABLE      rtb-eac9f783    vpc-e8c9f781
ROUTE   local           active  192.168.1.0/24          CreateRouteTable
ROUTE   igw-7b350c12            active  0.0.0.0/0               CreateRoute
ASSOCIATION     rtbassoc-edc9f784       main

# 0.0.0.0/0 に対するルーティングを削除
$ ec2-delete-route \
     rtb-eac9f783 \
     --cidr 0.0.0.0/0

RETURN  true

# 削除結果の確認
$ ec2-describe-route-tables
ROUTETABLE      rtb-eac9f783    vpc-e8c9f781
ROUTE   local           active  192.168.1.0/24          CreateRouteTable
ASSOCIATION     rtbassoc-edc9f784       main

# ルーティングテーブル自体を削除してみるが…
$ ec2-delete-route-table rtb-eac9f783
Client.DependencyViolation: The routeTable 'rtb-eac9f783' has dependencies and cannot be deleted
どうやら、main として VPC に割り当てられているルーティングテーブルは削除できないようですね…。
割り当てを解除してみましょう。
$ ec2-disassociate-route-table rtbassoc-edc9f784
Client.InvalidParameterValue: cannot disassociate the main route table association rtbassoc-edc9f784
むーん。main として割り当てられているルーティングテーブルは、割り当て解除できないようですね…。これは無視しておきましょう。



・Gateway の削除
# Gateway の確認
$ ec2-describe-internet-gateways
INTERNETGATEWAY igw-7b350c12
ATTACHMENT      vpc-e8c9f781    available

# Gateway と VPC の紐づけ解除
$ ec2-detach-internet-gateway \
     igw-7b350c12 \
     --vpc vpc-e8c9f781

RETURN  true

# Gateway の削除
$ ec2-delete-internet-gateway igw-7b350c12
RETURN  true

# 削除結果確認
$ ec2-describe-internet-gateways igw-7b350c12
Client.InvalidInternetGatewayID.NotFound: The internetGateway ID 'igw-7b350c12' does not
EIPが設定されたままなのに、削除できてしまいましたね…。
恐らく、既に EIPと紐づいていたはずの EC2インスタンスが削除されてしまったので、既にGateway と EIP の紐づけが解除されているのでしょう…。



・EIPの削除
EIPの状態を確認してみます。
$ ec2-describe-addresses
ADDRESS 54.249.84.161           vpc     eipalloc-f728119e
既に gateway や EC2 との紐づけは解除されているので、削除(解放)するだけですね…。
$ ec2-release-address \
     --allocation-id eipalloc-f728119e

ADDRESS                         eipalloc-f728119e

$ ec2-describe-addresses
EIPを削除(解放)できました。



・VPCの削除
まずは、VPC内部のサブネットを破棄します。
# VPC確認
$ ec2-describe-vpcs
VPC     vpc-e8c9f781    available       192.168.1.0/24  dopt-ecc9f785   default

# サブネット確認
$ ec2-describe-subnets
SUBNET  subnet-f0c3fd99 available       vpc-e8c9f781    192.168.1.0/24  251     ap-northeast-1a

# サブネットの削除
$ ec2-delete-subnet subnet-f0c3fd99
SUBNET  subnet-f0c3fd99

# サブネット確認
$ ec2-describe-subnets subnet-f0c3fd99
Client.InvalidSubnetID.NotFound: The subnet ID 'subnet-f0c3fd99' does not exist
最後はエラーになっていますが、削除したものを確認しようとしているので 期待通りのエラー内容になります。


次に VPC 自体を破棄しますが……
$ ec2-delete-vpc  vpc-e8c9f781
Client.DependencyViolation: The vpc 'vpc-e8c9f781' has dependencies and cannot be deleted.
VPCが、何かと依存関係にあって削除できないようですね。何でしょうか???


あああー。VPC専用のセキュリティグループを作成した記憶がありますね…。
$ ec2-describe-group --filter 'group-name=vpc_web'
GROUP   sg-1d1e0071     488224276535    vpc_web web in VPC      vpc-e8c9f781
PERMISSION      488224276535    vpc_web ALLOWS  tcp     22      22      FROM    CIDR    0.0.0.0/0       ingress
PERMISSION      488224276535    vpc_web ALLOWS  tcp     80      80      FROM    CIDR    0.0.0.0/0       ingress
PERMISSION      488224276535    vpc_web ALLOWS  all                     TO      CIDR    0.0.0.0/0       egress
たしかに残っています。これを削除してみましょう。
$ ec2-delete-group vpc_web
Client.InvalidParameterValue: Invalid value 'vpc_web' for groupName. You may not reference Amazon VPC security groups by name. Please use the corresponding id for this operation.

$ ec2-delete-group sg-1d1e0071
RETURN  true
名前指定では削除できなくて、自動付与された識別子でしか指定できないのはメンドクサイですが、一応セキュリティグループは消去できました。
では、VPC自体を削除してみましょう。
$ ec2-delete-vpc  vpc-e8c9f781
VPC     vpc-e8c9f781

$ ec2-describe-vpcs vpc-e8c9f781
Client.InvalidVpcID.NotFound: The vpc ID 'vpc-e8c9f781' does not exist
バッチリ消えましたね。


・最後の確認
念のため、AWS Management Console でインスタンスなどの状態を確認しておきましょう。
削除しないまま放置していると、無駄に課金されてしまうので…。



・まとめ
VPCを破棄する場合、以下の順序で処理する。
  1. EC2等のインスタンス
  2. ルーティングテーブル
  3. Gateway
  4. EIP
  5. セキュリティグループ
  6. VPC
RDSなども利用しているのであれば、(サーバー上のコンテンツプログラムの)依存関係に応じてインスタンスを破棄していく必要があります。



今回はここまで…。