依存関係のあるVPCを削除したい 

2020.11.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、不要になったVPCを削除する際に依存関係エラーにハマった下地です。今回はVPCを削除するために行った内容についてまとめます。

VPC依存関係の確認

はじめに、CLIコマンドec2 delete-vpcを使用し依存関係があるVPCを削除してみます。

$ aws ec2 delete-vpc --vpc-id vpc-*****************
An error occurred (DependencyViolation) when calling the DeleteVpc operation: The vpc 'vpc-*****************' has dependencies and cannot be deleted.

上記のように依存関係があるために失敗したとレスポンスが返ってきました。この時にVPC削除するために依存関係にある内容全て削除する必要があると気付き、こちらのサイトを参考に依存関係のある内容について確認しました。

Amazon VPC を削除しようとしたのですが、依存関係エラーが発生しました。Amazon VPC を削除する方法を教えてください。

VPCを削除するには下記の内容を確認する必要があること記載しております。

すべてのインスタンスを終了する すべてのサブネットを削除する カスタムセキュリティグループとカスタムルートテーブルを削除する インターネットゲートウェイまたは仮想プライベートゲートウェイをデタッチする

VPCを作成して時間が経っていることもあり上記の内容を確認するには時間がかかりそうだなと思ったのですが依存関係を調べるcliコマンドがまとまっていましたので、シェルファイル(check_before_delete_vpc.sh)として確認する内容を作成しました。

check_before_delete_vpc.sh

#!/bin/bash
vpc="vpc-*****************"

aws ec2 describe-internet-gateways --filters 'Name=attachment.vpc-id,Values='$vpc | grep InternetGatewayId
aws ec2 describe-subnets --filters 'Name=vpc-id,Values='$vpc | grep SubnetId
aws ec2 describe-route-tables --filters 'Name=vpc-id,Values='$vpc | grep RouteTableId
aws ec2 describe-network-acls --filters 'Name=vpc-id,Values='$vpc | grep NetworkAclId
aws ec2 describe-vpc-peering-connections --filters 'Name=requester-vpc-info.vpc-id,Values='$vpc | grep VpcPeeringConnectionId
aws ec2 describe-vpc-endpoints --filters 'Name=vpc-id,Values='$vpc | grep VpcEndpointId
aws ec2 describe-nat-gateways --filter 'Name=vpc-id,Values='$vpc | grep NatGatewayId
aws ec2 describe-security-groups --filters 'Name=vpc-id,Values='$vpc | grep GroupId
aws ec2 describe-instances --filters 'Name=vpc-id,Values='$vpc | grep InstanceId
aws ec2 describe-vpn-connections --filters 'Name=vpc-id,Values='$vpc | grep VpnConnectionId
aws ec2 describe-vpn-gateways --filters 'Name=attachment.vpc-id,Values='$vpc | grep VpnGatewayId
aws ec2 describe-network-interfaces --filters 'Name=vpc-id,Values='$vpc | grep NetworkInterfaceId

削除したいVPCのidを設定し実行します。

check_before_delete_vpc.sh

$ bash check_before_delete.sh
            "InternetGatewayId": "igw-*****************",
            "SubnetId": "subnet-***************_1",
            "SubnetId": "subnet-***************_2",
                    "RouteTableId": "rtb-******_default",
            "RouteTableId": "rtb-******_default",
                    "RouteTableId": "rtb-******_custem",
            "RouteTableId": "rtb-******_custem",
                    "NetworkAclId": "acl-******_default",
            "NetworkAclId": "acl-******_default",
                    "NetworkAclId": "acl-******_custem"",
            "NetworkAclId": "acl-******_custem"",
            "GroupId": "sg-******_custem_1"",
                            "GroupId": "sg-******_default",
            "GroupId": "sg-******_default",
            "GroupId": "sg-******_custem_2",
            "GroupId": "sg-******_custem_3",

VPCに依存している項目が出力されました!

VPCの依存関係を解消するには表示内容の_custemとなっているところを削除する必要がありますので、それぞれ削除していきます。

_defaultとなっている項目は削除できませんがIDのみだとどれか判断できませんので_defaultを削除しようとした際のエラーについてもまとめていきます。

