背景
RDSでAuroraDBを作ったが、そのDB操作をローカルから実行したい。でもDBは基本的にプライベートサブネットにあるからローカルと接続するにはそれ用の踏み台サーバー作らなきゃいけないか…
と、思っていたらつい最近EC2 Instance Connect Endpointっていうサービスが出たらしい。
現在EICEは22番ポートと3389ポートのみでしか利用できなくなりました。
AWSが想定した動作ではなかったようです。
EC2 Instance Connect Endpoint(EICE)とは
公式ではこう説明されている。
「EC2 Instance Connect Endpointを使用すると、インスタンスにパブリック IPv4 アドレスを持たせることなくインスタンスに接続できます。TCP をサポートする任意のインスタンスに接続できます。」
つまりEC2上のインスタンスへのアクセス用エンドポイントを簡単に設置できるようになった。
例えばプライベートなRDSをローカルから操作することもできる。しかも無料らしい。
やること
既存のRDS(Aurora)にEICEを設置してローカルからMySQL接続する。
EICE作成
セキュリティグループの設定
-
EICEのセキュリティグループを作成
-
RDSのセキュリティグループを編集
- インバウンドルール
- タイプ:「すべてのトラフィック」
- ソース:上記で作成したEICEのセキュリティグループ
- インバウンドルール
マネコン(VPC > エンドポイント)からエンドポイントを作成。
-
また、VPCはRDSなどの接続したいインスタンスがあるVPCと同じものにする。
-
Subnetはどれでもいい(プライベートでも大丈夫)
「作成」を押す
RDSに接続してMySQLに入る
以下のシェルスクリプトを作成
#!/bin/bash
##-----------------
## 接続情報
##-----------------
TARGET_EICE_ID="eice-xxxxxxxx" # EICEのID
AURORA_ENDPOINT="xxxx.cluster-xxxx.ap-northeast-1.rds.amazonaws.com" # RDSのエンドポイント
LOCAL_PORT="15432" # テキトーなローカルのポート
TARGET_PORT="3306" # RDSのポート
PROFILE="default" # プロファイル(特に変更がなければdefault)
##-----------------
## RDS接続
##-----------------
AURORA_IP=$(dig $AURORA_ENDPOINT +short | grep '^[0-9]' | head -n 1)
echo "RDSに接続します。"
str1="EICE ID : "
echo $str1$TARGET_EICE_ID
str2="AuroraDB endpoint : "
echo $str2$AURORA_IP
str3="Local port : "
echo $str3$LOCAL_PORT
str4="AuroraDB port : "
echo $str4$TARGET_PORT
str5="Profile : "
echo $str5$PROFILE
aws ec2-instance-connect open-tunnel \
--instance-connect-endpoint-id $TARGET_EICE_ID \
--private-ip-address $AURORA_IP \
--local-port $LOCAL_PORT \
--remote-port $TARGET_PORT \
--profile $PROFILE
./connect-db
を実行して
RDSに接続します。
EICE ID : eice-xxxxxxxx
AuroraDB endpoint : xx.x.xxx.xxx
Local port : 15432
AuroraDB port : 3306
Profile : default
Listening for connections on port 15432.
となれば接続成功。
あとは別ターミナルで
mysql -h 127.0.0.1 -P 15432 -u RDSユーザー名 -p
を実行してパスワードを入力したらMySQLに入れる。
まとめ
EC2 Instance Connect Endpoint ( EICE )を使えばローカルからインスタンスに接続できた。
踏み台サーバーやVPNのようなものを設置しなくてもいいのでかなり楽。
しかも無料。
参考資料