⌨️

今から始めるLambda⑥「LambdaからRDS(Aurora)に接続する 前編」

2021/10/28に公開

はじめに

前回の記事ではLambdaVPC内に配置する方法について紹介しました。

https://zenn.dev/nekoniki/articles/2318df67b6a02f

今回は同じVPC内にAWS RDSAuroraPostgreSQLのインスタンスを立ち上げ、Lambdaからクエリを実行していきます。

手順が長いので、今回は前後編に分けて紹介していこうと思います。
前編はVPC内にDBインスタンスを立ち上げて、テスト用のテーブルを作成するところまでです。

VPC内にPostgreSQLのインスタンスを用意する

まずは前回記事で立ち上げたVPC内にPostgreSQLインスタンスを立ち上げます。

AWS RDSとは

https://aws.amazon.com/jp/rds/

Amazon Relational Database Service (Amazon RDS) を使用すると、クラウド上のリレーショナルデータベースのセットアップ、オペレーション、スケールが簡単になります。ハードウェアのプロビジョニング、データベースのセットアップ、パッチ適用、バックアップなどの時間がかかる管理タスクを自動化しながら、コスト効率とサイズ変更可能なキャパシティーを提供します。これにより、アプリケーションに集中することができ、必要とされる高速なパフォーマンス、高可用性、セキュリティ、互換性をアプリケーションに実装できるようになります。

要するにRDBのインスタンスを立てることができます。
MySQLOracleなど主要なエンジンは網羅されていますが、今回はAuroraを使ってPostgreSQLのインスタンスを立てます。

Auroraとは

https://aws.amazon.com/jp/rds/aurora/?aurora-whats-new.sort-by=item.additionalFields.postDateTime&aurora-whats-new.sort-order=desc

Amazon Aurora は、MySQL および PostgreSQL と互換性のあるクラウド向けのリレーショナルデータベースであり、従来のエンタープライズデータベースのパフォーマンスと可用性に加え、オープンソースデータベースのシンプルさとコスト効率性も兼ね備えています。

RDSが対応しているエンジンのうち、MySQLPostgreSQLと互換性があります。
あくまで互換なので、最新バージョンの機能の追従などラグはありますが、こちらの方が高速なようです。

手順

以下、順を追って進めていきます。
前提としてVPCやサブネット、およびインターネットゲートウェイとの接続設定は済んでいるものとします。
※最終的にはVPCの中でLambdaAuroraの導通が取れればいいのですが、各種データ用意のためローカルから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つがあり、それぞれの対処法を簡単に残しておきます。

  1. "Cannot create a publicly accessible DBInstance. The specified VPC has no internet gateway attached.Update the VPC and then try again"
    文字通りインターネットゲートウェイがVPCに紐づけられていないことが原因のようです。
    コンソールから対象のVPCやサブネットのルートテーブルを確認し、インターネットゲートウェイがルートに記載されているか確認しましょう。

  2. "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のリージョンの中間証明書とルート証明書のバンドルが必要となるので、下記リンクからダウンロードしましょう。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.SSL.html

以降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内にAuroraDBインスタンスを立ち上げ、接続ができるところまでをまとめました。

Lambdaとの接続にあたっては、RDS Proxyを用いる必要があるため、次回はそのあたりから紹介していければと思います。

参考

https://aws.amazon.com/jp/blogs/news/using-iam-authentication-to-connect-with-pgadmin-amazon-aurora-postgresql-or-amazon-rds-for-postgresql/

https://dev.classmethod.jp/articles/developers-io-2019-in-osaka-aurora-or-rds/

https://dev.classmethod.jp/articles/rds-has-two-configs-concerning-availability-zone/

https://sebenkyo.com/2019/10/14/post-0-24/

Discussion