【AWS】PrivateIPしか持っていないDBにSQLを発行する
毎回やるのに忘れるのでTerraform化+備忘として書く。
やりたいこと
Private IPしか持っていないデータベース(Aurora)にPCから接続する
PCにインストールしたツールから、SQLを発行する
こんな感じ。PCから、踏み台経由でデータベースに接続します。
前提
PCはWindows11
SQLを発行するツールはA5:SQL Mk-2
以下がインストール済である
Git Bash
AWSのアクセスキー発行済で、aws configureはしてある
IAMユーザに、MFA必須のポリシーが割り当たっている
AuroraはPostgreSQL互換
検証用環境の作成
Terraformで構築。
リポジトリは↓。
https://github.com/jinka1997/connect-to-private-rdb/tree/main/aws
ポイントは以下の通り。
踏み台はプライベートサブネットに置く
踏み台にはキーペア不要
踏み台のインスタンスプロファイルに AmazonSSMManagedInstanceCore のポリシーを割り当てる
検証
トークンの取得
Git Bashで以下を実行します。
aws_account_id='999999999999' # AWSのアカウントID
iam_user='myIAMuser' # IAMユーザ名
mfa_token='999999' # MFAデバイスでから取得したトークン
mfa_device="arn:aws:iam::${aws_account_id}:mfa/${iam_user}"
cre=$(aws sts get-session-token --serial-number ${mfa_device} --token-code ${mfa_token})
export AWS_ACCESS_KEY_ID=$(echo $cre | jq -r '.Credentials.AccessKeyId')
export AWS_SECRET_ACCESS_KEY=$(echo $cre | jq -r '.Credentials.SecretAccessKey')
export AWS_SESSION_TOKEN=$(echo $cre | jq -r '.Credentials.SessionToken')
実行後。
接続確認のため、お約束の aws s3 ls を実行します。
バケットが羅列されればOK。
ポートフォワーディングコマンド実行
Git Bashで以下を実行します。
# 踏み台のインスタンス名
bastion_instance_name='xxxxxxxx'
# Auroraのクラスター識別子
aurora_cluster_identifier='xxxxxxxx'
# 踏み台のインスタンスID
bastion_instance_id=$(aws ec2 describe-instances --filters Name='tag:Name',Values=${bastion_instance_name} --query Reservations[0].Instances[0].InstanceId --output text)
# ローカルの15432を、サーバの5432に転送
param='{"host":["'
param+=$(aws rds describe-db-cluster-endpoints --db-cluster-identifier ${aurora_cluster_identifier} --filters "Name='db-cluster-endpoint-type',Values='writer'" --query DBClusterEndpoints[].Endpoint --output text)
param+='"],"portNumber":["5432"],"localPortNumber":["15432"]}'
aws ssm start-session --target ${bastion_instance_id} \
--document-name AWS-StartPortForwardingSessionToRemoteHost \
--parameters ${param}
実行結果。
「Waiting for connections...」が出ればOK。
A5Mk2から接続
データベース>データベースの追加と削除>追加>PostgreSQL(直接接続)で、登録画面を開く
以下の値を入力
サーバー名→ localhost
データベース名 → 作成時の値
ユーザーID → 作成時の値
パスワード → 作成時の値
ポート番号 → 15432
テスト接続を押して、接続に成功しました、と出れば入力値は問題なし。
OKを押し、データベース別名を設定したらさらにOK。
SQL発行
SELECT文を発行して、結果が返ってきました。OK。