aws ec2 describe-security-group-rules > ec2_describe-security-group-rules.json
からの
$sgr = Get-Content .\ec2_describe-security-group-rules.json | ConvertFrom-Json
$sgrlist = @(
@($sgr.SecurityGroupRules.SecurityGroupRuleId), ###[0]
@($sgr.SecurityGroupRules.GroupId), ###[1]
@($sgr.SecurityGroupRules.IsEgress), ###[2]
@($sgr.SecurityGroupRules.IpProtocol), ###[3]
@($sgr.SecurityGroupRules.FromPort), ###[4]
@($sgr.SecurityGroupRules.ToPort), ###[5]
@($sgr.SecurityGroupRules.CidrIpv4), ###[6]
@($sgr.SecurityGroupRules.CidrIpv6), ###[7]
@($sgr.SecurityGroupRules.Description) ###[8]
)
### header write
echo "SecurityGroupRuleId,GroupId,IsEgress,IpProtocol,FromPort,ToPort,CidrIpv4,CidrIpv6,Description" | Out-File -Encoding oem -Force .\sgrule-list.csv
for ($i = 0; $i -lt $sgrlist[0].Length; $i++ ) {
### Null to N/A
if ($sgrlist[6][$i] -eq $nul) {$ipv4 = "N/A"}else{$ipv4 = $sgrlist[6][$i]}
if ($sgrlist[7][$i] -eq $nul) {$ipv6 = "N/A"}else{$ipv6 = $sgrlist[7][$i]}
if ($sgrlist[8][$i] -eq $nul) {$descr = "N/A"}else{$descr = $sgrlist[8][$i]}
### Input csv
$line = $sgrlist[0][$i] + "," + $sgrlist[1][$i] + "," + $sgrlist[2][$i] + "," + $sgrlist[3][$i] + "," + $sgrlist[4][$i] + "," + $sgrlist[5][$i] + "," + $ipv4 + "," + $ipv6 + "," + $descr
$line | Out-File -Encoding oem -Append .\sgrule-list.csv
}
で、ルールだけ消すときはこうする、と
インバウンドの場合
aws --profile addrle ec2 revoke-security-group-ingress --group-id sg-0113793ba0362d9a0 --security-group-rule-ids sgr-0b142f3c7151c1f38
アウトバウンドの場合
aws --profile addrle ec2 revoke-security-group-egress --group-id sg-0113793ba0362d9a0 --security-group-rule-ids sgr-0a391a55503a18e74
今回はここまで
や~、けっこう悩んだ。
まずNameタグなんかは1行でスパッと抜き出せなくて、もっといい書き方ないのかな~ってなってる。
とりあえず以下がそのコード。
### aws ec2 describe-subnets で出力したjson読み込み
$subnet = Get-Content .\describe-subnets.json | ConvertFrom-Json
### カウント用に1要素なにか配列にする
$subnetid = @($subnet.Subnets.SubnetId)
### ヘッダーを1行目に記載
$csvheader = "SubnetName," + "SubnetId," + "CidrBlock," + "Ipv6CidrBlock," + "VpcId," + "AvailabilityZone"
$csvheader | Out-File -Force -Encoding oem -FilePath .\subnets.csv
### 中身を入れていく
for ($i = 0; $i -lt $subnetid.Length; $i++) {
### Nameタグ取り出し
$subnettags = $subnet.Subnets | where {$_.SubnetId -eq $subnet.Subnets.SubnetId[$i]}
$subnetnametag = $subnettags.Tags | where {$_.Key -eq "Name"}
$subnetnamevalue = $subnetnametag.Value
### NameタグがないときはN/Aを入れる
$subnetname = if ($subnetnamevalue -eq $nul) {"N/A"}else{$subnetnamevalue}
### Ipv6も値が空ならN/Aを入れる
$ipv6cidrblock = $subnet.Subnets | where {$_.SubnetId -eq $subnet.Subnets.SubnetId[$i]}
$ipv6cidr = $ipv6cidrblock.Ipv6CidrBlockAssociationSet.Ipv6CidrBlock
$ipv6block = if ($ipv6cidr -eq $nul) {"N/A"}else{$ipv6cidr}
### 中身を詰める
$line = $subnetname + "," + $subnetid[$i] + "," + $subnet.Subnets.CidrBlock[$i] + "," + $ipv6block + "," + $subnet.Subnets.VpcId[$i] + "," + $subnet.Subnets.AvailabilityZone[$i]
$line | Out-File -Append -Encoding oem -FilePath .\subnets.csv
}
今回はここまで
いかんせん説明下手なので申し訳ないが、今回はPowershellでCSVから読み込んだデータについて説明しよう。
コマンドレットImport-Csv
は文字通りCSVファイルを読み込む際に使う。コマンドオプションなどはヘルプを見て欲しい。
ちなみにコマンドレットの簡易ヘルプはImport-Csv -?
で確認できるはず。
読み込ませるCSVにはある程度規則がある。
1行目はヘッダー(インデックス)として使用される。いきなり実データを記載してはいけない。
仮に以下のようなCSVがあるとしよう。
sample.csv
c1,c2,c3
"1行目のc1","1行目のc2","1行目のc3"
"2行目のc1","2行目のc2","2行目のc3"
"3行目のc1","3行目のc2","3行目のc3"
このようなCSVをImport-Csvで読み込んだ場合、以下のように展開することができる。
読み込み:$array_csv = Import-Csv -Path $filepath -Encoding oem -Delimiter ","
$array_csv.c1="1行目のc1"
である$array_csv[0].c1="1行目のc1"
こう書いた場合と同じである$array_csv[1].c1="2行目のc1"
である基本的には以上。
より詳しいことはMicrosoftのドキュメントを参照してほしい。
参考:Import-Csv (Microsoft.PowerShell.Utility) - PowerShell | Microsoft Docs
参考:配列について知りたかったことのすべて - PowerShell
今日はここまで
何がしたいかっていうと、AWS EC2で使うボリューム情報をCSVに書いておいて、サイズやデバイス名ごとに配列に入れたいのです。
個人的に今回肝だったのが New-Object System.Collections.ArrayList
これと if ( $_ -like "" )