🙆♂️
AWS EC2 Instance ConnectのためのSG変更
前回からの反省点
以下の記事の続きとなります。
前回の記事で、以下リファレンスのIPアドレスが4,500個だっため流石におかしいと思い、調べたところ"Service":"EC2_INSTANCE_CONNECT"のIPのみを許可する必要があったみたいです。。。
フィルタかけてみたところ、20個だった(2021/4/4現在)ためそのIPアドレスのみ許可を追加するプログラムを作成してみました。
※本記事では、全てのリージョンのEC2インスタンスコネクト接続を想定しております。
EC2のリージョンを特定(例:東京リージョンのEC2インスタンスのインスタンスコネクト)する場合は、ip_ranges.jsonの"prefixes"の要素が、"service": "EC2_INSTANCE_CONNECT"かつ、"region"が特定のリージョンの要素を確認してください。
例(2021/4/4 現在):
東京リージョンのインスタンスにインスタンスコネクト接続したい。
ip_ranges.json(ファイルの中身はかなり割愛)
{
"syncToken": "1617407053",
"createDate": "2021-04-02-23-44-13",
"prefixes": [
{
"ip_prefix": "3.112.23.0/29",
"region": "ap-northeast-1",
"service": "EC2_INSTANCE_CONNECT",
"network_border_group": "ap-northeast-1"
},
]
}
と表記されているため、SSH 22 3.112.23.0/29で許可すれば済むと思います。
コード部分
instance_connect.py
import json
import sys
import boto3
def main(args):
# SGのIDとルールに追加する説明の情報取得
security_group_id = args[1]
description = args[2]
# boto3クライアントクラスを作成
client = boto3.client("ec2")
# ipリストのjsonファイルを読み取り操作
json_open = open("ip_ranges.jsonのファイルパス","r")
json_load = json.load(json_open)
# 対象のIPリスト取得,追加作業
instance_connect_ip_list = []
for ip_info in json_load["prefixes"]:
if ip_info["service"] == "EC2_INSTANCE_CONNECT":
instance_connect_ip_list.append(ip_info["ip_prefix"])
# SGのルール追加
for instance_connect_ip in instance_connect_ip_list:
add_rules = client.authorize_security_group_ingress(
GroupId = security_group_id,
IpPermissions=[
{
'FromPort': 22,
'IpProtocol': 'tcp',
'IpRanges': [
{
'CidrIp': instance_connect_ip,
'Description': description,
},
],
'ToPort': 22
}
]
)
if __name__ == '__main__':
args = sys.argv
main(args)
ip_ranges.jsonとは、以下リファレンスのAWSによって使用されているIPアドレス範囲のことを指します。
コピペでも、なんでもいいのでjsonファイルにしてもらって、Python実行環境に置いてもらって実行してください。
$ python3 instance_connect.py sgのid 追加するルールの説明
私の場合、既に対象のSGに2つのインバウンドルールが存在しているため22ですが、追加することができていることを確認できました!
接続確認
無事、接続することができました!
終わりに。
- ip_ranges.jsonってほんと便利だなって思いました☺️,EC2インスタンスコネクト以外のIPのあるので必要に応じて触ってみようと思います。
- それでは、良きEC2 Instance Connectライフを!!!!
Discussion