EC2:セキュリティグループ一覧(明細)

セキュリティグループのデータ構造は、配列の下に配列がある状態なので、ヘッダと明細に分けて説明します。

1,IAM

---------------------------------------
AWSサービス:Amazon EC2
アクション     :DescribeSecurityGroups
Amazonリソースネーム(ARN):*
---------------------------------------

2,プログラム仕様

●入力パラメータ
・IAMユーザの”アクセスキーID”と”・シークレットアクセスキー”
セキュリティグループID  ←これを追加
●処理内容
セキュリティグループの一覧を画面表示する
●エラー処理
特になし

3,画面構成

4,プログラム

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim _AWSID As String = TextBox1.Text
        Dim _AWSPass As String = TextBox2.Text
        Dim _SGID As String = TextBox3.Text

        'EC2クライアント作成
        Dim cred As Amazon.Runtime.BasicAWSCredentials
        cred = New Amazon.Runtime.BasicAWSCredentials(_AWSID, _AWSPass)
        Dim ec2client As Amazon.EC2.AmazonEC2Client
        ec2client = New Amazon.EC2.AmazonEC2Client(cred, Amazon.RegionEndpoint.APNortheast1)

        'リクエストオブジェクトを定義
        Dim reQ = New Amazon.EC2.Model.DescribeSecurityGroupsRequest
        reQ.GroupIds.Add(_SGID)

        'レスポンスオブジェクトを定義して、実行。
        Dim Res As Amazon.EC2.Model.DescribeSecurityGroupsResponse
        Res = ec2client.DescribeSecurityGroups(reQ)

        'セキュリティグループID取得件数が0なら終わり
        If Res.SecurityGroups.Count = 0 Then
        Else
            '表示用のデータテーブルを作成する。
            Dim Dt As New Data.DataTable
            Dt.Columns.Add("INOUT")         'インバウンドかアウトバウンドか
            Dt.Columns.Add("IpProtocol")    'プロトコル tcp/udp/icmp 等
            Dt.Columns.Add("Port_Range")
            Dt.Columns.Add("IpRange")

            Dim wSG As Amazon.EC2.Model.SecurityGroup = Res.SecurityGroups(0)

            'インバウンド分を取得する
            For Each wInBound As Amazon.EC2.Model.IpPermission In wSG.IpPermissions
                '送信元IP分ループする
                For i As Integer = 0 To wInBound.IpRanges.Count - 1
                    Dim Dr As DataRow = Dt.NewRow
                    Dr("INOUT") = "インバウンド"
                    'IpProtocolが-1のときは”すべて”
                    If wInBound.IpProtocol = "-1" Then
                        Dr("IpProtocol") = "すべて"
                        Dr("Port_Range") = "すべて"
                    Else
                        Dr("IpProtocol") = wInBound.IpProtocol.ToString
                        'From/Toが同じ値なら、片方のみを表示
                        If wInBound.FromPort = wInBound.ToPort Then
                            Dr("Port_Range") = wInBound.FromPort.ToString
                        Else
                            Dr("Port_Range") = wInBound.FromPort.ToString + "-" + wInBound.ToPort.ToString
                        End If
                    End If
                    Dr("IpRange") = wInBound.IpRanges(i).ToString
                    Dt.Rows.Add(Dr)
                Next
            Next

            ''アウトバウンド分を取得する
            For Each wOutBound As Amazon.EC2.Model.IpPermission In wSG.IpPermissionsEgress
                '送信元IP分ループする
                For i As Integer = 0 To wOutBound.IpRanges.Count - 1
                    Dim Dr As DataRow = Dt.NewRow
                    Dr("INOUT") = "アウトバウンド"
                    'IpProtocolが-1のときは”すべて”
                    If wOutBound.IpProtocol = "-1" Then
                        Dr("IpProtocol") = "すべて"
                        Dr("Port_Range") = "すべて"
                    Else
                        Dr("IpProtocol") = wOutBound.IpProtocol.ToString
                        'From/Toが同じ値なら、片方のみを表示
                        If wOutBound.FromPort = wOutBound.ToPort Then
                            Dr("Port_Range") = wOutBound.FromPort.ToString
                        Else
                            Dr("Port_Range") = wOutBound.FromPort.ToString + "-" + wOutBound.ToPort.ToString
                        End If
                    End If
                    Dr("IpRange") = wOutBound.IpRanges(i).ToString
                    Dt.Rows.Add(Dr)
                Next
            Next

            '画面表示する。
            DataGridView1.DataSource = Dt
        End If
    End Sub

5,解説

EC2管理コンソールの”セキュリティグループ”の画面下半分に表示される項目を表示します。
データ構造が複雑なので、入力パラメータとして、1つのセキュリティグループに絞って設定内容を取得します。
14行目で、単一のセキュリティグループに絞り、リクエストします。
14
        reQ.GroupIds.Add(_SGID)
SecurityGroupsを1つに絞ったので、それ以下について、
EC2管理コンソールのセキュリティグループで、セキュリティグループ1つ選択した時に画面下半分に表示されるように取得します。
データ構造は、Amazon.EC2.Model.IpPermission です →参照:公式ドキュメント→こちら
概要:プロトコル(tcp/udp等)と、ポート範囲に、送信元IPが配列としてぶら下がっている感じです。
これを展開します。
35行目:送信元IPの数だけループします。
37行目:インバウンドと決め打ちしています。∵IpPermissions=インバウンド。後述しますが、IpPermissionsEgress=アウトバウンドです。
39行目:IpProtcol=-1のときは、"すべて許可"ですのでポート範囲もありません。
45-49行目:ポート範囲がなければ、単一の"999"とし、範囲指定があれば、"0-999"と表現します。
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
            'インバウンド分を取得する
            For Each wInBound As Amazon.EC2.Model.IpPermission In wSG.IpPermissions
                '送信元IP分ループする
                For i As Integer = 0 To wInBound.IpRanges.Count - 1
                    Dim Dr As DataRow = Dt.NewRow
                    Dr("INOUT") = "インバウンド"
                    'IpProtocolが-1のときは”すべて”
                    If wInBound.IpProtocol = "-1" Then
                        Dr("IpProtocol") = "すべて"
                        Dr("Port_Range") = "すべて"
                    Else
                        Dr("IpProtocol") = wInBound.IpProtocol.ToString
                        'From/Toが同じ値なら、片方のみを表示
                        If wInBound.FromPort = wInBound.ToPort Then
                            Dr("Port_Range") = wInBound.FromPort.ToString
                        Else
                            Dr("Port_Range") = wInBound.FromPort.ToString + "-" + wInBound.ToPort.ToString
                        End If
                    End If
                    Dr("IpRange") = wInBound.IpRanges(i).ToString
                    Dt.Rows.Add(Dr)
                Next
            Next

アウトバウンド分を取得します。IpPermissionsEgress オブジェクトにアウトバウンド分が入ります。
セキュリティグループのアウトバウンドは、VPCのみの機能です。EC2-Classicにはアウトバウンドはありません。
56
57
            ''アウトバウンド分を取得する
            For Each wOutBound As Amazon.EC2.Model.IpPermission In wSG.IpPermissionsEgress
ループの中身は、インバウンド分と同じです。



補足:
このページでは、送信元IPアドレスに限定して作成しましたが、
送信元をセキュリティグループに設定している場合が抽出できません。
IpPermission.UserIdGroupPairsに配列として格納されますので、そちらを使ってください。
・・・ループの回し方を考えないといけないですね。。

Comments