CLIを利用して特定のSGに紐づいたEC2一覧とSGルール内容一覧を作成する


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

お久しぶりです。株式会社協栄情報システム3部所属の寺尾です。

セキュリティグループ(以下SG)の確認をしたい時等にSGの一覧や適用先EC2の一覧が必要なことはないでしょうか?

今回はCLIからそれらを取得していこうと思います。

前提条件

  • 作業端末にCLI v2がインストールされており、aws configureを設定していること
  • Windows PowerShellから実行すること(コマンドプロンプト上でPowershellと入力してください)

PowerShell以外だと多少コマンドが異なります。

SGに紐づいたEC2一覧取得

以下のコマンドを実行することで、(sg-nameは自身のセキュリティグループ名に変更)

aws ec2 describe-instances `
--filters Name=instance.group-name,Values="sg-name" `
--query 'Reservations[*].Instances[*].{Instance:InstanceId,NameTag:Tags[?Key==`Name`]|[0].Value}' `
--output table

下記のような形で出力されます。必要でしたら>>を利用して好きな場所に出力しましょう。

-----------------------------------------------------------------------------
|                             DescribeInstances                             |
+----------------------+----------------------------------------------------+
|       Instance       |                      NameTag                       |
+----------------------+----------------------------------------------------+
|  i-xxxxxxxxxxxxxxxxx |  xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  |
+----------------------+----------------------------------------------------+

コマンド二行目ではフィルターをかけており、Nameに検索先のデータのキー、Valuesにデータのバリューを指定してフィルターしています。
Name=instance.group-nameName=instance.group-idにすることでセキュリティグループIDで検索をかけることも可能です。

コマンド三行目ではクエリをかけて必要なデータのみ抜き出しています。

コマンド四行目は、出力形式を指定しています。
出力形式として可読性に優れたtable以外にも下記四つから選べます。

  • json
  • yaml
  • yaml-stream
  • text

エクセルに取り込みたい場合はjson形式を選択しエクセルから高度なクエリを実行して取り込むことが可能です。
出力形式の詳細はAWS CLI 出力フォーマットの設定を参考にしてください。

SGルール内容一覧取得

以下のコマンドを実行することで、(sg-xxxxxxxxxxxxxxxxxは自身のセキュリティグループIDに変更)

aws ec2 describe-security-group-rules `
--filters 'Name=group-id,Values=sg-xxxxxxxxxxxxxxxxx' `
--query 'SecurityGroupRules[*].{GroupId: GroupId,IsEgress: IsEgress,IpProtocol: IpProtocol,FromPort: FromPort,ToPort: ToPort,CidrIpv4: CidrIpv4,ReferencedGroupInfoGroupId: ReferencedGroupInfo.GroupId}' `
--output table

下記のような形で出力されます。

----------------------------------------------------------------------------------------------------------------------------
|                                                DescribeSecurityGroupRules                                                |
+------------------+-----------+-----------------------+-------------+-----------+------------------------------+----------+
|     CidrIpv4     | FromPort  |        GroupId        | IpProtocol  | IsEgress  | ReferencedGroupInfoGroupId   | ToPort   |
+------------------+-----------+-----------------------+-------------+-----------+------------------------------+----------+
|  xxx.xx.xx.xx/xx |  0        |  sg-xxxxxxxxxxxxxxxxx |  tcp        |  False    |  None                        |  65535   |
|  0.0.0.0/0       |  -1       |  sg-xxxxxxxxxxxxxxxxx |  -1         |  True     |  None                        |  -1      |
|  xxx.xx.xx.xx/xx |  0        |  sg-xxxxxxxxxxxxxxxxx |  tcp        |  False    |  None                        |  65535   |
|  xxx.xx.xx.xx/xx |  0        |  sg-xxxxxxxxxxxxxxxxx |  tcp        |  False    |  None                        |  65535   |
+------------------+-----------+-----------------------+-------------+-----------+------------------------------+----------+

それぞれの項目の意味は以下の通り。

  • IsEgress:Trueがアウトバウンドルールを表す。Falseがインバウンドルールを表す。
  • GroupId:ルールと紐づいているセキュリティグループのID
  • CidrIpv4:インバウンドルールの場合はソースとなるIPアドレス。アウトバウンドルールの場合は送信先となるIPアドレス。
  • FromPort:ポート範囲の開始地点。-1はすべてのICMP/ICMPv6コードを表す。
  • ToPort:ポート範囲の終端地点。-1はすべてのICMP/ICMPv6コードを表す。
  • IpProtocol:利用するプロトコル。-1はALLを表す。
  • ReferencedGroupInfoGroupId:インバウンドルールの場合はソースとなるセキュリティグループのID。アウトバウンドルールの場合は送信先となるセキュリティグループのID。

以下のような形でIsEgressの値を指定してフィルタリングすることでアウトバウンドルールのみ、インバウンドルールのみで出力することも可能になります。

aws ec2 describe-security-group-rules `
--filters 'Name=group-id,Values=sg-xxxxxxxxxxxxxxxxx' `
--query 'SecurityGroupRules[?IsEgress==`false`].{GroupId: GroupId,IsEgress: IsEgress,IpProtocol: IpProtocol,FromPort: FromPort,ToPort: ToPort,CidrIpv4: CidrIpv4,ReferencedGroupInfoGroupId: ReferencedGroupInfo.GroupId}' `
--output table

参考

AWS CLI 出力をフィルタリングする

AWS CLI バージョン 2 リファレンスガイド

おわりに

ここまで読んでいただきありがとうございました。
CLIでのクエリはできることが大変多くて難しいですが結構面白いですね。
間違いなどあればぜひご指摘ください。
この記事が誰かの助けとなれば幸いです。

Last modified: 2024-02-07

Author