- ローカル環境でLambda(SAM) + MySQL(docker-compose)を利用したAPIを作成する方法についてメモする。
AWS SAM(Serverless Application Model)
- サーバーレスアプリのデプロイに特化したCloudFormationの拡張機能。
- YAMLもしくはJSONでリソース定義する。
SAM CLI
- SAMを利用した開発サポートツール
- サーバーレスアプリのひな形作成、ビルド、AWSへのデプロイができる。
- 開発者のローカル環境でLambdaをDockerコンテナ起動できる。
構成
準備
-
SAM CLIインストール
brew tap aws/tap brew install aws-sam-cli
実装
MySQL
-
docker-compose.yml
- MySQL起動用
version: "3.3" networks: container-link: name: docker.internal services: db: image: mysql:5.7 container_name: db environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: sample_db MYSQL_USER: mysqluser MYSQL_PASSWORD: mysqlpass networks: - container-link volumes: - ./db/data:/var/lib/mysql - ./db/my.cnf:/etc/mysql/conf.d/my.cnf - ./db/initdb.d:/docker-entrypoint-initdb.d ports: - 3308:3308 command: --port 3308 tty: true
-
起動
docker-compose up -d
※起動後テスト用のテーブル作成とデータ登録を行う。
※
seq
,name
,age
カラムを持つsample
テーブルを作成している。
Lambda
-
ひな形作成
sam init
※ランタイムはPython3.8を選択。
-
template.yml
- Hello World Exampleを利用する。
- 今回はハローワールド用テンプレートをそのまま利用する。
-
requrements.txt
requests mysql-connector-python
※MySQLコネクター追加。
-
Lambda処理(
app.py
)修正import json import mysql.connector def lambda_handler(event, context): # MySQLからデータ取得 # それぞれの環境に合わせて記述 sql = "select * from sample;" conn = mysql.connector.connect( host = "db", port ="3308", user = "mysqluser", password = "mysqlpass", database = "sample_db" ) cur = conn.cursor(dictionary=True) cur.execute(sql) results = cur.fetchall() cur.close() conn.close() # レスポンスボディ生成 response = [] for result in results: response +=[ { "name":result["name"], "age":result["age"] } ] return { "statusCode":200, "body":json.dumps({"results":response}) }
動作確認
-
ビルド
sam build --use-container
-
実行
sam local start-api --docker-network docker.internal
-
リクエスト
GET /hello HTTP/1.1
Host: localhost:3000
Content-Type: application/json
* レスポンス
```json
{
"results": [
{
"name": "test",
"age": 25
},
{
"name": "test2",
"age": 26
}
]
}