はじめに
Lambda(Go)をServerlessFrameworkでデプロイして、次にAuroraを利用してデータ取得をしようとしたとき色々知識がなかったので苦戦しました
そこで、知識面で参考になりそうなことをまとめていきます
なぜDataAPIかRDSProxyが必要なのか
まず最初に思ったのはなぜDataAPIまたはRDSProxyを経由してDBにアクセスしないといけないのかというのでした
Auroraにはエンドポイントがあるのでそれで直接アクセスでよいのではと考えました
しかし、Lambdaからやる場合は直接ではなく、どちらかを仲介したほうが良いです。
使う理由は「DBへの接続数が多くなってしまうのを防ぐため」です。接続プーリングをうまいことやってくれるようでした
2つの違い
Q. RDS Proxy と DataAPIの違いは何でしょうか?
A. RDS Proxy はデータベースへの接続をプールすることでバックエンドのRDSの負荷を軽減しつつ、コネクション作成のコストを軽減します。Data API はデータベースのコネクションではなくAPIを利用してクエリを実行できる機能です。
このように公式では説明があります
DataAPIのメリット/デメリット
DataAPIは基本的にお金がかからないはずです
デメリットとしてはベータ版なのでまだ記事も少ないです
VPC内に置く場合はインターネット接続が必要なのでNATの用意が必要です
今回Goの接続は以下を参考にしました
conf := &rds.Config{
ResourceArn: "DBクラスターのリソースARN",
SecretArn: "DBを紐づけたシークレット",
Database: "テーブル名",
AWSRegion: "ap-northeast-1",
SplitMulti: false,
ParseTime: true,
}
dsn := conf.ToDSN()
DB, err = gorm.Open(mysql.New(mysql.Config{
DriverName: rds.DRIVERNAME,
DSN: dsn,
}), &gorm.Config{})
RDS Proxyのメリット/デメリット
RDS Proxyは料金が発生してしまうのでそこがデメリットです
エンドポイントはRDSと同じように使えるのでコードはいままで通りで動かせます
RDS ProxyとAuroraがしっかり疎通できているかのチェックには以下のコマンドが役立ちます
aws rds describe-db-proxy-targets --db-proxy-name $DB_PROXY_NAME
このコマンドでUNAVAILABLE(PENDING_PROXY_CAPACITY)
は時間が解決してくれます。
Targets
が[]
のときは、RDS Proxyのターゲットが設定されてるか確認します
個人的につまづいたところ
今回GoのLambdaでGO SDKを利用してSESからメールを飛ばす処理があったのですが、パブリックサブネットに配置しても送信できないというトラブルがありました
この記事にある通りですが、LambdaにはパブリックIPがそもそもないため、インターネットゲートウェイを通して外部にアクセスすることはできないようです
なのでNATインスタンスを作成することでAPIをたたけるようにしました
おわりに
Lambdaの環境を構築するのに3週間ほど使ってしまいましたが、Lambdaとは?というところからなんとか本番環境構築まで行うことができました
そこで知りたかった内容をこの記事にまとめましたので誰かの役に立つと嬉しいです
参考