API Gateway・Lambda・AuroraでAPIを作成してみた[Lambda編]

# はじめに

みなさんこんにちは！この記事では、「API Gateway・Lambda・AuroraでAPIを作成してみた」というテーマのもと作成方法を複数回に分けてご紹介しております。今回はLambdaからデータベースに格納した情報を取得する方法についてご紹介します。

# 目次

* [全体編](https://qiita.com/kazuki_horiuchi/private/cb80dbfd51e77255c653)
* [VPC・サブネット・セキュリティグループ編](https://qiita.com/kazuki_horiuchi/private/a9fef24b77a52e0109b1)
* [Aurora編](https://qiita.com/kazuki_horiuchi/private/a3dc6dec1dc5f1ec9445)
* [CloudShell編](https://qiita.com/kazuki_horiuchi/private/b2804424e44ad4c4790e)
* Lambda編 << 今回はこちら
* [Secrets Manager編](https://qiita.com/kazuki_horiuchi/private/8711e7be2e9ea20a56b0)
* [API Gateway編](https://qiita.com/kazuki_horiuchi/private/9cb5352c45211b3573f9)

# 本記事の対象

全体の構成図に対して、本記事では赤字で記載しているLambda関数の作成、Auroraとの接続を行いデータベースの情報を取得していきます。

![image.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/8aaf923c-79cd-00ee-79f1-0a4a87012b8d.png)

# 作成の流れ

以下の流れで実施していきます。

* Lambda関数の作成
* レイヤーの追加
* コードの作成
* コードのテスト

:::note info
前提として以下が必要となります。詳細は[目次](#目次)のリンクよりご確認ください。

* VPC・サブネット・セキュリティグループの作成
* Auroraの作成
* Auroraへデータの格納
:::

# 実際に作成してみた

## Lambda関数の作成

まずはLambda関数を作成します。今回はAuroraを操作するため、VPCと接続するように設定します。詳細は以下スクリーンショットよりご確認ください。

<details><summary>詳細な設定項目と設定値</summary>

![lambda1.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/d2a57685-f5b9-5d35-1ef6-0c068699e0f3.png)

![lambda2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/d5963430-bec0-efe8-76ae-a1e49e07939f.png)

</details>

## レイヤーの追加

データベースの接続や操作をするためにpymysqlといったライブラリが必要となります。今回はライブラリを使用するために、公開されているLambdaレイヤーを追加します。「コード」タブよりレイヤーを追加します。

![lambda3.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/a7f73498-13ec-a097-1543-dd56fc6a4451.png)

## コード作成

Lambdaで実行するコードを作成します。今回は以下コードでデータベースに格納した情報を取得します。

``` python
import pymysql
import json

HOST = "RDS Proxyのエンドポイント"
DB_NAME = "dev"
DB_USER_NAME = "データベースのユーザ名"
DB_PASSWORD = "パスワード"

def lambda_handler(event, context):
    # データベースへ接続
    conn = pymysql.connect(
        host=HOST,
        user=DB_USER_NAME,
        password=DB_PASSWORD,
        database=DB_NAME,
        cursorclass=pymysql.cursors.DictCursor
    )

    try:
        # SQLクエリ実行・結果取得
        with conn.cursor() as cur:
            cur.execute('SELECT * FROM book')
            results = cur.fetchall()

        return {
            'statusCode': 200,
            'body': results
        }
    
    except Exception as e:
        # エラーハンドリング
        return{
            'statusCode': 500,
            'body': json.dumps({'error': str(e)})
        }
    
    finally:
        # 接続を閉じる
        conn.close()
```

:::note info
上記コードではデータベースの認証情報(ユーザ・パスワード)がハードコートされており、認証情報漏洩のリスクがあります。「Secrets Manager編」にて、ハードコートせず認証情報を取得する方法をご紹介します。詳細は[目次](#目次)のリンクよりご確認ください。
:::

## コードのテスト

コードをデプロイし「テスト」タブよりコードのテストを行います。レスポンスの中に、データベースに格納した情報が含まれていれば成功です。

![lambda4.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3773682/144cee59-9365-ed35-b58b-473a94013ebd.png)

# 終わりに

いかがだったでしょうか。今回はLambdaからデータベースに格納した情報を取得する方法についてご紹介しました。次回は[Secrets Manager編](https://qiita.com/kazuki_horiuchi/private/8711e7be2e9ea20a56b0)をご紹介します。是非、次回以降もご覧いただけますと幸いです。もしこの記事がお役に立ちましたら、「いいね」「記事のストック」をお願いします！

---

- AWS は、米国その他の諸国における Amazon.com, Inc. またはその関連会社の商標です。
- その他、記載されている会社名および商品・製品・サービス名は、各社の商標または登録商標です。