【AWS】セキュリティグループのルール設定をCSVで効率化
趣旨
AWS SG(セキュリティグループ)のルールを、CSVで一気に追加/削除する方法を紹介します。
大量の通信要件を追加する場合や、複数のグループへの変更を適用する場合は、こちらの方法が参考になるかと思います。
使用するサービス/ツール
- AWS CLI
- CloudShell
- PowerShell
前提
1. CSVファイルの作成
1-1. フォーマットの作成
まずフォーマットを作成します。
下記の値をExcelの一列目に記載し、CSVファイルとして保存します。
※「GroupName」はログ出力などの管理目的です。省略しても問題ありません。
GroupID | GroupName | Protocol | Port | Cidr |
---|
1-2. パラメータシートの作成
1.で作成したフォーマットに、希望の通信要件を追記していきます。
各項目ごとの記載ルールは下記の通りに認識しておりますが、詳細はコマンドリファレンスをご確認ください。
項目 | ルール |
---|---|
全体 | 一つのセルに一つの値を指定。複数は不可能。 |
GroupID | 対象のセキュリティグループID(sg-から始まる)を指定。 |
GroupName | 対象のセキュリティグループ名を指定。 |
Protocol | tcp,udp,icmp,allのいずれかを指定。 |
Port | ポート番号を指定。Anyは-1を指定。 |
Cidr | IPアドレスを指定。プレフィックス長をつける。 |
※記入例
「launch-wizard-1」と「default」というグループに、10.0.0.0/32からのicmpとhttpsを許可します。
ここまで記載出来たら、フォーマットとは別のCSVファイルとして保存します。
CloudShellを利用される方は、この段階でファイルをアップロードしておきましょう。
2. コマンドラインで設定
2-1. Powershell立ち上げ
AWS CLIをインストールされている場合は、Powershellを立ち上げるだけです。
CloudShellを使われている場合は、下記「pwsh」コマンドを実行し、Powershellに切り替えます。
[cloudshell-user@ip-10-0-0-0 ~]$ pwsh
PowerShell 7.0.6
Copyright (c) Microsoft Corporation. All rights reserved.
https://aka.ms/powershell
Type 'help' to get help.
# powershellに切り替わる
PS /home/cloudshell-user>
PS /home/cloudshell-user>
2-2. CSV取り込み
環境変数「CSV」を定義し、作成したCSVファイル(パラメータシート)を取り込み、内容を確認します。
本記事では、作成したパラメータシートを「test.csv」として保存しています。
※コマンドを実行するディレクトリにCSVファイルがない場合は、ディレクトリを移動するか、パスを指定する必要があります。
# 環境変数に取り込み
> $CSV = Import-CSV test.csv -Encoding UTF8
# 内容確認
> $CSV
GroupID : sg-0ae2894c0e704a315
GroupName : launch-wizard-1
Protocol : icmp
Port : -1
Cidr : 10.0.0.0/32
GroupID : sg-7692fa37
GroupName : default
Protocol : tcp
Port : 443
Cidr : 10.0.0.0/32
2-3.事前コンフィグの取得
変更前の設定内容をファイルとして取得したい場合は、下記コマンドを実行します。
ここでは、「before.txt」に対象の「launch-wizard-1」と「default」の設定内容をテーブル形式で出力しています。
# 「Sort-Object GroupName -Unique」によって、グループ名の重複排除を行っていますので、同じグループの設定内容が出力されることはありません。
> $CSV | Sort-Object GroupName -Unique | foreach{
aws ec2 describe-security-groups --output table `
--group-ids $_.GroupID `
| tee before.txt -a }
# 下記のようなテーブル形式で、それぞれのセキュリティグループの設定が出力されます。
> cat before.txt
-------------------------------------------------
| DescribeSecurityGroups |
+-----------------------------------------------+
|| SecurityGroups ||
|+--------------+------------------------------+|
|| Description | default VPC security group ||
|| GroupId | sg-7692fa37 ||
|| GroupName | default ||
2-4-1. インバウンドルールとして追加
環境変数「CSV」に取り込んだ内容を、インバウンド(受信)ルールに追加していきます。
下記コマンドを実行します。
> $CSV | foreach{
aws ec2 authorize-security-group-ingress `
--group-id $_.GroupID `
--protocol $_.Protocol `
--port $_.Port `
--cidr $_.Cidr
}
# 何も表示されなければOK
2-4-2. インバウンドルールとして削除
削除の場合は、下記コマンドを実行します。
> $CSV | foreach{
aws ec2 revoke-security-group-ingress `
--group-id $_.GroupID `
--protocol $_.Protocol `
--port $_.Port `
--cidr $_.Cidr
}
#下記が表示されればOK
{
"Return": true
}
2-5-1. アウトバウンドルールとして設定
環境変数「CSV」に取り込んだ内容を、アウトバウンド(送信)ルールに追加していきます。
下記コマンドを実行します。
> $CSV | foreach{
aws ec2 authorize-security-group-egress `
--group-id $_.GroupID `
--protocol $_.Protocol `
--port $_.Port `
--cidr $_.Cidr
}
# 何も表示されなければOK
2-5-2. アウトバウンドルールとして削除
削除の場合は、下記コマンドを実行します。
> $CSV | foreach{
aws ec2 revoke-security-group-egress `
--group-id $_.GroupID `
--protocol $_.Protocol `
--port $_.Port `
--cidr $_.Cidr
}
#下記が表示されればOK
{
"Return": true
}
2-6. 事後確認
作業通りに設定されているか確認します。方法の指定はありません。
WebUIで直接確認するか、「3. 事前コンフィグの取得」の要領と同じく、別ファイルに出力し、diffツールで比較する方法も考えれます。
※例 「after.txt」へ出力
> $CSV | Sort-Object GroupName -Unique | foreach{
aws ec2 describe-security-groups --output table `
--group-ids $_.GroupID `
| tee after.txt -a }
3. 終わりに
今回はIPアドレスを指定しましたが、Cidrの欄にプレフィックスリストやSGを指定することも可能です。項目自体も変更可能ですので、色々とアレンジしていただければと思います(コマンド文も変更することをお忘れなく)。
Discussion