Aurora ServerlessにAWS LambdaのPythonからData APIで色々やってみたのでメモ

Aurora ServerlessにAWS LambdaのPythonからData APIで色々やってみたのでメモ

この記事はQiitaで書いたものと基本的に同じ内容です。

東京リージョンのAurora ServerlessでData API(HTTPエンドポイント)が使えるようになったものの日本語の情報が少なくて苦労したのでメモ。

PythonのコードについてはAWS Lambdaのために必要に駆られて書き始めたばかりなのでコード的にイケてないところが多いと思います。
こうした方が良いとかあればぜひとも一緒に働く仲間として来てください!w

AWS LambdaのPythonでimport boto3して使える奴はバージョンがすごく古いです。
そのためboto3.client('rds-api')が使えません。

$ mkdir python
$ pip install -t ./python boto3
$ zip -r boto3-x.y.z.zip python

できたZIPをLambdaのLayersに登録し、LambdaからそのLayerを選択すればLayerのboto3を使用してくれます。

またLambdaからData APIを使用する際にはLambdaが使うIAMに以下の権限を追加する必要があります。

  • secretsmanager:GetSecretValue
  • rds-data:ExecuteStatement
  • rds-data:BeginTransaction ※
  • rds-data:CommitTransaction ※
  • rds-data:RollbackTransaction ※

※ トランザクションを使わない場合には不要

適当すぎですが以下のようなテーブルが事前に用意されてるものとします。

CREATE TABLE `test` (
  `id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `str` varchar(255) NOT NULL,
  `date` timestamp NOT NULL,
  `val` int)

で、実際のLambdaのコードが以下になりますが、書いたコードから有用そうな部分を抜粋したので動く状態にはないかもしれないので参考として見てください。

import boto3

def lambda_handler(event, context):
    cluster_arn = 'arn:aws:rds:ap-northeast-1:xxxxxxxxxxxx:cluster:yyyyyyyyyyyy'
    secret_arn = 'arn:aws:secretsmanager:ap-northeast-1:xxxxxxxxxxxx:secret:zzzzzzzzzzzz'

    rds_data_client = boto3.client('rds-data')

    try:
        transaction = rds_data_client.begin_transaction(
            resourceArn = cluster_arn,
            secretArn = secret_arn,
            database = 'dbname'
        )

        # ここらへんでdictに色々詰めてる感じ
        # dict['date']にはUNIX時間(秒)が入ってると思ってください

        rds_data_client.execute_statement(
            resourceArn = cluster_arn,
            secretArn = secret_arn,
            database = 'dbname',
            transactionId = transaction['transactionId'],
            sql = 'insert into test(str, date, val) values (:str, from_unixtime(:date), :val);',
            parameters = [
                {'name': 'str', 'value': {'stringValue': dict['str']}},
                {'name': 'date', 'value': {'longValue': dict['date']}},
                {'name': 'val', 'value': {'longValue': dict['value']} if dict['val'] else {'isNull': True}},
            ]
        )

        rds_data_client.commit_transaction(
            resourceArn = cluster_arn,
            secretArn = secret_arn,
            transactionId = transaction['transactionId']
        )

    except Exception:
        rds_data_client.rollback_transaction(
            resourceArn = cluster_arn,
            secretArn = secret_arn,
            transactionId = transaction['transactionId']
        )

TAG

  • このエントリーをはてなブックマークに追加
やまま
スペシャリスト やまま yamama

マンガとアニメとゲームから錬成された宇宙大好きエンジニア。 軌道エレベーターで行ける静止軌道上のコロニーに住まいを移し、ゲームやってマンガ読んでアニメ見て爆睡、ゲームやってマンガ読んでアニメ見て爆睡、という生活を夢見ながら今日もコードを書き続けるのだった。