LoginSignup
1
1

More than 5 years have passed since last update.

PowershellとAWSCLIでAWS EC2のセキュリティグループを抽出した話

Last updated at Posted at 2019-04-08

#動機
初投稿です。
AWSのマネジメントコンソールでセキュリティグループの閲覧をしていて、
セキュリティグループとかインバウンドとかチクチク押すのめんどいなと思いまして。
本記事投稿当時、Powershellで作業するのがマイブームであったということもあり、
ちょいとチャレンジした次第です。

#やりたいこと
GroupIDに対し、インバウンドに表示されるルールの見たい項目を配列として格納し、
CSV形式でいい感じに出力したい。

#使ったもの

  • Powershell
  • AWSCLI

#できたもの

hoge.ps1
#配列の出力先のファイル名の記述
$LogFolder = 'C:\hoge\results'
$TimeStamp = (Get-Date -Format 'yyyyMMdd-HHmmss')
$ResultCsv = $LogFolder + '\' + 'result_' + $TimeStamp + '.csv'

function main {
    #配列の宣言とaws ec2 describe-security-groupsで持ってきたjson文を
    #AWS_jsonにオブジェクトとして格納
    $list = @()
    $AWS_json = aws ec2 describe-security-groups | ConvertFrom-Json

    #配列の作成    
    foreach($x in $AWS_json.SecurityGroups){
        foreach($y in $x.IpPermissions){
            foreach($z in $y.IpRanges){
                $list += New-Object PSObject -Property @{
                    TagName=$x.Tags.Value 
                    GroupName=$x.GroupName 
                    GroupID=$x.GroupID
                    Protocol=$y.IpProtocol
                    Port=$y.ToPort
                    Source=$z.CidrIp
                    Description=$z.Description
                }
            }
            foreach($z in $y.UserIdGroupPairs){
                $list += New-Object PSObject -Property @{
                    TagName=$x.Tags.Value 
                    GroupName=$x.GroupName 
                    GroupID=$x.GroupID
                    Protocol=$y.IpProtocol
                    Port=$y.ToPort
                    Source=$z.GroupID
                    Description=$z.Description
                }
            }
        }
    }
    #表示順変更
    $list = $list | Select-Object `
        "TagName" , "GroupName" , "GroupID" , `
        "Protocol" , "Port" , `
        "Source" , "Description"
    
    #配列をCSVファイルに出力
    $list | Export-Csv -Path $ResultCsv
}

main

#できたものからできたもの
大方こんな感じ。
「-1」と入っているのはAWSのコンソールから見たときの「すべて」に相当するようです。

TagName GroupName GroupID Protocol Port Source Description
hoge hoge sg-hogehogehoge tcp 8080 0.0.0.0/0 hoge
hoge hoge sg-hogehogehoge tcp 22 0.0.0.0/0 hoge
default sg-hogehogehoge -1 sg-hogehogehoge hoge
hoge hoge sg-hogehogehoge tcp 80 0.0.0.0/0 hoge
hoge hoge sg-hogehogehoge tcp 443 0.0.0.0/0 hoge

#所感
あまりjsonファイルに触れたことがなかったため、いい勉強になりました。
そしてPowershellでのjsonファイル整形が意外と面白かったです。json好きになりました。
ソース文について、3重ループがちょっと気持ち悪い気がしてます。
今回はNew-Objectだけで記述しましたが、Add-Memberを活用したやり方のが自分は好みです。
一応上記のソース文を最終盤にしてますが、もっといい書きっぷりがあると思って色々試行錯誤してます。
プログラミング自体ご無沙汰なもんで。。。
以上、初投稿でした。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1