EC2にpostgres Dockerを立てる
EC2でDocker postgresを立てる。
以下の記事が参考になった。
docker run -d --name postgres -e POSTGRES_PASSWORD=test -p 5432:5432 postgres
Lambda 関数
lambda のランタイムには Python 3.8
を用いた。
コードは以下の通り。
xxx.xxx.xxx.xxx
にはEC2インスタンスのプライベートIPを入力する。
import json
import psycopg2
def execute_sql(sql):
connection = psycopg2.connect(host='xxx.xxx.xxx.xxx',
user='postgres',
password='test',
dbname='postgres',
port=5432)
cursor = connection.cursor()
cursor.execute(sql)
result = cursor.fetchall()
return result
def lambda_handler(event, context):
sql = 'select * from testtable;'
result = execute_sql(sql)
print(result)
return {
'statusCode': 200,
'body': json.dumps(result)
}
psycopg2 import準備
上記コードだけでは psycopg2
を使用できない。
をForkし、ローカルにリポジトリを取り込む。Fork 初体験だったので感動した(笑)
次にランタイムの同じ psycopg2-3.8
の名前を psycopg2
に変更し圧縮する。
レイヤーに追加すれば良いと思ったのだが、importできなかったので(なぜ?)以下のアクションボタンからzipファイルをアップロードした。
アクションボタンを押してアップロード。
続いて、lambda_function.py
を作成する。
現在の状態はこんな感じ。
VPC の設定
コンソール画面を少し下にスクロールすると VPC
設定欄がある。
編集をクリックし、VPC、サブネット(一つだけしか選択しないと注意されるが無視)、セキュリティグループを設定する。
セキュリティグループはデフォルトを用いた。(EC2インスタンスに付けたセキュリティグループもデフォルトだったので、これで良いみたい)
アクセス権限
Lambda 関数を作成する際 AWS が新規に作成したロールに 2つのポリシー AmazonEC2FullAccess
と
AWSLambdaVPCAccessExecutionRole
をアタッチした。本当はもっと厳しくした方が良いと思う。詳細は公式ドキュメントに書いてあった。
後はテストボタンを押して以下の画像のように結果が出ればOK。
参考記事
公式ドキュメント
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-vpc.html
psycopg2をローカルでもAWS Lambda上でも同じように使う
https://qiita.com/redshoga/items/195d3ce3faa5f29171c0
DockerでPostgreSQL環境を構築する
https://qiita.com/kurkuru/items/b44653a5fcd1072852c0