依存関係を削除

項目ごとに削除していきます。

security-groupの削除

まずは、ec2 delete-security-groupを使用しsecurity-group(sg)から削除します。以下のように実行し3つのカスタムsgを削除することができました(実行後の戻り値はNoneですので削除できた場合何も返ってこない)。

$ aws ec2 delete-security-group --group-id sg-******_custem_1
$ aws ec2 delete-security-group --group-id sg-******_custem_2
$ aws ec2 delete-security-group --group-id sg-******_custem_3

デフォルトのsgを削除しようとした際は以下のエラーが発生します。

$ aws ec2 delete-security-group --group-id sg-******default
An error occurred (CannotDelete) when calling the DeleteSecurityGroup operation: the specified group: "sg-******default" name: "default" cannot be deleted by a user

NACLの削除

次にec2 delete-network-aclを使用しNACLの削除します。sgと同じくdefalutを削除しようとした際にエラーが発生します。

$ aws ec2 delete-network-acl --network-acl-id acl-******_custem
$ aws ec2 delete-network-acl --acl-******default
An error occurred (InvalidParameterValue) when calling the DeleteNetworkAcl operation: cannot delete default network ACL acl-******default

subnetの削除

ec2 delete-subnetを使用してsubnetを削除します。subnetにはdefaultがないのですべて削除できます。

$ aws ec2 delete-subnet --subnet-id subnet-***************_1 $ aws ec2 delete-subnet --subnet-id subnet-***************_2

ルートテーブルの削除

ec2 delete-route-tableを使用してルートテーブルを削除します。削除時にはsgと同じくcustemは削除できましたがdefaultは削除できません。

$ aws ec2 delete-route-table --route-table-id rtb-******_custem
$ aws ec2 delete-route-table --route-table-id rtb-******_default
An error occurred (DependencyViolation) when calling the DeleteRouteTable operation: The routeTable 'rtb-******_default' has dependencies and cannot be deleted

ルートテーブルもdefaultは削除できませんが、エラー内容をみてみるとルートテーブル自体も依存関係があるために削除できないとも読み取れましたので詳細を確認します。

$ aws ec2 describe-route-tables --route-table-id rtb-******_default
{
    "RouteTables": [
        {
            "Associations": [
                {
                    "Main": true,
                    "RouteTableAssociationId": "rtbassoc-default",
                    "RouteTableId": "rtb-default",
                    "AssociationState": {
                        "State": "associated"

...

ルートテーブルに関連づけられているrtbassoc-defaultを外せば良いのかと思い実行しました。

$ aws ec2 disassociate-route-table --association-id rtbassoc-default
An error occurred (InvalidParameterValue) when calling the DisassociateRouteTable operation: cannot disassociate the main route table association rtbassoc-default

結果としてルートテーブルがdefaultであるために関連を外せない事に気づきました。ID番号だけだと判断ができませんでした。

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

最後にインターネットゲートウェイ(igw)を削除します。igwを削除する前には関連しているVPCからデタッチする必要があります。ec2 detach-internet-gatewayにてVPCからデタッチし、ec2 delete-internet-gatewayにてigwを削除します。

$ aws detach-internet-gateway --internet-gateway-id igw-***************** --vpc-id vpc-*****************
$ aws delete-internet-gateway --internet-gateway-id igw-*****************

VPC削除

依存関係のある項目をすべて削除できましたので最後にVPCを削除します。

$ aws ec2 delete-vpc --vpc-id vpc-*****************

エラー内容もなく削除されたようです。確認のため、describeで削除したvpcのidを調べて確認します。

$ aws ec2 describe-vpcs --vpc-id vpc-*****************     

An error occurred (InvalidVpcID.NotFound) when calling the DescribeVpcs operation: The vpc ID 'vpc-*****************' does not exist

削除されたことの確認ができました!

まとめ

不要になったVPCを削除する際の依存関係の調べ方と削除についてまとめました。参考リンクに確認するべき内容のcliコマンドがまとまっていたので依存関係解消する際の目印になりました。この記事がどなたかの助けになれば幸いです。

参考リンク