はじめに
プライベートサブネット内にAurora PostgreSQLを作成した際に、プライベートな接続を保ちながらSQLコマンドを使えると何かと便利だと考えたため、踏み台EC2を用いて接続することにしました。
ただ、少々手順が複雑になってしまったため、忘備録の意味もかねてその手順を残します。
今回は、AWSを全く触ったことがない方向けに記述するつもりですので、少々説明が細かくなりすぎてしまうかもしれませんが、ご了承ください。
#接続全体イメージ
以下のような構成イメージで作成します。
パブリックサブネット内にEC2を作成してもよかったのですが、より堅牢な構成を目指すためにクライアントVPNエンドポイントをEC2の前に挟み、EC2をプライベートサブネット内に入れることにしました。
事前準備
アプリ
以下のアプリを今回は使用します。OpenVPN ベースのクライアントアプリケーションやターミナルエミュレーターがあればインストールは不要になります。
・AWS Client VPN( https://aws.amazon.com/jp/vpn/client-vpn-download/ )
・Teraterm( https://ja.osdn.net/projects/ttssh2/releases/ )
環境
Linuxコマンドが使えれば何でもよいですが、私は以下環境を用いました。
・Ubuntu 20.04.1 LTS
実施手順
- VPC・サブネット・セキュリティグループ・ルートテーブル作成
- 証明書作成・登録
- クライアントVPNエンドポイントの作成
- VPNへのテスト接続
- EC2作成
- インターネットゲートウェイ作成・紐づけ
- EC2内にPostgreSLQをインストール
- Aurora Postgres作成・接続
1. VPC・サブネット・セキュリティグループ・ルートテーブル作成
セキュリティ周りのVPCを作成していきます。RDSやEC2を作成する前に入れ物を正しく作っておき、外部からの不正なアクセスを防ぎます。
まずは任意のCIDRでVPCを作成しましょう。
先ほど作成したVPCに紐づく形でサブネットを作成していきましょう。Auroraに紐づく予定のサブネットを別々のアベイラビリティーゾーンで2個(※)、EC2に紐づく予定のサブネットを1個作成します。
(※ RDSに紐づくサブネットグループは、2か所以上のアベイラビリティゾーンにまたがっている必要があります。)
セキュリティグループはSSH接続を許すものとpsql接続を許すものをそれぞれ作成します。SSH接続、psql接続ができるようにインバウンドルールをそれぞれ設定します。
ルートテーブルはEC2用とAurora用をそれぞれ作りましょう。任意の名前で二つルートテーブルを作成したら、サブネット関連付けの編集でEC2用のサブネット、Aurora用の2つのサブネットと関連付けます。
2. 証明書作成・登録
クライアントVPNエンドポイントへの接続の認証は、今回は証明書による相互認証を用います。
まずは、証明書の作成をLinuxコマンドで行います。
# Open VPNソースのダウンロード、ディレクトリ移動
$ git clone https://github.com/OpenVPN/easy-rsa.git
$ cd easy-rsa/easyrsa3
# PKI環境の初期化
$ ./easyrsa init-pki
# 認証機関 (CA) を構築
# Common Nameは任意の名前を入力します。
$ ./easyrsa build-ca nopass
# サーバー証明書とキーを生成
$ ./easyrsa build-server-full server.domain.com nopass
# クライアント証明書とキーを生成
$ ./easyrsa build-client-full client1.domain.tld nopass
これで、サーバー証明書の作成が終わりました。
続いて、この証明書をACM(AWS Certificate Manager)にインポートします。AWS CLI(※)でインポートする場合は以下のコマンドを実行してください。
マネジメントコンソールから直接インポートすることも可能です。
※ AWS CLI 参考
インストール: https://qiita.com/SSMU3/items/ce6e291a653f76ddcf79
設定: https://qiita.com/SSMU3/items/ce6e291a653f76ddcf79
# サーバー証明書とキー、およびクライアント証明書とキーをcert_folderフォルダにコピーして移動
$ mkdir ~/cert_folder/
$ cp pki/ca.crt ~/cert_folder/
$ cp pki/issued/server.domain.com.crt ~/cert_folder/
$ cp pki/private/server.domain.com.key ~/cert_folder/
$ cp pki/issued/client1.domain.tld.crt ~/cert_folder
$ cp pki/private/client1.domain.tld.key ~/cert_folder/
$ cd ~/cert_folder/
# サーバー証明書とキーをインポート
$ aws acm import-certificate --certificate fileb://server.domain.com.crt --private-key fileb://server.domain.com.key --certificate-chain fileb://ca.crt --region ap-northeast-1
# クライアント証明書とキーをインポート
$ aws acm import-certificate --certificate fileb://client1.domain.tld.crt --private-key fileb://client1.domain.tld.key --certificate-chain fileb://ca.crt --region ap-northeast-1
3. クライアントVPNエンドポイントの作成
クライアントVPNエンドポイントを作成します。任意のCIDRを入力し、認証情報で相互認証の使用を選択します。
サーバー証明書 ARN・クライアント証明書 ARNは、先ほどACMに登録した証明書が選択できるためそれぞれ選択します。
作成したエンドポイントはVPNと関連付けなければ、VPNの中に入れません。VPN・サブネットとの関連付けを行います。サブネットはEC2用に作成したものに関連付けます。
VPNアクセスをクライアントに承認するために、受信の承認ルールを作成します。アクセスを有効にする送信先ネットに、接続するVPCのCIDR全体を指定し「すべてのユーザーにアクセスを許可する」を選択します。
4. VPNへのテスト接続
EC2を作成する前にクライアントVPNエンドポイントへの接続の設定を行います。まず、設定ファイルをダウンロードします。
続いて、ダウンロードした設定ファイルの末尾に、手順2で作成した証明書の内容を以下の通りに追記します。
<cert>
※client1.domain.tld.crt(-----BEGIN CERTIFICATE-----~-----END CERTIFICATE-----)の内容※
</cert>
<key>
※client1.domain.tld.key(-----BEGIN PRIVATE KEY-----~-----END PRIVATE KEY-----)の内容※
</key>
記入後の設定ファイルをプロファイルとしてアプリ:AWS VPN Client に登録します。
アプリを起動し、ファイル→プロファイルの管理→プロファイルの追加→VPN設定ファイルを選択し登録します。
成功していれば登録したプロファイルを使用し、下図のようにVPN接続ができるようになっているはずです。
5. EC2作成
次にEC2の作成を行います。今回は、Amazon Linux2の無料利用枠を使用していきます。
ステップ3:インスタンスの詳細の設定にて
ネットワーク: 作成したVPC
サブネット: EC2用に作成したサブネット
自動割り当てパブリックIP: 有効
をそれぞれ選択します。
ステップ6: セキュリティグループの設定ではEC2用に作成したセキュリティグループを選択します。
作成時、キーペアは必ずダウンロードし、大切に保存してください。
6. インターネットゲートウェイ作成・紐づけ
現状このような構成です。
このままではEC2内部Amazon linux2でSQLコマンドが使えません。つまり、EC2にPostgreSQLをインストールする必要があります。
そのために、一旦インターネットゲートウェイをEC2用のサブネットに紐づけ、EC2がPostgreSQLをダウンロード・インストールできるようにします。
VPCのメニューからインターネットゲートウェイを選択し、作成します。
作成したインターネットゲートウェイにVPCをアタッチします。
続いてEC2用に作成したルートテーブルのルートの編集からインターネットゲートウェイをターゲットに指定し追加します。
これで、EC2がインターネットにつながるようになりました。
7. EC2内にPostgreSLQをインストール
EC2に接続するためにAWS VPN Client を用いてクライアントVPNエンドポイントに接続しておきます。
Tera Teamを起動し、プライベートIPアドレスにSSH接続します。EC2のユーザー名を「ec2-user」、認証方式を「RSA/DSA/ECDSA/ED25519鍵を使う」にし、手順5、EC2作成時のキーペアを指定します。
無事にEC2が起動できると以下のような画面になります。
今回はPostgreSQL12をインストールします。2021年2月現在、Amazon Linux2は公式でPostgreSQL12をサポートしていません。そのため、PostgreSQLが提供するyumリポジトリをインストールする必要があります。インストール後、ファイルを書き換え、PostgreSLQ12をインストールします。
# PostgreSQL用yumのインストール
$ sudo rpm -ivh --nodeps https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
# 「/etc/yum.repos.d/pgdg-redhat-all.repo」ファイルの書き換え
$ sudo sed -i 's/\$releasever/7/g' /etc/yum.repos.d/pgdg-redhat-all.repo
# PostgreSQLのインストール
$ sudo yum install -y postgresql12 postgresql12-server
これにてインストールは完了です。
これからの作業は、インターネットにつなぐ必要がないため、ルートテーブルからインターネットゲートウェイを削除しましょう。
8. Aurora Postgres作成・接続
ではいよいよRDS Aurora PostgreSQL を作成していきましょう。
Amazon RDS のサブネットグループを選択し、 DB サブネットグループを作成を選択します。サブネットグループにはAurora用に作成したサブネット2個を追加します。
データベースを作成します。VPC、サブネットグループ、セキュリティグループはAurora用に作成したものを、パブリックアクセスは「なし」で作成してください。ほかの項目は任意に設定してください。
これで全ての手順は終了です。
作成したDBのエンドポイントを用いて、EC2からAuroraに接続してみましょう。
psql --host=<エンドポイント> --port=5432 --username=<ユーザー名> --password --dbname=<データベース名>
参考URL
以下サイトを参考にさせていただきました。ありがとうございました。
・AWSのEC2からRDSに接続してmySQLを操作。EC2踏み台サーバー構築メモ
https://photo-tea.com/p/aws-ec2-to-rds-connection/
・AWS Client VPNを試してみる
https://fu3ak1.hatenablog.com/entry/2020/08/12/145243
・[初心者向け]VPC作成からEC2インスタンス起動までを構成図見ながらやってみる(その1)
https://dev.classmethod.jp/articles/creation_vpc_ec2_for_beginner_1/
・ルートテーブルシナリオの実際の構築手順(AWSの設定編)
https://bcblog.sios.jp/construction-procedure-of-routetablescenario-aws/
・【Ansible】PostgreSQL 12をAmazon Linux 2にインストールし、Ansible Playbook化する【PostgreSQL】
https://qiita.com/tmiki/items/00d22edc6a554f61bd04
最後に
拙い文章ながらここまで読んでいただきありがとうございました。
何かご指摘があればご気軽にコメントください。