全リージョンのデフォルトVPCやデフォルトセキュリティグループを使用しているかシェルスクリプトで確認してみた

全リージョンのデフォルトVPCやデフォルトセキュリティグループを使用しているかシェルスクリプトで確認してみた

削除をする前には利用しているリソースがないか確認しよう
Clock Icon2025.02.17

デフォルトVPCがあるのが分かったが、そのデフォルトVPCを使っているかどうか知りたい

こんにちは、のんピ(@non____97)です。

皆さんはデフォルトVPCがあるのが分かったが、そのデフォルトVPCを使っているかどうか知りたいなと思ったことはありますか? 私はあります。

以下記事で紹介されているようにデフォルトVPCは積極的に利用するべきリソースではありません。

https://dev.classmethod.jp/articles/should-not-use-the-default-vpc/

もし、不要であれば以下記事で紹介されているように一気に削除してしまいたいところです。

https://dev.classmethod.jp/articles/delete-default-vpcs-by-cloudshell/

では、不要であるかどうかの判断はどうすれば良いでしょうか。

初手で関係者のような人に聞いてみるのも何だか手間です。

ということで、デフォルトVPCを使用しているかどうかシェルスクリプトで確認します。

やってみた

デフォルトVPCを使用しているか判断するスクリプト

今回、デフォルトVPCを使用しているかどうかの判断は、そのVPC上にENIがあるかどうかで判断してみます。

Transit Gateway attachmentやVPCピアリング、VGWが設定されている場合も怪しいといえば怪しいのですが、ENIの方が直接的とも言えます。

スクリプトは以下のとおりです。

# 全リージョンをループで処理
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text | \
while read -r region; do
  echo "=== ${region} ==="
  
  # デフォルトVPCのIDを取得
  # 何らかの理由で取得できなかった場合は access-denied を返す
  default_vpc_id=$(aws ec2 describe-vpcs \
    --region "${region}" \
    --filters "Name=isDefault,Values=true" \
    --query "Vpcs[0].VpcId" \
    --output text 2>/dev/null || echo "access-denied")
  
  if [[ "${default_vpc_id}" == "access-denied" ]]; then
    echo "Access denied to region"
  # access-denied ではない かつ デフォルトVPCのIDが何かしら設定されている場合
  elif [[ "${default_vpc_id}" != "None" && -n "${default_vpc_id}" ]]; then
    echo "Default VPC: ${default_vpc_id}"

    # デフォルトVPC内のENI一覧を取得
    enis=$(aws ec2 describe-network-interfaces \
      --region "${region}" \
      --filters "Name=vpc-id,Values=${default_vpc_id}" \
      --query 'NetworkInterfaces[*].[NetworkInterfaceId,Description,Attachment.InstanceId,Groups[0].GroupName,PrivateIpAddress,Status]' \
      --output table)
    
    if [[ -z "${enis}" ]]; then
      echo "No ENIs in default VPC"
    else
      echo "${enis}"
    fi
  # デフォルトVPCが存在しない場合
  else
    echo "No default VPC"
  fi
done

実際の実行結果は以下のとおりです。

> aws ec2 describe-regions --query "Regions[].[RegionName]" --output text | \
  while read -r region; do
    echo "=== ${region} ==="
    
    default_vpc_id=$(aws ec2 describe-vpcs \
      --region "${region}" \
      --filters "Name=isDefault,Values=true" \
      --query "Vpcs[0].VpcId" \
      --output text 2>/dev/null || echo "access-denied")
    
    if [[ "${default_vpc_id}" == "access-denied" ]]; then
      echo "Access denied to region"
    elif [[ "${default_vpc_id}" != "None" && -n "${default_vpc_id}" ]]; then
      echo "Default VPC: ${default_vpc_id}"
      enis=$(aws ec2 describe-network-interfaces \
        --region "${region}" \
        --filters "Name=vpc-id,Values=${default_vpc_id}" \
        --query 'NetworkInterfaces[*].[NetworkInterfaceId,Description,Attachment.InstanceId,Groups[0].GroupName,PrivateIpAddress,Status]' \
        --output table)
      
      if [[ -z "${enis}" ]]; then
        echo "No ENIs in default VPC"
      else
        echo "${enis}"
      fi
    else
      echo "No default VPC"
    fi
  done
=== ap-south-1 ===
Access denied to region
=== eu-north-1 ===
Access denied to region
=== eu-west-3 ===
Access denied to region
=== eu-west-2 ===
Access denied to region
=== eu-west-1 ===
Access denied to region
=== ap-northeast-3 ===
Default VPC: vpc-dad6a2b3
No ENIs in default VPC
=== ap-northeast-2 ===
Access denied to region
=== ap-northeast-1 ===
Default VPC: vpc-65d12403
--------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                               DescribeNetworkInterfaces                                                              |
+-----------------------+-------------------------------------------------------------------------------+-------+----------+----------------+----------+
|  eni-0a29db30ad25576ab|  AWS Lambda VPC ENI-SecretsManagertest2-5299c4ec-8178-4ebc-b7e9-d1bbe1e6686b  |  None |  default |  172.31.40.255 |  in-use  |
|  eni-08783ed0bee5635eb|  AWS Lambda VPC ENI-SecretsManagertest2-e6ebd056-2681-43c4-8370-223d850ba8ae  |  None |  default |  172.31.10.12  |  in-use  |
+-----------------------+-------------------------------------------------------------------------------+-------+----------+----------------+----------+
=== ca-central-1 ===
Access denied to region
=== sa-east-1 ===
Access denied to region
=== ap-southeast-1 ===
Access denied to region
=== ap-southeast-2 ===
Access denied to region
=== eu-central-1 ===
Access denied to region
=== us-east-1 ===
Default VPC: vpc-0e0796981cea634c1
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                                        DescribeNetworkInterfaces                                                                       |
+-----------------------+-----------------------------------------------------------------------+----------------------+------------------+----------------+-------------+
|  eni-0d7eeb3a23fee2677|                                                                       |  None                |  dev-sg-web      |  172.31.60.77  |  available  |
|  eni-0a059a27fbba02579|  RDSNetworkInterface                                                  |  None                |  rds-ec2-1       |  172.31.39.35  |  in-use     |
|  eni-014b924914e536be8|  middle-box-1a                                                        |  None                |  default         |  172.31.44.9   |  available  |
|  eni-0443ae9451195697b|  EFS mount target for fs-0e211df86678573e6 (fsmt-07e29b548ad06d0ad)   |  None                |  dev-sg-web      |  172.31.45.82  |  in-use     |
|  eni-07a9b71aab546426c|                                                                       |  i-0083cc67a3f0f1899 |  ec2-rds-1       |  172.31.42.90  |  in-use     |
|  eni-036a0760c9a12780d|                                                                       |  None                |  dev-sg-web      |  172.31.37.3   |  available  |
|  eni-067b08e8a6db89982|  middle-box-01b                                                       |  None                |  default         |  172.31.10.239 |  available  |
|  eni-087dcbdf5333d892c|  RDSNetworkInterface                                                  |  None                |  rds-ec2-1       |  172.31.13.199 |  in-use     |
|  eni-09eef4d98325092ad|  AWS Lambda VPC ENI-non-97-test-dc47400a-ffae-4645-b18a-3e1ee968a662  |  None                |  launch-wizard-1 |  172.31.19.8   |  in-use     |
|  eni-0d4b4c34faeb80a85|  test                                                                 |  None                |  launch-wizard-1 |  172.31.23.211 |  available  |
|  eni-0838821c2f3a45266|  Instance Connect Endpoint (id: eice-081e74dddc13f8c39)               |  None                |  dev-sg-web      |  172.31.16.83  |  in-use     |
|  eni-0302d0e7049e50a4a|  EFS mount target for fs-0e211df86678573e6 (fsmt-022ca3cb83071eb35)   |  None                |  dev-sg-web      |  172.31.92.184 |  in-use     |
|  eni-0026b24ef99d89b32|                                                                       |  i-071df6c56cac37342 |  dev-sg-web      |  172.31.81.82  |  in-use     |
|  eni-04b2e586a370834c4|  test-eni                                                             |  None                |  dev-sg-web      |  172.31.89.246 |  available  |
|  eni-05ceca5d09c03f1c6|                                                                       |  i-04723fbca55cb49aa |  https           |  172.31.83.245 |  in-use     |
+-----------------------+-----------------------------------------------------------------------+----------------------+------------------+----------------+-------------+
=== us-east-2 ===
Access denied to region
=== us-west-1 ===
Access denied to region
=== us-west-2 ===
Access denied to region

