Photoruction工事中!

Photoructionの開発ブログです!

ローカルでAPI Gateway, Lambdaの構成を再現する

こんにちは!株式会社Photoruction AIグループでエンジニアをしています酒井です。 Photoruction Advent Calendar 2021の23日目の記事です。

導入

APIGateway, LambdaのサーバレスアーキテクチャでWebAPIを開発する際、APIのレスポンス確認のために都度、クラウド上にデプロイするのは手間がかかります。

そこでServerlessFrameworkというフレームワークとserverless-offlineというプラグインを使用してローカルでレスポンスを確認できる環境を整えました。

ServerlessFrameworkとは

serverless-offlineとは

  • ServerlessFrameworkで使えるプラグイン
  • ローカル環境でAPI Gateway + Lambdaの構成を再現することができる

実施内容

クライアントによる「APIGateway」へのPOSTリクエストをトリガーにして、「Lambda」で定義した関数を実行することを想定しローカルでの開発環境を整える。 f:id:photoruction_tech_blog:20211217160020p:plain

手順

1. ServerlessFramework、serverless-offlineのインストール

$ npm install serverless
$ npm install --save-dev serverless-offline

2. プロジェクトの作成

sls create -t <テンプレート名> -n <プロジェクト名>でプロジェクトを作成します

ServerlessFrameworkが提供するテンプレートはこちらを参考にしてください

今回は aws-python3を使用しました。

任意のディレクトリに移動したあと、以下を実行します。

$ sls create -t aws-python3 -n serverless-sample

すると、ディレクトリ内に handler.pyserverless.ymlが作成されます

$ ls
handler.py   serverless.yml

3. handler.pyを編集する

  • handler.pyにLambda関数を定義します。
  • デフォルトでは以下のようにシンプルな関数 helloが定義されています。
import json

def hello(event, context):
    body = {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "input": event
    }

    response = {
        "statusCode": 200,
        "body": json.dumps(body)
    }

    return response

4. serverless.ymlを編集する

以下の設定を行います。

  1. functionsのhelloにeventsの追加
  2. 使用するプラグイン(serverless-offline)の記述
service: serverless-sample # プロジェクト名
frameworkVersion: '2'
provider:
  name: aws
  runtime: python3.8
  lambdaHashingVersion: 20201221
functions:
  hello:
    handler: handler.hello # handler.pyの関数helloを実行する

    # 追加
    events:
      - http:
          path: /test # <- 任意
          method: post # <- POSTリクエストをしたので post を指定

# 追加
plugins:
  - serverless-offline

5. 起動

以下コマンドでプロジェクトを起動すると、エンドポイントが表示されます。

$ sls offline start
 
   ┌─────────────────────────────────────────────────────────────────────────┐
   │                                                                         │
   │   POST | http://localhost:3000/dev/test                                 │
   │   POST | http://localhost:3000/2015-03-31/functions/hello/invocations   │
   │                                                                         │
   └ ────────────────────────────────────────────────────────────────────────┘

レスポンスを確認する

  • エンドポイントに対して {"name": "yamada"}というデータとともにPOSTリクエストを送ってみます。
  • すると handler.pyに定義したbodyの内容が正しく表示されます。
  • データも正しく送信できていることが分かります。
$ curl -X POST -d '{"name": "sample"}' http://localhost:3000/dev/test
{"message": "Go Serverless v1.0! Your ...", "input": {"body": "{name: yamada}", ...}

まとめ

ServerlessFrameworkのserverless-offlineというプラグインを使うことでローカル環境でAPIのレスポンスを確認することができました。

開発していく中で挙動を確認するために都度、クラウド上にデプロイする必要がないので時間短縮につながりました。

株式会社フォトラクションでは一緒に働く仲間を募集しています

corporate.photoruction.com

www.wantedly.com