VPC内のDBアクセスするため踏み台(BASTION)サーバをawscliで用意


こちらの資料を参考しながらこの手順を用意しました。
https://docs.aws.amazon.com/quickstart/latest/linux-bastion/

  1. keypair 用意

    ないなら、EC2へアクセスできるようにKeyPairを作成します。

    aws ec2 create-key-pair --key-name bastion-keypair --region ap-northeast-1
    

    ローカルでPrivate Key bastion.pemを用意

    vi ~/.ssh/bastion.pem
    {上記で出力されたPRIVATE KEY情報をファイルに書き込む}
    
    # ファイル権限更新
    sudo chmod 400 ~/.ssh/bastion.pem
    
  2. Bastion用のSecurity Groupを作成

    # Create security group
    aws ec2 create-security-group --group-name bastion-sg --vpc-id {使用するVPCID} --description "security group for basition instance(s) for acting as a intermediate jump of point for rds acccess"
    

    注意:CIDRを適切なIPで絞るべき

  3. SSHアクセスを許可

    # Add authorization for ssh(port 22) to ingress
    aws ec2 authorize-security-group-ingress \
    --group-id $(aws ec2 describe-security-groups --query 'SecurityGroups[?GroupName==`bastion-sg`].GroupId' --output text) \
    --protocol tcp \
    --port 22 \
    --cidr "0.0.0.0/0"
    
  4. 現状のRDS Security Groupとの通信を許可

    export EXISTING_RDS_SECURITY_GROUPID={RDS Security Group ID }
    aws ec2 authorize-security-group-ingress --group-id ${EXISTING_RDS_SECURITY_GROUPID} \
    --protocol tcp \
    --port 5432 \
    --cidr "0.0.0.0/0" \
    --source-group $(aws ec2 describe-security-groups --query 'SecurityGroups[?starts_with(GroupName, `bastion-sg`)].GroupId' --output text)
    
  5. 踏み台用のEC2を作成

    ami-0f63c02167ca94956: Ubuntu 18.04 LTS

    aws ec2 run-instances --image-id ami-0f63c02167ca94956 --count 1 --instance-type t2.micro --key-name bastion-keypair --security-group-ids $(aws ec2 describe-security-groups --query 'SecurityGroups[?starts_with(GroupName, `bastion-sg`)].GroupId' --output text) --subnet-id {PUBLIC SUBNET ID} --associate-public-ip-address
    
    # 出たインスタンスIDを使って、用意されるまで待つ
    aws ec2 wait instance-status-ok --instance-ids {INSTANCE ID}
    
  6. SSHで踏み台(BASTION)サーバへアクセスして、DBに接続します。

    # IPを取得
    aws ec2 describe-instances --instance-id {INSTANCE_ID}  --query "Reservations[*].Instances[*].PublicIpAddress"   --output=text
    
    ssh -i ~/.ssh/bastion.pem ubuntu@{IP ADDRESS}
    

    SSHで踏み台(BASTION)サーバにインストールしたいライブラリー・ツール

    # Pythonツール系インストールできるように準備
    sudo apt update
    sudo apt install python3-distutils
    curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
    sudo python3 get-pip.py 
    sudo apt install build-essential
    
    # python headersを取得(パッケージをビルド時に使用される)
    sudo apt install python3-dev
    
    # DBへ接続確認ために
    sudo python3 -m pip install pgcli
    

SSH Tunnelにより、同じPCにDBがあるように接続する

  1. 自分のPCからTunnel貼る:

    postgresqlを使用例

    # LOCAL_PORT:REMOTE_ADDRESS:REMOTE_PORT
    ssh -nNT -L 5432:{VPC内のRDSIPADDRESS}:5432 -i ~/.ssh/bastion.pem ubuntu@{IP ADDRESS} &
    
  2. 自分のPCからDBにへ接続:

    pgcli postgresに接続できる簡易CLI

    pgcli -h 127.0.0.1 -p 5433 -d annotation_tool -U readonly -W