はい、デフォルトVPC上にENIがいくつか存在していることが分かりました。

表示するENIの情報としてはENIのIDだけでなく、ENIの説明やインスタンスID、セキュリティグループ名も載せているため、何の目的のENIか判断しやすいかと思います。

もし、このスクリプトを実行した結果、何も該当するENIが表示されなければ「デフォルトVPCは使用していない可能性が高い」と言っていいでしょう。

ただし、「今は使用していないが簡単な検証用途で使うので消したくない」という場合もあるので、削除の最終的な判断は別途必要です。

デフォルトセキュリティグループを使用しているか判断するスクリプト

関連してデフォルトセキュリティグループを使用しているか判断するスクリプトも用意してみます。

Security Hub推奨に、「デフォルトセキュリティグループでは、インバウンドトラフィックとアウトバウンドトラフィックを許可しないようにする」という項目があります。

https://dev.classmethod.jp/articles/securityhub-fsbp-remediation-ec2-2/

以下記事ではデフォルトセキュリティグループのインバウンドルールとアウトバウンドルールを削除するスクリプトが紹介されていました。

https://dev.classmethod.jp/articles/delete-all-default-sg-rules-with-cli/

こちらも実行前に全リージョンのデフォルトセキュリティグループを使用しているか確認しておきたいところです。

デフォルトセキュリティグループを使用しているか判断するスクリプトは以下のとおりです。

# 全リージョンをループで処理
aws ec2 describe-regions --query "Regions[].[RegionName]" --output text | \
while read -r region; do
  echo "=== ${region} ==="
  
  # デフォルトセキュリティグループの情報を取得
  # 何らかの理由で取得できなかった場合は access-denied を返す
  default_sgs=$(aws ec2 describe-security-groups \
    --filters "Name=group-name,Values=default" \
    --region "${region}" \
    --query "SecurityGroups[].[GroupId,VpcId]" \
    --output text 2>/dev/null || echo "access-denied")
  
  if [[ "${default_sgs}" == "access-denied" ]]; then
    echo "Access denied to region"
  else
    echo "${default_sgs}" | while read -r default_sg_id vpc_id; do
      echo "Default Security Group: ${default_sg_id} in VPC: ${vpc_id}"
      
      # デフォルトセキュリティグループをアタッチしているENIの一覧を取得
      enis=$(aws ec2 describe-network-interfaces \
        --region "${region}" \
        --filters "Name=group-id,Values=${default_sg_id}" \
        --query 'NetworkInterfaces[*].[NetworkInterfaceId,Description,Attachment.InstanceId,Groups[0].GroupName,PrivateIpAddress,Status]' \
        --output table)
      
      if [[ -z "${enis}" ]]; then
        echo "No ENIs using this default security group"
      else
        echo "${enis}"
      fi
      
      echo "---"
    done
  fi
done

実際の実行結果は以下のとおりです。

