この記事はハンズラボ Advent Calendar 2021 14日目の記事です。
セキュリティーグループ更新を効率化しようと思ったきっかけ
EC2インスタンスにアクセスするには、グローバルIPアドレスをセキュリティグループに設定しないといけません。そして、時々セキュリティグループの変更が必要なときがあります。例えば、「コワーキングスペースで作業するとき」や「自宅ネットワークのグローバルIPアドレスが変わってしまったとき」が挙げられますね。
セキュリティグループの変更は以下の手順で画面ポチポチしていました。
1. AWSログイン
2. EC2を選択
3. セキュリティグループを選択
4. 変更するセキュリティグループIDを選択
5. 変更するルールのIPアドレスを更新
6. ルールを保存
まあめんどくさい地味に手間がかかりますね。この手順は定期的に発生し、定型的な作業なので効率化したいと思いました。
セキュリティグループを更新するスクリプト作成
やりたいことはAWS CLIを使用して、「プロトコル」、「タイプ(ポート範囲)」、「説明」をキーとして「IPアドレス」を更新したいのです。
#!/bin/bash
myip="$(curl -s http://checkip.amazonaws.com/)/32"
sg_id="sg-xxxxxxxxx"
profile="profile"
description="5frisk_notmintia"
# 1. 設定済みのルール一覧を取得し、「プロトコル」、「タイプ(ポート範囲)」、「説明」をキーとして削除対象IPアドレスを取得
del_target_ip=$(aws ec2 describe-security-groups --profile ${profile} | \
jq '.SecurityGroups | map(select(.GroupId == "'${sg_id}'"))' |
jq '.[].IpPermissions | map(select(.IpProtocol == "tcp" and .ToPort == 22 and .FromPort == 22 ))' |
jq '.[].IpRanges | map(select(.Description == "'${description}'"))' |
jq '.[].CidrIp' |
tr -d '"')
# 2. ルール削除
# 既存のIPアドレスのルールは不要なので削除
aws ec2 revoke-security-group-ingress --profile ${profile} \
--group-id ${sg_id} \
--ip-permissions IpProtocol=tcp,FromPort=22,ToPort=22,IpRanges="{CidrIp=${del_target_ip}}"
# 3. プロトコルとポート番号とMyIPと説明を設定し、ルール追加
aws ec2 authorize-security-group-ingress --profile ${profile} \
--group-id ${sg_id} \
--ip-permissions IpProtocol=tcp,FromPort=22,ToPort=22,IpRanges="[{CidrIp=${myip},Description=${description}}]"
スクリプト作った後のセキュリティグループの更新は以下の手順になりました。
1.Bashスクリプトをキック
画面ポチポチする手間が無くなり、手軽になりましたね!また、「他のセキュリティグループルールを変更する誤操作が無くなる」といったメリットも生まれました!
より簡単に実装
しばらくはセキュリティグループ更新楽だなーと思いながらスクリプトを実行していました。その後しばらくして、AWS CLIのドキュメントを眺めていたときに気づきました。
...modify-security-group-rules??
これ使えば「削除して追加」せんでも、セキュリティーグループIDをキーにして更新すればいいだけやないかい!
当時はauthorize-security-group-ingressでしかセキュリティーグループを変更できないと思いこんでいました...
#!/bin/bash
myip="$(curl -s http://checkip.amazonaws.com/)/32"
sg_id="sg-xxxxxxxxx"
sgr_id="sgr-xxxxxxxxxxxxx"
profile="profile"
description="5frisk_notmintia"
aws ec2 modify-security-group-rules --profile ${profile} \
--group-id ${sg_id} \
--security-group-rules "SecurityGroupRuleId="${sgr_id}",
SecurityGroupRule={IpProtocol=tcp,FromPort=22,ToPort=22,CidrIpv4="${myip}",Description="${description}"}"
おわりに
予め公式ドキュメントを確認してより簡単にできる方法を探すんだぞ!