🙆‍♂️

AWS EC2 Instance ConnectのためのSG変更

2021/04/04に公開

前回からの反省点

以下の記事の続きとなります。
https://zenn.dev/stakakey/articles/f608fdf961349a
前回の記事で、以下リファレンスのIPアドレスが4,500個だっため流石におかしいと思い、調べたところ
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-connect-set-up.html#ec2-instance-connect-setup-security-group
https://ip-ranges.amazonaws.com/ip-ranges.json

"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アドレス範囲のことを指します。
https://ip-ranges.amazonaws.com/ip-ranges.json

コピペでも、なんでもいいのでjsonファイルにしてもらって、Python実行環境に置いてもらって実行してください。

$ python3 instance_connect.py sgのid 追加するルールの説明 

私の場合、既に対象のSGに2つのインバウンドルールが存在しているため22ですが、追加することができていることを確認できました!

接続確認

無事、接続することができました!

終わりに。

  • ip_ranges.jsonってほんと便利だなって思いました☺️,EC2インスタンスコネクト以外のIPのあるので必要に応じて触ってみようと思います。
  • それでは、良きEC2 Instance Connectライフを!!!!

Discussion