🤦♂️
【失敗談】EC2 Instance ConnectのためのSG変更
前置き
- EC2インスタンスを作成して、セキュリティグループのインバウンドを現在使用しているIPのみに絞ってterminalから接続していました。
- しかし、EC2 Instance Connectのブラウザベースで接続を試みたところ以下のエラーが起こったため、仕方なくセキュリティグループのルールを変更することを検討しました。
- 「セッションマネージャー使えよ。」っていう話ですが、そこは取り敢えず置いときましょう。
EC2 Instance Connectとは
- ブラウザ上でEC2インスタンスを接続できるサービス。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Connect-using-EC2-Instance-Connect.html - ブラウザベースで接続するには以下のIPアドレスを許可する必要がある?
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
IPv4アドレスだけでも4,500個あるってビビりましたね。
→EC2 Intance Connectは20個でした。(2020/4/4現在)
どうにかしてそのIPのみを許可したいと思い以下の奇行に走りました。
Python(SDK)を使用したSGの変更
以下のファイルのようにPython(SDK:boto3)を使用してセキュリティグループのインバウンドを変更しようとしました。
import json
import sys
import boto3
def main(args):
security_group_id = args[1]
description = args[2]
client = boto3.client("ec2")
json_open = open("ip_range.json","r")
json_load = json.load(json_open)
ipv4_list = [i.get("ip_prefix") for i in json_load["prefixes"]]
ipv6_list = [i.get("ipv6_prefix") for i in json_load["ipv6_prefixes"]]
for i in ipv4_list:
authorize_ssh = client.authorize_security_group_ingress(
GroupId = security_group_id,
IpPermissions=[
{
'FromPort': 22,
'IpProtocol': 'tcp',
'IpRanges': [
{
'CidrIp': i,
'Description': description,
},
],
'ToPort': 22
},
]
)
if __name__ == '__main__':
args = sys.argv
main(args)
ざっくりいうと、ip_range.jsonには先程のjsonをコピペして作りました。
PythonファイルにsgのIDとsgの説明を渡して、boto3で対象のsgに対して、IPリストに従い、22番ポートの許可を追加していくみたいな感じです。
すると以下のエラーが出力されました。
botocore.exceptions.ClientError: An error occurred (RulesPerSecurityGroupLimitExceeded) when calling the AuthorizeSecurityGroupIngress operation: The maximum number of rules per security group has been reached.
お気づきでしょうか。そうです、SGのルール数の上限を突破してしました。
リファレンスによるとルールはインバウンド、アウトバウンド共に60ずつまでしか登録できませんでした。
完全に盲点でした。。。
解決策がわからないので、この記事見ていただいた方でご存知でしたら、ご教授いただけると助かります。
失敗から学んだこと
- セキュリティグループの上限は、60ルールまでしか登録できませんので注意しましょう!
- セッションマネージャーを使ってみましょう!
AWS初心者の記事ですが、読んでいただきありがとうございました🙇♂️
【追記】 EC2インスタンスコネクトのIPアドレス制御に成功した話
以下記事にて本記事の続編を記載しています。
実際に、機能実装したい方はこちらをお手数ですがお読みいただければと思います。
Discussion