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