セキュリティグループのデータ構造は、配列の下に配列がある状態なので、ヘッダと明細に分けて説明します。
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に配列として格納されますので、そちらを使ってください。 ・・・ループの回し方を考えないといけないですね。。
|