Private endpoint を利用して Timestream に接続するときの罠
Solution Architect の t_maru です。
今回は Timestream に VPC の Private subnet に配置されたアプリケーションから接続する際の注意事項についてご紹介します。
Timestream とは?
Amazon Timestream (以降 Timestream と省略) とは時系列データの扱いに特化した AWS Managed の DB サービスです。
Timestream は VPC '外' に設置される DB となり、インフラは AWS が管理してくれるのでユーザーとしては Database と Table を作成するだけで使用を開始することができます。
Timestream の詳細については下記の公式ドキュメントを参照ください。(Developer guide は 2024/9 時点で日本語化されておりませんでしたのでサービス概要ページのリンクです)
https://aws.amazon.com/jp/timestream/
Timestream へ VPC の private subnet から接続するときの注意点
先程も紹介した通り、Timestream は VPC '外' に設置されるサービスですので VPC の Private subnet に設置されたアプリケーションからはそのままでは Network 的に到達できないため、以下のような接続パターンが考えられます。
NAT Gateway を Public subnet に配置して NAT Gateway 経由で Timestream に接続
VPC endpoint を作成して Timestream に接続
NAT Gateway を設定する場合は Route Table に NAT Gateway 向きの通信経路を定義するだけで済むので作業が楽ではありますが、NAT Gateway は処理したデータ量に応じて料金が発生するサービスですので、VPC endpoint に対応しているサービスの場合は VPC endpoint 経由でのアクセスを選択するほうが良さそうです。
Timestream も幸い VPC endpoint に対応しているため以下の設定で endpoint を作成して Query の実行を試みようとしたのですがうまくいきませんでした。
Timestream の query endpoint を選択 (`com.amazonaws.<region>.timestream.query-cell1` を選択)
Private DNS を true で設定 (設定される DNS name: `query-cell1.timestream.<region>.amazonaws.com`)
Security Group でアプリケーションからの HTTPS 通信を許可する
※ `query-cell1` の部分は region により異なる可能性があります。AWS CLI にて `aws timestream-query describe-endpoints` コマンドを実行すると対応するリージョンで使用可能なエンドポイントを一覧表示できるようですので、使う前に確認いただければと思います。
状況としてはリクエストを送れどなんの反応もなく、という状況で Network 的にアクセスができない場合の挙動が確認されました。
この事象は実際に開発しているシステムの構築中に遭遇したのですが、EC2 を立てて AWS CLI で Timestream の Query 実行をする際にも同様の事象を確認できたので AWS CLI に `--debug` オプションを付けて動作を確認してみました。
以下が debug オプションを付けて確認した際に表示されたログの一部です。
このログが出た後反応がなく、しばらくすると timeout エラーになります。
MainThread - urllib3.connectionpool - DEBUG - Starting new HTTPS connection (1): query.timestream.us-west-2.amazonaws.com:443
※ 今回は us-west-2 で動作確認をしました
接続しようとしている先は、どうやら `query.timestream.us-west-2.amazonaws.com` のようです。
ここで、先程の設定で作成した VPC endpoint の Private DNS name を見てみると `query-cell1.timestream.us-west-2.amazonaws.com` という値が表示されておりましたので、ここまでを整理すると、この事象が発生した要因は
Timestream の場合は VPC endpoint で設定される Private DNS name が '<service-name>.<region>.amazonaws.com' の形式になっておらず、Private subnet から Timestream の query endpoint の名前解決ができていなかったから
ということでした。
原因がわかれば解決策も探すことができ、この問題は簡単に解決することができます。
AWS CLI の場合には `--endpoint-url` という option が存在するので、以下のようにコマンドを書くことで Timestream へ query を実行することが可能です。
# 今回は us-west-2 で動作確認をしました
aws timestream-query query --query-string <Query の文字列> --endpoint-url https://query-cell1.timestream.us-west-2.amazonaws.com
endpoint-url で指定する値は、作成した VPC endpoint の `Private DNS names` に記載されている値を参考に設定いただければと思います。
AWS CLI のコマンドの詳細は下記を参照ください
https://docs.aws.amazon.com/cli/latest/reference/timestream-query/query.html
この事象をに遭遇していたときに開発していたアプリケーションは Node.js と AWS JavaScript SDK v3 を使っておりましたが、こちらも以下のように endpoint を直接指定することができますので、Private subnet から VPC endpoint 経由で Timestream に接続する際は参考にしていただければと思います。
import { TimestreamQueryClient } from '@aws-sdk/client-timestream-query';
// 実際には環境変数などに設定すると使い勝手が良いと思います
const endpoint = 'https://<VPC endpoint の Private DNS name>';
const queryClient = new TimestreamQueryClient({ endpoint });
※ 上記は TypeScript での表記例です
まとめ
今回は Timestream の VPC endpoint を使う際の注意点についてご紹介しました。
VPC endpoint を設定する際に、`Enable DNS name` のオプションを on に設定し忘れるということも時々ありますが、今回のケースはこのオプションが on になっていても発生するものになりますので、Private subnet から Timestream を使用する際には client 側で endpoint 指定して使っていただければうまく接続できると思います。
他の AWS サービスの Private endpoint の URL については調査しておりませんが、今回の Timestream の endpoint のように特殊な形式になる場合は今回と同様の接続エラーに遭遇することになると思いますのでそういった場合も参考にしていただければと思います。