【失敗談】パブリックに作成したAmazon Aurora Serverlessに接続出来なかった

AWS

2024.4.3

Topics

はじめに

検証環境にAurora Serverlessをパブリックに構築したが、接続することが出来なかった話です。

状況説明

Aurora Serverless の問い合わせ対応の一環にて、先輩社員から検証用にパブリックへこれを構築する指示がありました。
急ぎ、既に利用中のVPC内にAurora Serverlessを構築しました。

設定内容

構成は以下の通りです。
RDS用サブネットが1つだけパブリックになっています。
こちらはAurora Serverless起動中にサブネットの設定が誤っていることに気づきルートテーブルを変更したためです。
なぜ1つだけ変更して満足したかは謎です。

構成図

Aurora Serverless

Aurora Serverlessは以下の通り設定していました。

・エンジンタイプ:Aurora(PostgreSQL Compatible)
・インスタンスクラス:Serverless v2
・マルチAZ配置:別の AZ で Aurora レプリカ/リーダーノードを作成する (可用性のスケーリングに推奨)
・パブリックアクセス:あり

セキュリティグループ

Aurora Serverlessのセキュリティグループは以下の通り設定していました。

・ インバウンドルール
  ・ プロトコル:TCP
  ・ ポート範囲:5432
  ・ ソース:マイIP
・ アウトバンドルール
  ・ 設定なし

接続試行と問題解決

接続試行

接続確認はWindowsPCのローカル環境より実施しました。
Linuxでしか利用できないコマンドはwsl経由で実行しました。

リーダーインスタンスは接続できましたが、ライターインスタンスに接続できませんでした。

#リーダーインスタンス
C:\Users\reono\Documents\>psql -h  database-2-instance-1-ap-northeast-1a.<リーダーインスタンス>.ap-northeast-1.rds.amazonaws.com -U postgres 
Password for user postgres: 
psql (15.3, server 15.4)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

#ライターインスタンス
C:\Users\reono\Documents\>psql -h  database-2-instance-1-ap-northeast-1a.<ライターインスタンス>.ap-northeast-1.rds.amazonaws.com -U postgres
psql: error: connection to server at **** (*.*.*.*), port 5432 failed: Connection timed out (0x0000274C/10060)
        Is the server running on that host and accepting TCP/IP connections?

問題解決

ライターインスタンスに接続できるように調査を行いました。
以下ドキュメントに従い接続出来ない理由を調査しました。
Amazon RDS DB インスタンスに接続する際の問題を解決するにはどうすればよいですか?

nslookup

VPCの外側よりnslookupを実行したため、結果が変わらず原因を特定出来ませんでした。

#リーダーインスタンス
C:\Users\reono\Documents\>nslookup database-2-instance-1-ap-northeast-1a.<リーダーインスタンス>.ap-northeast-1.rds.amazonaws.com                
サーバー:  UnKnown
Address:  10.200.205.10

#ライターインスタンス
C:\Users\reono\Documents\>nslookup database-2-instance-1-ap-northeast-1a.<ライターインスタンス>.ap-northeast-1.rds.amazonaws.com                
サーバー:  UnKnown
Address:  10.200.205.10

nc

ライターインスタンスのみ接続が確認できませんでした。
VPCの設定を確認したところライターインスタンスのサブネットのルートテーブルがインターネットゲートウェイに繋がっていないことに気付きました。

#wslで実行
#リーダーインスタンス
reono:/mnt/c/Users$ nc -zv database-2-instance-1-ap-northeast-1a.<リーダーインスタンス>.ap-northeast-1.rds.amazonaws.com  5432
Connection to database-2-instance-1-ap-northeast-1a.<リーダーインスタンス>.ap-northeast-1.rds.amazonaws.com (*.*.*.*) 5432 port [tcp/postgresql] succeeded!
#ライターインスタンス
reono:/mnt/c/Users$ nc -zv database-2-instance-1-ap-northeast-1a.<ライターインスタンス>.ap-northeast-1.rds.amazonaws.com 5432
nc: connect to database-2-instance-1-ap-northeast-1a.<リーダーインスタンス>.ap-northeast-1.rds.amazonaws.com (*.*.*.*) port 5432 (tcp) failed: Connection timed out

パブリックサブネットへ変更

サブネットグループに含まれているサブネットを全てパブリックサブネットに変更することで接続が確認できました。

#ライターインスタンス
C:\Users\reono\Documents\>psql -h  database-2-instance-1-ap-northeast-1a.<ライターインスタンス>.ap-northeast-1.rds.amazonaws.com -U postgres
ユーザー postgres のパスワード:
psql (15.3、サーバー 15.4)
SSL接続(プロトコル: TLSv1.3、暗号化方式: TLS_AES_256_GCM_SHA384、圧縮: オフ)
"help"でヘルプを表示します。

結論

Aurora Serverlessを構築したサブネットグループはプライベートサブネットとパブリックサブネットが混在していました。
リーダーインスタンスは接続を行えました。
これは偶然パブリックサブネットに構築されていたためです。
Aurora Serverlessはリーダーとライターの構築されるサブネットを選択することは出来ません。
反対に、ライターインスタンスはプライベートサブネットに構築されていたため接続できませんでした。
そのため結論としては、サブネットグループのサブネットを全てパブリックにしていなかったことが原因でした。

対策

上記を踏まえて対策を考えることにしました。

サブネットグループをプライベートにしてしまった理由としては、2つあります。
・検証用に作成していたプライベートサブネットグループが残っていた。
・サブネットグループの設定項目を見落としていた。

普段はTerraformを利用し設定を確認したうえで構築していましたが、コンソールより作成したことでVPCの下にサブネットを選択する欄がないなと思いつつ構築していました。
VPCの設定の下にはサブネットの代わりにサブネットグループの設定欄があります。
サブネットグループはAuroraの作成画面からは直接作成出来ないのも見落としポイントだと思います。

反省を踏まえてやるべきだったことは2パターンあると思います。

パターン①

既存のプライベートサブネットグループに含まれているサブネットをパブリックサブネットに変更する。
パブリックに変更するため、IGWからの通信を受け入れる設定にする。

パターン②

パブリックでRDSを作成することを見据えて事前にパブリックサブネットをプライベートとは別に構築しておく。

検証環境であればパブリックのサブネットグループも事前に作成しておくのが対策として楽かと思いました。

まとめ

コンソールからの作業は簡単な分、見落としやすいことがあります。
次回同様の問題を避けるために、検証用の環境を整備しようと思いました。

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

reono

2022年4月、NHNテコラスに新卒入社。大学時代は山に登ったり、インドに行ったりしてました。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら