7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Lambda (SAM CLI) + MySQL(docker-compose)を利用した REST API作成方法メモ

Last updated at Posted at 2021-10-26
  • ローカル環境でLambda(SAM) + MySQL(docker-compose)を利用したAPIを作成する方法についてメモする。

AWS SAM(Serverless Application Model)

  • サーバーレスアプリのデプロイに特化したCloudFormationの拡張機能。
  • YAMLもしくはJSONでリソース定義する。

SAM CLI

  • SAMを利用した開発サポートツール
  • サーバーレスアプリのひな形作成、ビルド、AWSへのデプロイができる。
  • 開発者のローカル環境でLambdaをDockerコンテナ起動できる。

構成

sam.png

準備

  • 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
      }
  ]
}

参考情報

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?