今から始めるLambda⑥「LambdaからRDS(Aurora)に接続する 前編」
はじめに
前回の記事ではLambdaをVPC内に配置する方法について紹介しました。
今回は同じVPC内にAWS RDSのAuroraでPostgreSQLのインスタンスを立ち上げ、Lambdaからクエリを実行していきます。
手順が長いので、今回は前後編に分けて紹介していこうと思います。
前編はVPC内にDBインスタンスを立ち上げて、テスト用のテーブルを作成するところまでです。
VPC内にPostgreSQLのインスタンスを用意する
まずは前回記事で立ち上げたVPC内にPostgreSQLインスタンスを立ち上げます。
AWS RDSとは
Amazon Relational Database Service (Amazon RDS) を使用すると、クラウド上のリレーショナルデータベースのセットアップ、オペレーション、スケールが簡単になります。ハードウェアのプロビジョニング、データベースのセットアップ、パッチ適用、バックアップなどの時間がかかる管理タスクを自動化しながら、コスト効率とサイズ変更可能なキャパシティーを提供します。これにより、アプリケーションに集中することができ、必要とされる高速なパフォーマンス、高可用性、セキュリティ、互換性をアプリケーションに実装できるようになります。
要するにRDBのインスタンスを立てることができます。
MySQLやOracleなど主要なエンジンは網羅されていますが、今回はAuroraを使ってPostgreSQLのインスタンスを立てます。
Auroraとは
Amazon Aurora は、MySQL および PostgreSQL と互換性のあるクラウド向けのリレーショナルデータベースであり、従来のエンタープライズデータベースのパフォーマンスと可用性に加え、オープンソースデータベースのシンプルさとコスト効率性も兼ね備えています。
RDSが対応しているエンジンのうち、MySQLとPostgreSQLと互換性があります。
あくまで互換なので、最新バージョンの機能の追従などラグはありますが、こちらの方が高速なようです。
手順
以下、順を追って進めていきます。
前提としてVPCやサブネット、およびインターネットゲートウェイとの接続設定は済んでいるものとします。
※最終的にはVPCの中でLambdaとAuroraの導通が取れればいいのですが、各種データ用意のためローカルからVPC内のAuroraにクエリを流す必要があります。
サブネットグループの作成
前回の記事で作成したVPCに紐づくセキュリティグループとサブネットを利用します。
それぞれのIDを確認しておきましょう。
## セキュリティグループの確認
aws ec2 describe-security-groups
## サブネットの確認
aws ec2 describe-subnets
その上でサブネットグループを作成します。
サブネットグループは文字通りサブネットをグルーピングしたもので、複数のAZのサブネットを指定する必要があります。
名称はtest-subnet-groupとします。
aws rds create-db-subnet-group \
--db-subnet-group-name test-subnet-group \
--db-subnet-group-description "Testing" \
--subnet-ids '["【SUBNET_ID_1】","【SUBNET_ID_2】"]'
DBクラスタの作成
続いてDBクラスタの作成を行います。
DBクラスタはAuroraのインスタンス群を包括するコンポーネントです。
参考:20190828 AWS Black Belt Online Seminar Amazon Aurora with PostgreSQL Compatibility
Auroraはインスタンスとストレージが分離しており、インスタンスは任意の数、ストレージは3AZに2個ずつ存在します。
ストレージが分散しているので、互いにコピーし合い、有事の際の修復が容易になるという仕組みです。
※インスタンス自体も冗長化しておくケースが多いようですが、今回は簡単のため単一インスタンスとしています。
以下コマンドでDBクラスタを作成します。
名前はtest-aurora-postgresql-clusterとします
先ほど確認したセキュリティグループのIDや、サブネットのAZを指定しましょう。
マスタユーザとしてpostgresを指定しておきます。
aws rds create-db-cluster \
--db-cluster-identifier test-aurora-postgresql-cluster \
--engine aurora-postgresql \
--engine-version 11.9 \
--master-username postgres \
--master-user-password postgres \
--db-subnet-group-name test-subnet-group \
--vpc-security-group-ids 【SECURITY_GROUP_ID】 \
--availability-zones "【AZ_1】" "【AZ_2】" \
--database-name postgres
この時のレスポンスの中でEndpointの値は後ほどDBに接続する際に必要となるので控えておきましょう。
DBインスタンスの作成
続いてDBクラスタの中にインスタンスを作成します。
AZにはクラスタで指定したもののどちらかを指定します。
名前はtest-aurora-postgresql-instanceとします。
※もし複数インスタンス構成(AWSでは一般に主系をプライマリ、副系をレプリカと表現するようです)とする場合は同じコマンドをAZを変えて実行します。
aws rds create-db-instance \
--db-instance-identifier test-aurora-postgresql-instance \
--db-instance-class db.t3.small \
--engine aurora-postgresql \
--engine-version 11.9 \
--availability-zone "【AZ_1】" \
--publicly-accessible \
--db-cluster-identifier test-aurora-postgresql-cluster
ここでエラーになる場合
ここでエラーになるパターンがいくつかあるようです。
自分が調べた限りでは以下の2つがあり、それぞれの対処法を簡単に残しておきます。
-
"Cannot create a publicly accessible DBInstance. The specified VPC has no internet gateway attached.Update the VPC and then try again"
文字通りインターネットゲートウェイがVPCに紐づけられていないことが原因のようです。
コンソールから対象のVPCやサブネットのルートテーブルを確認し、インターネットゲートウェイがルートに記載されているか確認しましょう。 -
"Cannot create a publicly accessible DBInstance. The specified VPC does not support DNS resolution, DNS hostnames, or both. Update the VPC and then try again"
同じくVPCに関わるエラーで、DNSホスト名が有効になっていない場合に起きるようです。上記の項目をコンソールから確認しましょう。
作成したインスタンスに接続する
作成したインスタンスに接続し、クエリが実行できるかを確認します。
接続はDBクラスタに対して行います。
先ほど控えておいたEndpointは何回か使うので変数にセットしておきましょう。
export RDSHOST="【ENDPOINT】"
また、接続にあたってはSSLを使用します。
それに際してAWSのリージョンの中間証明書とルート証明書のバンドルが必要となるので、下記リンクからダウンロードしましょう。
以降psqlコマンドを打つディレクトリのルートにダウンロードした証明書(今回はリージョンがus-east-2だったのでus-east-2-bundle.pem)が配置されているものとします。
クラスタ作成時に指定したpostgresユーザで接続します。
psql "host=$RDSHOST port=5432 sslmode=verify-full sslrootcert=./us-east-2-bundle.pem dbname=postgres user=postgres password=postgres"
問題なく接続できたら、後でLambdaから取得するモックデータ用のテーブルと、データを作成しておきましょう。
CREATE TABLE task (id int, name varchar(10));
INSERT INTO task (id, name) values (0, 'task1');
INSERT INTO task (id, name) values (1, 'task2');
まとめ
今回はVPC内にAuroraのDBインスタンスを立ち上げ、接続ができるところまでをまとめました。
Lambdaとの接続にあたっては、RDS Proxyを用いる必要があるため、次回はそのあたりから紹介していければと思います。
参考
Discussion