AWS-Lambda + PythonでAWS-RDS/PostgreSQLのテーブルを読み込む

# AWS-Lambda + PythonでAWS-RDS/PostgreSQLのテーブルを読み込む

## はじめに

`Mac環境の記事ですが、Windows環境も同じ手順になります。環境依存の部分は読み替えてお試しください。`

### 目的

この記事を最後まで読むと、次のことができるようになります。

| No.  | 概要         | キーワード       |
| :--- | :----------- | :--------------- |
| 1    | コーディング | Python, psycopg2 |
| 2    | Lambda設定   | Lambda           |

### 実行環境

| 環境           | Ver.    |
| :------------- | :------ |
| macOS Catalina | 10.15.3 |
| Python         | 3.7.3   |
| psycopg2       | 2.8.4   |

### ソースコード

実際に実装内容やソースコードを追いながら読むとより理解が深まるかと思います。是非ご活用ください。

[GitHub](https://github.com/nsuhara/python-lambda-read-rds.git)

### 関連する記事

- [Psycopg](https://www.psycopg.org/docs/)
- [AWS-Lambda + Python + CronでWEBスクレイピングを定期的に実行する](https://qiita.com/nsuhara/items/0d36600511fc162827f6)

## AWS-Lambdaの特徴

本サービスは従量課金制となります。ご留意ください。

- [特徴](https://aws.amazon.com/jp/lambda/features/)
- [料金](https://aws.amazon.com/jp/lambda/pricing/)

## 全体の流れ

1. Pythonコードを書く
2. Lambda関数を作成する
3. 環境変数を設定する
4. 基本設定を設定する
5. VPCを設定する

## 1. Pythonコードを書く

### コーディング

```app/lambda_function.py
"""app/lambda_function.py
"""

import os
import sys

import psycopg2


class Database():
    """Database
    """
    class Parameter():
        """Parameter
        """

        def __init__(self, host, port, dbname, table, user, password, query):
            self.host = host
            self.port = port
            self.dbname = dbname
            self.table = table
            self.user = user
            self.password = password
            self.query = query

    def __init__(self, param):
        self.db = param
        self.header = tuple()
        self.records = list()
        self.counts = int()

    def _connection(self):
        """_connection
        """
        print('connect to db: {}/{}'.format(self.db.host, self.db.dbname))
        return psycopg2.connect(
            host=self.db.host,
            port=self.db.port,
            dbname=self.db.dbname,
            user=self.db.user,
            password=self.db.password
        )

    def query(self):
        """query
        """
        with self._connection() as conn:
            with conn.cursor() as cursor:
                try:
                    cursor.execute(self.db.query)
                    self.header = cursor.description
                    self.records = cursor.fetchall()
                    self.counts = len(self.records)
                except psycopg2.Error as e:
                    print(e)
                    sys.exit()
        return True


def lambda_handler(event, context):
    """lambda_handler
    """
    print('event: {}'.format(event))
    print('context: {}'.format(context))

    param = Database.Parameter(
        host=os.getenv('DB_HOST', ''),
        port=os.getenv('DB_PORT', ''),
        dbname=os.getenv('DB_DBNAME', ''),
        table=os.getenv('DB_TABLE', ''),
        user=os.getenv('DB_USER', ''),
        password=os.getenv('DB_PASSWORD', ''),
        query=os.getenv('DB_QUERY', '')
    )

    db = Database(param=param)
    db.query()

    return {
        'status_code': 200,
        'records': str(db.records),
        'counts': db.counts
    }


if __name__ == '__main__':
    print(lambda_handler(event=None, context=None))
```

## 2. Lambda関数を作成する

[AWS-Lambda + Python + CronでWEBスクレイピングを定期的に実行する](https://qiita.com/nsuhara/items/0d36600511fc162827f6)の記事を参考に`zipのアップロード`まで実施する

## 3. 環境変数を設定する

### 環境変数

1. `環境変数`セクションの`編集`から設定する

| キー        | 値         |
| :---------- | :--------- |
| DB_HOST     | {host}     |
| DB_PORT     | {port}     |
| DB_DBNAME   | {dbname}   |
| DB_TABLE    | {table}    |
| DB_USER     | {user}     |
| DB_PASSWORD | {password} |
| DB_QUERY    | {query}    |

`{}は環境毎に異なります。`

## 4. 基本設定を設定する

### 基本設定

1. `基本設定`セクションの`編集`から設定する
2. タイムアウトは最大`15分0秒`まで設定可能
3. メモリは最大`3008MB`まで設定可能

## 5. VPCを設定する

### VPC

1. `VPC`セクションの`編集`から設定する
2. `VPC`、`サブネット`、`セキュリティグループ`を設定する

`RDSの設定と合わせる必要がある`