1ライナーでAWSアカウントにあるSecurityGroupをCSVで出力してみた

2017.07.07

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

サーモン大好き、横山です。

今回はシェル芸の小ネタと実例を紹介したいと思います。

環境

動作環境は以下です

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1510

$ python3 -V
Python 3.6.0

$ aws --version
aws-cli/1.11.117 Python/3.6.0 Darwin/15.6.0 botocore/1.5.80

標準出力をPythonの標準入力で受け取る

見出しが答えになっていますが、やり方は至って簡単 。
input() で受け取ります。

python2系の場合も、 input() -> raw_input() と読み替えれば概ね動きます。

コマンド

$ echo 'トリトン' | python3 -c'print("{}でサーモンが食べたい".format(input()))'
$ echo '花まる' | python3 -c'print("{}でサーモンが食べたい".format(input()))'
$ echo 'スシロー' | python3 -c'print("{}でサーモンが食べたい".format(input()))'

出力

トリトンでサーモンが食べたい
花まるでサーモンが食べたい
スシローでサーモンが食べたい

ね、簡単でしょ。

実例編

さて、コマンドラインから実施出来たということで、今度はawscliを使って、SecurityGroupのCSVを作成したいと思います。

コマンド

$ export AWS_DEFAULT_PROFILE=default
$ aws ec2 describe-security-groups | jq -c . | python3 -c"import json;print('\n'.join([','.join([_sg['GroupId'],_sg['GroupName'],_sg['VpcId'],ip_perm.get('IpProtocol',''),str(ip_perm.get('FromPort',-1)),str(ip_perm.get('ToPort',-1))]+[ip['CidrIp']for ip in ip_perm['IpRanges']]+[ip['CidrIpv6']for ip in ip_perm['Ipv6Ranges']]+[id_['PrefixListId']for id_ in ip_perm['PrefixListIds']])for _sg in json.loads(input())['SecurityGroups']for ip_perm in _sg['IpPermissions']]))"

出力

sg-0523xxxx,rds-launch-wizard,vpc-9ab5xxxx,tcp,3306,3306,x.x.x.x/32
sg-1e81xxxx,default,vpc-42f5xxxx,-1,-1,-1
sg-460dxxxx,launch-wizard-1,vpc-9ab5xxxx,tcp,22,22,x.x.x.x/32
sg-460dxxxx,launch-wizard-1,vpc-9ab5xxxx,tcp,3306,3306,x.x.x.x/32
sg-68e4xxxx,elb,vpc-9ab5xxxx,tcp,80,80,0.0.0.0/0
sg-68e4xxxx,elb,vpc-9ab5xxxx,tcp,8080,8080,0.0.0.0/0
sg-68e4xxxx,elb,vpc-9ab5xxxx,tcp,443,443,0.0.0.0/0
sg-cd80xxxx,default,vpc-9ab5xxxx,-1,-1,-1
sg-d34bxxxx,default,vpc-4f72xxxx,-1,-1,-1

分解してみた

python -c'' の中身を改行付で分解してくれた社内の人が居るのでそれをペタリ。ね、簡単でしょ?

import json;
print('\n'.join(
  [
    ','.join(
      [
        _sg['GroupId'], 
        _sg['GroupName'], 
        _sg['VpcId'],
        ip_perm.get('IpProtocol',''),
        str(ip_perm.get('FromPort',-1)),
        str(ip_perm.get('ToPort',-1))
      ] +
      [ ip['CidrIp'] for ip in ip_perm['IpRanges']
      ] + 
      [ ip['CidrIpv6'] for ip in ip_perm['Ipv6Ranges']
      ] + 
      [id_['PrefixListId'] for id_ in ip_perm['PrefixListIds']
      ])
      for _sg in json.loads(input())['SecurityGroups']
      for ip_perm in _sg['IpPermissions']
  ]
))

まとめ

ちょっと書き溜めてたスクリプトの1本を紹介してみました。
Linux/Unixコマンドでは痒いところで届かないけどawkを調べてゴニョゴニョしたくない時に、お世話になってます。

1ライナーで困った方の参考になれば幸いです。