> aws ec2 describe-regions --query "Regions[].[RegionName]" --output text | \
  while read -r region; do
    echo "=== ${region} ==="
    
    default_sgs=$(aws ec2 describe-security-groups \
      --filters "Name=group-name,Values=default" \
      --region "${region}" \
      --query "SecurityGroups[].[GroupId,VpcId]" \
      --output text 2>/dev/null || echo "access-denied")
    
    if [[ "${default_sgs}" == "access-denied" ]]; then
      echo "Access denied to region"
    else
      echo "${default_sgs}" | while read -r default_sg_id vpc_id; do
        echo "Default Security Group: ${default_sg_id} in VPC: ${vpc_id}"
        
        enis=$(aws ec2 describe-network-interfaces \
          --region "${region}" \
          --filters "Name=group-id,Values=${default_sg_id}" \
          --query 'NetworkInterfaces[*].[NetworkInterfaceId,Description,Attachment.InstanceId,Groups[0].GroupName,PrivateIpAddress,Status]' \
          --output table)
        
        if [[ -z "${enis}" ]]; then
          echo "No ENIs using this default security group"
        else
          echo "${enis}"
        fi
        
        echo "---"
      done
    fi
  done
=== ap-south-1 ===
Access denied to region
=== eu-north-1 ===
Access denied to region
=== eu-west-3 ===
Access denied to region
=== eu-west-2 ===
Access denied to region
=== eu-west-1 ===
Access denied to region
=== ap-northeast-3 ===
Default Security Group: sg-ba03dcd7 in VPC: vpc-dad6a2b3
No ENIs using this default security group
---
=== ap-northeast-2 ===
Access denied to region
=== ap-northeast-1 ===
Default Security Group: sg-ea3b8caa in VPC: vpc-65d12403
--------------------------------------------------------------------------------------------------------------------------------------------------------
|                                                               DescribeNetworkInterfaces                                                              |
+-----------------------+-------------------------------------------------------------------------------+-------+----------+----------------+----------+
|  eni-08783ed0bee5635eb|  AWS Lambda VPC ENI-SecretsManagertest2-e6ebd056-2681-43c4-8370-223d850ba8ae  |  None |  default |  172.31.10.12  |  in-use  |
|  eni-0a29db30ad25576ab|  AWS Lambda VPC ENI-SecretsManagertest2-5299c4ec-8178-4ebc-b7e9-d1bbe1e6686b  |  None |  default |  172.31.40.255 |  in-use  |
+-----------------------+-------------------------------------------------------------------------------+-------+----------+----------------+----------+
---
Default Security Group: sg-0b202cf685bb88afa in VPC: vpc-081ab1b7c99573078
No ENIs using this default security group
---
=== ca-central-1 ===
Access denied to region
=== sa-east-1 ===
Access denied to region
=== ap-southeast-1 ===
Access denied to region
=== ap-southeast-2 ===
Access denied to region
=== eu-central-1 ===
Access denied to region
=== us-east-1 ===
Default Security Group: sg-0cdc98892498e6914 in VPC: vpc-0767546a4a971284a
No ENIs using this default security group
---
Default Security Group: sg-0cadd3a965eedf5d3 in VPC: vpc-0cc4f3b545dd1b0f9
------------------------------------------------------------------------------------------------------------------------------------------------
|                                                           DescribeNetworkInterfaces                                                          |
+-----------------------+----------------------------------------------------------+----------------------+----------+--------------+----------+
|  eni-05b49059dc8a7e817|                                                          |  i-0356f8e0e11769b84 |  default |  10.10.10.7  |  in-use  |
|  eni-011449b4ceda02056|  Instance Connect Endpoint (id: eice-09d588e0dbdfdc61f)  |  None                |  default |  10.10.10.58 |  in-use  |
+-----------------------+----------------------------------------------------------+----------------------+----------+--------------+----------+
---
Default Security Group: sg-004bd768e7fa0c6af in VPC: vpc-08b84da1f793ed513
No ENIs using this default security group
---
Default Security Group: sg-0bab7652db4323c2f in VPC: vpc-077bfab699bde9ffd
No ENIs using this default security group
---
Default Security Group: sg-01730f460dd64aced in VPC: vpc-057d85fe789426161
-------------------------------------------------------------------------------------------------------------------------------------------------
|                                                           DescribeNetworkInterfaces                                                           |
+-----------------------+----------------------------------------------------------+----------------------+----------+---------------+----------+
|  eni-05c1a66fa55674fb5|                                                          |  i-0ae4b4d9c4e67eef0 |  default |  10.10.10.117 |  in-use  |
|  eni-07d30a5de49bc3d72|                                                          |  i-0902bb7c744b89712 |  default |  10.10.10.53  |  in-use  |
|  eni-05e089664cb778d54|  Instance Connect Endpoint (id: eice-0b6fd89ca72cc86be)  |  None                |  default |  10.10.10.31  |  in-use  |
+-----------------------+----------------------------------------------------------+----------------------+----------+---------------+----------+
---
Default Security Group: sg-01147e9bba745baf5 in VPC: vpc-0f49176335ca20b0f
No ENIs using this default security group
---
Default Security Group: sg-0978ece55223034bb in VPC: vpc-0fdbd180d32d6e215
No ENIs using this default security group
---
Default Security Group: sg-09833fa43dc030900 in VPC: vpc-0e0796981cea634c1
---------------------------------------------------------------------------------------------------------------
|                                          DescribeNetworkInterfaces                                          |
+-----------------------+-----------------+----------------------+------------+-----------------+-------------+
|  eni-014b924914e536be8|  middle-box-1a  |  None                |  default   |  172.31.44.9    |  available  |
|  eni-07a9b71aab546426c|                 |  i-0083cc67a3f0f1899 |  ec2-rds-1 |  172.31.42.90   |  in-use     |
|  eni-067b08e8a6db89982|  middle-box-01b |  None                |  default   |  172.31.10.239  |  available  |
+-----------------------+-----------------+----------------------+------------+-----------------+-------------+
---
Default Security Group: sg-0e2239cc74c5c84f9 in VPC: vpc-0d54cbe88a44ffd04
----------------------------------------------------------------------------------------------------------------------------------------------------
|                                                             DescribeNetworkInterfaces                                                            |
+-----------------------+----------------------------------------------------------+----------------------+----------+---------------+-------------+
|  eni-0bf0f5ad7da56c415|  padding-eni                                             |  None                |  default |  10.10.10.134 |  available  |
|  eni-0ca739e2f35ce4ec9|                                                          |  i-058cde57299955719 |  default |  10.10.10.36  |  in-use     |
|  eni-029fceab5d2106e41|  Instance Connect Endpoint (id: eice-0145e3d0a247d9188)  |  None                |  default |  10.10.10.13  |  in-use     |
+-----------------------+----------------------------------------------------------+----------------------+----------+---------------+-------------+
---
=== us-east-2 ===
Access denied to region
=== us-west-1 ===
Access denied to region
=== us-west-2 ===
Access denied to region

Secrets Managerのシークレット自動ローテーション用Lambda関数やEC2 Instance Connect EndpointのENIなどにアタッチされていることが分かりました。

マネジメントコンソールからポチポチリソースを作成すると、ついデフォルトのセキュリティグループをアタッチしがちです。ルールを削除する前に事前に確認しておきましょう。

削除をする前には利用しているリソースがないか確認しよう

全リージョンのデフォルトVPCやデフォルトセキュリティグループを使用しているかシェルスクリプトで確認してみました。

削除をする前や変更をする前には利用しているリソースがないか確認し、影響範囲を理解しましょう。

この記事が誰かの助けになれば幸いです。

以上、クラウド事業本部 コンサルティング部の のんピ(@non____97)でした!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.