AWSのSecurityGroup関連の調査・更新CLIメモ

こんにちは。小宮です。

今回ご紹介するのはpiculetでgroupファイルでルール更新というのではありません。 ちょっと整理とか削除とかしたいけど手でポチぽちするには量が多いしオペミスが心配だし手間だし早く帰りたいので どれに紐づいてるのか一括で調べたい一括更新したいといった時にforループとCLIでなんとかする方法です。 SecurityGroupの上限緩和申請の際にSGの書き方的に通信パフォーマンスがアレで引っ掛かった時等にこんなような作業が必要に。

あんまり使いこなせてるほうでもないのですが、一応載せておきます。ご利用は自己責任でお願いします。 みなさま似たようなことしててもっと洗練されたやり方をご存知の方も沢山いそうです。 弊社だと稲田さんほか協力部隊の方々がもっと詳しそうな気がします。マサカリ歓迎いたします。 稲田さんに聞いたらもっとoutputはtextにしてjoinを使いこなせと言っていたのでそのうち何か書いてくれると思います。

SecurityGroupのidから紐づくインスタンス情報を得る

これは既存の情報を得るだけで更新しないので気軽に実行できると思います。 まずリストを作る(消したいSGをいれる)

vi listfile
sg-xxxxxxxx,SG_hoge_dev1
sg-yyyyyyyy,SG_fuga_dev2
...

list=listfile
profile=xxxx

リストを読み込んでdescribe-instancesを実行

for i in `cat $list|grep -v elb`
do
groupid=`echo $i |awk -F, '{print $1}'`
groupname=`echo $i |awk -F, '{print $2}'`
echo $i
aws ec2 describe-instances --profile ${profile} --filters Name=instance.group-id,Values=$groupid --output text \
--query 'Reservations[].Instances[*].[InstanceId,PrivateIpAddress,Tags[?Key==`Name`].Value[]]' --output json \
|sed -e '/\]/d' -e '/\[/d' -e '/^$/d' -e 's/ //g'|perl -pe 's/,[ ]*\n/,/g'|sort -t , -k 3
echo ""
done

出てきた結果からlistfileをつくりSGはずしたり替えたりするときにつかいます。

SecurityGroupのidから紐づくELB情報を得る
for i in `cat $list`
do
groupid=`echo $i |awk -F, '{print $1}'`
groupname=`echo $i |awk -F, '{print $2}'`
echo $i
aws elb describe-load-balancers --profile ${profile} \
--query 'LoadBalancerDescriptions[*].[LoadBalancerName,SecurityGroups]' --output=json \
|sed -e 's/\[//g' -e 's/\],//g' -e 's/\]//g' -e 's/ //g'|perl -pe "s/,\n/,/g" \
|sed -e '/^$/d'|perl -pe 's/,\n/,/g'|grep $groupid
echo ""
done

出てきた結果からlistfileをつくりSGはずしたり替えたりするときにつかいます。

インスタンスのSecurityGroupを特定のSecurityGroupに変える

こちら以降は更新されるのでご利用は自己責任でお願いします。

list=xxxxx

for i in `cat $list|grep -v xxxxx`
do
instanceid=`echo $i|awk -F, '{print $1}'|sed -e 's/"//g'`
attached_groups=`aws ec2 describe-instance-attribute --instance-id ${instanceid} --attribute groupSet --profile ${profile} --output=text|grep GROUPS|awk '{print $2}'|perl -pe 's/\n/ /g'`
add_groupid="sg-xxxxxxxx"
groupids=`echo ${add_groupid}`
echo $i
echo "curgroupids: ${attached_groups}"
echo "newgroupids: ${groupids}"
aws ec2 modify-instance-attribute --instance-id ${instanceid} --groups ${groupids} --profile ${profile} --no-dry-run
echo "result:"
aws ec2 describe-instance-attribute --instance-id ${instanceid} --attribute groupSet --profile ${profile} --output=text|grep GROUPS|awk '{print $2}'
echo ""
done

