LoginSignup
0
2

More than 1 year has passed since last update.

AWS Lambdaレイヤーを使ってPostgreSQLに接続する

Last updated at Posted at 2021-06-30

目的

AWS LambdaからVPC内のRDS(PostgreSQL)に接続したい。
複数のAWS Lambda FunctionからDB接続が必要。(接続頻度は低い)

前提条件

  • 月1回夜間に動作するバッチプログラムであるためコネクションプーリングは不要。
  • 接続頻度が低いためAmazon RDS Proxyは利用なし(費用が地味にかかるため)
  • 言語:Python 3.8
  • DB:PostgreSQL 11
  • Lambda FunctionのVPC・セキュリティグループ・IAMロールの設定の説明は割愛

DB接続方法

DB接続用のライブラリは「psycopg2」を採用。
全てのLambda Functionにライブラリをアップロードするのは避けたい。
そこで、レイヤー機能を利用することにする。

レイヤー作成

ライブラリ用意

レイヤーにアップロードするライブラリを用意。
下記から取得できる。

「with_ssl_support」をダウンロードする。
今回は、「psycopg2-3.8」を利用する。

ソースコード

DBコネクションを取得する共通プログラムを用意する。
接続情報はSSMパラメータから取得するようにした。

db.py
import os
import json
import boto3
import psycopg2

from psycopg2.extras import DictCursor

ssm = boto3.client('ssm')

def db_connect():

    DB_HOST = ssm.get_parameter(
        Name = 'db.host',
        WithDecryption = False
    )['Parameter']['Value']
    DB_DBNAME = ssm.get_parameter(
        Name = 'db.dbname',
        WithDecryption = False
    )['Parameter']['Value']
    DB_PORT = ssm.get_parameter(
        Name = 'db.port',
        WithDecryption = False
    )['Parameter']['Value']
    DB_USER = ssm.get_parameter(
        Name = 'db.user',
        WithDecryption = False
    )['Parameter']['Value']
    DB_PASSWORD = ssm.get_parameter(
        Name = 'db.password',
        WithDecryption = True
    )['Parameter']['Value']

    conn = psycopg2.connect(
        host=DB_HOST,
        dbname=DB_DBNAME,
        port=DB_PORT,
        user=DB_USER,
        password=DB_PASSWORD
    )
    return conn

デプロイパッケージ作成

ダウンロードしたライブラリと作成したソースファイルをzip化する。
ここで注意点としては、パッケージフォルダ名は「python」とすること。
また、ライブラリの「psycopg2-3.8」フォルダ名を「psycopg2」に変更する。

ディレクトリ構成

python/psycopg2
      /db.py

pythonフォルダをzip圧縮する。

アップロード

AWS Lambda画面のメニューからレイヤーを選択

「レイヤーの作成」を選択

  • 名前:db
  • 「.zip ファイルをアップロード」を選択して用意したzipをアップロード。
  • ランタイムは「python3.8」を選択。

「作成」ボタンを選択して完了。

レイヤーの利用

作成したレイヤーを利用する場合は、実行するfunction内でimportする。

test.py
import db # レイヤー化したライブラリ

def lambda_handler(event, context):

    try:
        conn = db.db_connect()

# 以下省略

まとめ

RDSProxyを利用するまでも無いケースやコスト面で利用を避けたい場合などはライブラリを利用することで接続が可能となる。
複数のファンクションから共有したい場合は、レイヤー化すると便利。

ただし、DB接続が頻発する場合はコネクションプーリングを活用するためにRDSProxyを使うこと。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2