今から始める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