課題
NACLのパラメーターシートを更新する必要がある。
以下のシート構成にする。
① ACL一覧
ACL ID・VPC ID・名前などの基本情報
② サブネット別ACL適用一覧
各サブネットに適用されているACLを確認する
③ インバウンドルール一覧
全NACLの受信ルールを一覧化
④ アウトバウンドルール一覧
全NACLの送信ルールを一覧化
それぞれを更新するための情報を出力するコマンドを書いていく。
① ACL一覧を出力
aws ec2 describe-network-acls \
--query 'NetworkAcls[*].[Tags[?Key==`Name`]|[0].Value,NetworkAclId,VpcId,IsDefault]' \
--output text | sed 's/\t/,/g' > network-acls.csv
『① ACL一覧を出力』のコマンド説明
| コマンド | 説明 |
|---|---|
aws ec2 describe-network-acls |
ネットワークACLの基本情報を取得する |
--query |
取得する項目を指定する |
NetworkAcls[*] |
すべてのネットワークACLを取得する |
Tags[?Key==\Name`]` |
Nameタグを検索する |
[0].Value |
最初に見つかったNameタグの値を取得する |
NetworkAclId |
ネットワークACLのIDを取得する |
VpcId |
ネットワークACLが所属するVPC IDを取得する |
IsDefault |
デフォルトACLかどうかを取得する |
--output text |
取得結果をテキスト形式で出力する |
sed 's/\t/,/g' |
タブ区切りをカンマ区切りに変換する |
> network-acls.csv |
実行結果をCSVファイルに保存する(既存ファイルは上書き) |
② サブネット別ACL適用一覧
aws ec2 describe-subnets --output json > /tmp/subnets.json
aws ec2 describe-network-acls --output json | \
jq -r --slurpfile subnets /tmp/subnets.json '
.NetworkAcls[] |
. as $acl |
.Associations[] |
.SubnetId as $subnetId |
[
([$subnets[0].Subnets[] |
select(.SubnetId == $subnetId) |
.Tags[]? |
select(.Key == "Name") |
.Value][0] // ""),
$subnetId,
([$acl.Tags[]? | select(.Key == "Name") | .Value][0] // ""),
$acl.NetworkAclId
] | @csv
' > subnet-network-acls.csv
『② サブネット別ACL適用一覧』のコマンド説明
| コマンド | 説明 |
|---|---|
aws ec2 describe-subnets |
サブネットの基本情報を取得する |
--output json |
取得結果をJSON形式で出力する |
> /tmp/subnets.json |
サブネット情報を一時ファイルに保存する |
aws ec2 describe-network-acls |
ネットワークACLの情報を取得する |
| |
前のコマンドの結果を次のコマンドに渡す |
jq -r |
JSONデータを加工して出力する |
--slurpfile subnets /tmp/subnets.json |
サブネット情報を読み込み、変数として利用する |
.NetworkAcls[] |
ネットワークACLを1件ずつ取得する |
. as $acl |
ACL情報を一時的に変数へ保存する |
.Associations[] |
ACLに関連付けられているサブネット情報を取得する |
.SubnetId as $subnetId |
サブネットIDを一時的に変数へ保存する |
select(.SubnetId == $subnetId) |
サブネットIDが一致するサブネットを検索する |
.Tags[]? |
サブネットに設定されたタグを取得する |
select(.Key == "Name") |
Nameタグのみを抽出する |
.Value |
Nameタグの値を取得する |
[0] // "" |
最初に取得した値を使用し、存在しない場合は空欄にする |
$subnetId |
サブネットIDを出力する |
$acl.Tags[]? |
ACLに設定されたタグを取得する |
$acl.NetworkAclId |
ACL IDを取得する |
@csv |
取得結果をCSV形式に変換する |
> subnet-network-acls.csv |
CSVファイルに保存する(既存ファイルは上書き) |
③ インバウンドルール一覧
aws ec2 describe-network-acls --output json | \
jq -r '
.NetworkAcls[] |
. as $acl |
.Entries[] |
select(.Egress == false) |
[
([$acl.Tags[]? | select(.Key == "Name") | .Value][0] // ""),
$acl.NetworkAclId,
.RuleNumber,
.RuleAction,
.Protocol,
(.PortRange.From // ""),
(.PortRange.To // ""),
(.CidrBlock // .Ipv6CidrBlock // "")
] | @csv
' > nacl-inbound.csv
『③ インバウンドルール一覧』のコマンド説明
| コマンド | 説明 |
|---|---|
aws ec2 describe-network-acls |
ネットワークACLの情報を取得する |
--output json |
取得結果をJSON形式で出力する |
| |
前のコマンドの結果を次のコマンドに渡す |
jq -r |
JSONデータを加工して出力する |
.NetworkAcls[] |
ネットワークACLを1件ずつ取得する |
. as $acl |
ACL情報を一時的に変数へ保存する |
.Entries[] |
ACLに設定された通信ルールを1件ずつ取得する |
select(.Egress == false) |
インバウンドルールのみを抽出する |
$acl.Tags[]? |
ACLに設定されたタグを取得する |
select(.Key == "Name") |
Nameタグのみを抽出する |
.Value |
Nameタグの値を取得する |
[0] // "" |
最初に取得した値を使用し、存在しない場合は空欄にする |
$acl.NetworkAclId |
ACL IDを取得する |
.RuleNumber |
ルール番号を取得する |
.RuleAction |
通信の許可(allow)または拒否(deny)を取得する |
.Protocol |
プロトコル番号を取得する(6:TCP、17:UDP、-1:すべて) |
.PortRange.From // "" |
開始ポートを取得する。存在しない場合は空欄にする |
.PortRange.To // "" |
終了ポートを取得する。存在しない場合は空欄にする |
.CidrBlock // .Ipv6CidrBlock // "" |
送信元のIPv4またはIPv6のCIDRを取得する |
@csv |
取得結果をCSV形式に変換する |
> nacl-inbound.csv |
CSVファイルに保存する(既存ファイルは上書き) |
④ アウトバウンドルール一覧
aws ec2 describe-network-acls --output json | \
jq -r '
.NetworkAcls[] |
. as $acl |
.Entries[] |
select(.Egress == true) |
[
([$acl.Tags[]? | select(.Key == "Name") | .Value][0] // ""),
$acl.NetworkAclId,
.RuleNumber,
.RuleAction,
.Protocol,
(.PortRange.From // ""),
(.PortRange.To // ""),
(.CidrBlock // .Ipv6CidrBlock // "")
] | @csv
' > nacl-outbound.csv
『④ アウトバウンドルール一覧』のコマンド説明
| コマンド | 説明 |
|---|---|
aws ec2 describe-network-acls |
ネットワークACLの情報を取得する |
--output json |
取得結果をJSON形式で出力する |
| |
前のコマンドの結果を次のコマンドに渡す |
jq -r |
JSONデータを加工して出力する |
.NetworkAcls[] |
ネットワークACLを1件ずつ取得する |
. as $acl |
ACL情報を一時的に変数へ保存する |
.Entries[] |
ACLに設定された通信ルールを1件ずつ取得する |
select(.Egress == true) |
アウトバウンドルールのみを抽出する |
$acl.Tags[]? |
ACLに設定されたタグを取得する |
select(.Key == "Name") |
Nameタグのみを抽出する |
.Value |
Nameタグの値を取得する |
[0] // "" |
最初に取得した値を使用し、存在しない場合は空欄にする |
$acl.NetworkAclId |
ACL IDを取得する |
.RuleNumber |
ルール番号を取得する |
.RuleAction |
通信の許可(allow)または拒否(deny)を取得する |
.Protocol |
プロトコル番号を取得する(6:TCP、17:UDP、-1:すべて) |
.PortRange.From // "" |
開始ポートを取得する。存在しない場合は空欄にする |
.PortRange.To // "" |
終了ポートを取得する。存在しない場合は空欄にする |
.CidrBlock // .Ipv6CidrBlock // "" |
送信先のIPv4またはIPv6のCIDRを取得する |
@csv |
取得結果をCSV形式に変換する |
> nacl-outbound.csv |
CSVファイルに保存する(既存ファイルは上書き) |