見出し画像

【AWS】PrivateIPしか持っていないDBにSQLを発行する

毎回やるのに忘れるのでTerraform化+備忘として書く。

やりたいこと

  • Private IPしか持っていないデータベース(Aurora)にPCから接続する

  • PCにインストールしたツールから、SQLを発行する

こんな感じ。PCから、踏み台経由でデータベースに接続します。

前提

検証用環境の作成

Terraformで構築。
リポジトリは↓。
https://github.com/jinka1997/connect-to-private-rdb/tree/main/aws

ポイントは以下の通り。


検証

トークンの取得

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。


いいなと思ったら応援しよう!