※現状だけ調べたい場合は、modify-instance-attributeの行を外して実行してください。リテラルの文字列は適宜変えてください。

インスタンスのSecurityGroupから特定のSecurityGroupをはずす
for i in `cat $list|grep xxxxxxx`
do
instanceid=`echo $i|awk -F, '{print $1}'|sed -e 's/"//g'`
attached_groups=`aws ec2 describe-instance-attribute --instance-id ${instanceid} --attribute groupSet --profile ${profile} --output=text|grep GROUPS|awk '{print $2}'|perl -pe 's/\n/ /g'`
groupids=`echo ${attached_groups}|sed -e 's/sg-aaaaaaaa//g'|tr -s ' '`
echo $i
echo "curgroupids: ${attached_groups}"
echo "newgroupids: ${groupids}"
aws ec2 modify-instance-attribute --instance-id ${instanceid} --groups ${groupids} --profile ${profile} --no-dry-run
echo "result:"
aws ec2 describe-instance-attribute --instance-id ${instanceid} --attribute groupSet --profile ${profile} --output=text|grep GROUPS|awk '{print $2}'
echo ""
done

※現状だけ調べたい場合は、modify-instance-attributeの行を外して実行してください。リテラルの文字列は適宜変えてください。

ELBのSecurityGroupを特定のSecurityGroupに変える
for i in `cat $list|grep ELB`
do
elbname=`echo $i|awk -F, '{print $1}'|sed -e 's/"//g'`
add_groupid="sg-bbbbbbbb"
echo $elbname
current_groups=`aws elb describe-load-balancers --profile ${profile} --load-balancer-names ${elbname} --query 'LoadBalancerDescriptions[*].[LoadBalancerName,SecurityGroups]' --output=text|grep sg-|sed -e 's/\t/ /'`
newgroupids=`echo ${add_groupid}`
echo "curgroupid: ${current_groups}"
echo "newgroupid: ${newgroupids}"
aws elb apply-security-groups-to-load-balancer --load-balancer-name ${elbname} --security-groups ${newgroupids} --profile ${profile}
echo "result:"
aws elb describe-load-balancers --profile ${profile} --load-balancer-names ${elbname} --query 'LoadBalancerDescriptions[*].[LoadBalancerName,SecurityGroups]' --output=text|grep sg-
echo ""
done

※現状だけ調べたい場合は、apply-security-groups-to-load-balancerの行を外して実行してください。リテラルの文字列は適宜変えてください。

ELBのSecurityGroupから特定のSecurityGroupをはずす
for i in `cat $list|grep ELB`
do
elbname=`echo $i|awk -F, '{print $1}'|sed -e 's/"//g'`
echo $elbname
current_groups=`aws elb describe-load-balancers --profile ${profile} --load-balancer-names ${elbname} --query 'LoadBalancerDescriptions[*].[LoadBalancerName,SecurityGroups]' --output=text|grep sg-|sed -e 's/\t/ /'`
newgroupids=`echo ${current_groups}|sed -e 's/sg-cccccccc//g'|tr -s ' '`
echo "curgroupid: ${current_groups}"
echo "newgroupid: ${newgroupids}"
aws elb apply-security-groups-to-load-balancer --load-balancer-name ${elbname} --security-groups ${newgroupids} --profile ${profile}
echo "result:"
aws elb describe-load-balancers --profile ${profile} --load-balancer-names ${elbname} --query 'LoadBalancerDescriptions[*].[LoadBalancerName,SecurityGroups]' --output=text|grep sg-
echo ""
done

※現状だけ調べたい場合は、apply-security-groups-to-load-balancerの行を外して実行してください。リテラルの文字列は適宜変えてください。 意味不なところはhelpやmanみたり分かるところまでパイプでつなげて渡してるところを削っていって実行結果みていただけるとよいかと思います。 aws elb describe-load-balancers helpとか打つとマニュアルが表示されます。

ではみていただいてありがとうございました。