🔒
Security Groupを書き換える
書き換えるって何を?
ちょっとしたことをEC2でやるときに、さっとログインしたいのでシェルのaliasを書いて[1]いろんなVMにSSHするようにしている[2]。このときSecurityGroupは自端末からのSSHのみを許可したい。ただ、ISPがIPを毎日変えているのでSecurityGroupのSourceIPを頻繁に変更しないと繋がらない。
毎回めんどくさいのでSecurity GroupのIngressをいい感じに書き換えるシェルスクリプトを書いたので置いておく。SecurityGroupには中にSecurityGroupRuleが複数ある。これを全てrevokeして、今のSourceIPのエントリをauthorizeする。
スクリプト
#!/bin/bash
SecurityGroupId="sg-09c8e7c03dd2c0af0"
GlobalIP=$(curl -s inet-ip.info)
echo "Before:"
aws ec2 describe-security-group-rules | \
jq --arg sgid $SecurityGroupId '[.SecurityGroupRules[] | select(.GroupId == $sgid and .IsEgress == false)]'
echo "Deleting existing security rules..."
SecurityRules=$(aws ec2 describe-security-group-rules | \
jq --arg sgid $SecurityGroupId '[.SecurityGroupRules[] | select(.GroupId == $sgid and .IsEgress == false)]' | \
jq '[.[].SecurityGroupRuleId]')
for sgr in $(echo $SecurityRules | jq -r '.[]'); do
aws ec2 revoke-security-group-ingress \
--group-id $SecurityGroupId \
--security-group-rule-ids $sgr
done
echo "Adding current source ip address..."
aws ec2 authorize-security-group-ingress \
--group-id $SecurityGroupId \
--protocol tcp \
--port 22 \
--cidr $GlobalIP/32
echo "After:"
aws ec2 describe-security-group-rules | \
jq --arg sgid $SecurityGroupId '[.SecurityGroupRules[] | select(.GroupId == $sgid and .IsEgress == false)]'
ちょっとつまったのはjqにシェル変数を渡す方法。上にあるようにjq --arg name $shell_valuable
とやると参照できるようになる。
結果
さーやろう!というときにSSHが繋がらなくて、いちいちWebコンソールに行ってポチポチやる..みたいに出鼻をくじかれることがないのはよい。CLIでやろうにもコマンド絶対すぐに忘れるし。今回JSONの加工はjqに頼り切っている。改めてさわるとjqってスゲーな[3]。なめてましたすいません。
Discussion