boto3を使用してセキュリティグループのインバウンドルールを編集するpythonファイルを作ってみた

2020.06.03

こんにちは。DA事業本部の下地です。

最近セキュリティグループ(sg)のインバウンドルールへの追加や削除を行う機会が増えてきましたので、コマンドライン引数で必要な情報を渡してインバウンドルールの編集を行うpythonファイルを作りたいと思います。

環境

実行環境は下記のようになります。

  • MacOS: Catalina 10.15.4
  • Python: 3.7.0
  • Boto3: 1.12.33

インバウンドルールの追加と削除

sgのインバウンドの追加と削除にはAWS SDK for Python (boto3)を使用します。boto3には“Client API” と “Resource API”の2種類が用意されています。違いについては弊社ブログにて(AWS SDK for Python (Boto3) の “Client API” と “Resource API” の違いについて調べてみた)まとめられておりますので興味のある方は合わせてお読みください。

コマンドライン引数の取得

pythonプログラム実行時に引数を渡すことができます。確認のため以下の内容でget_argument.pyを作成します。

import sys

args = sys.argv
print(args[0])
print(args[1])
print(args[2])
print(args[3])

実行時に3つの引数を入力します。

$ python get_argument.py 22 0.0.0.0/0 description
get_argument.py
22
0.0.0.0/0
description

args[0]には実行したファイル名が入るので、入力した引数はargs[1]~args[3]で取得することができそうです。

インバウンドルール編集を行うファイルの作成

では、インバウンドルールの追加・削除を行うedit_security_group.pyファイルを作成します。実行時に、ポート、CidrIp、詳細の3つを引数に受け取り処理します。

受け取ったポート番号とCidrIpを用いて、同一のインバウンドルールがないか確認し存在したら削除、存在しない場合は追加を行います。

import sys
from boto3.session import Session

security_id = 'sg-*****************'
profile_name = "****"

def main(args):
    session = Session(profile_name=profile_name)
    client = session.client("ec2")

    try:
        port = int(args[1])
        cidr_ip = args[2]
        description = args[3]
        
        #sgの詳細情報を取得
        status = client.describe_security_groups(GroupIds=[security_id,])

        #同一インバウンドルールの確認
        flg = [1 for sg in status['SecurityGroups'][0]['IpPermissions'] if sg['FromPort'] == port and sg['IpRanges'][0]['CidrIp'] == cidr_ip]

        #同一インバウンドルールがある場合は削除、ない場合は追加処理を行う
        if flg:
            print("deleted inbound rules")
            delete_ingress = client.revoke_security_group_ingress(
                CidrIp=cidr_ip,
                FromPort=port,
                GroupId=security_id,
                IpProtocol='TCP',
                ToPort=port,
                )
        else:
            print("added inbound rules")
            authorize_ssh = client.authorize_security_group_ingress(
                GroupId=security_id,
                IpPermissions=[
                    {
                        'FromPort': port,
                        'IpProtocol': 'tcp',
                        'IpRanges': [
                            {
                                'CidrIp': cidr_ip,
                                'Description': description,
                            },
                        ],
                        'ToPort': port,
                    },
                ],
            )
    except Exception as e:
        print("error")
        print(e)
        raise e

if __name__ == '__main__':
    args = sys.argv
    main(args)

追加と削除の確認

スクリプトが作成できましたので実装します。

実行前はインバウンドルールは設定されておりません。

では追加します。

$ python edit_security_group.py 22 0.0.0.0/0 set_from_boto3
added inbound rules
$ python edit_security_group.py 3389 0.0.0.0/0 set_from_boto3
added inbound rules

コンソール画面から追加されていることを確認しました。

では次に同一のインバウンドルールがある場合は削除されるか確認します。

$ python edit_security_group.py 3389 0.0.0.0/0 set_from_boto3
deleted inbound rules

コンソール画面を見ると削除されていることがわかりました。

まとめ

pythonファイル実行時にコマンドライン引数を与えることで、sgのインバウンドルールの追加・削除ができるようになりました。コンソール画面にいかずとも処理できるのは便利だなと実感しました。この記事がどなたかの助けになれば幸いです。

参考URL