🥰

[爆速] Serverless Framework で API Gateway + Lambdaデプロイ

2022/10/27に公開

1.はじめに

前回、Zappaを利用してAPI Gateway + LambdaをAWSへデプロイすることを確認したので別手法「Serverless Framework」で今回は試してみたいと思います。

2.Serverless Frameworkとは?

特徴を並べてみました

  • インフラのコード化できる
  • サーバレスアーキテクチャの管理・構築が楽
  • ローカルで実行できる。 Zappaはできない、、、
  • ローカルの開発環境が整っているのはメリット
  • AWS, Azure, GCP など幅広く対応している
  • 様々なテンプレートをベースに作業できる
  • Node.jsで作られたCLIツール(Node.js:v12以上が必要)
  • Serverlessは npmのパッケージで公開されている

3.ハンズオン

3.1 ライブラリのインストール

Serverlessのコマンドをインストール

$ npm install -g serverless

インストールされたか確認

$ serverless --version

3.2 APPの雛形作成

templateを使うと楽

$ serverless create --template aws-python3

以下が作成される

.gitignore
handler.py ( mv してご自身のファイル名へ )
serverless.yml

中身を見てみる 👀

handler.py

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

    # Use this code if you don't use the http event with the LAMBDA-PROXY
    # integration
    """
    return {
        "message": "Go Serverless v1.0! Your function executed successfully!",
        "event": event
    }
    """

3.3 serverless.ymlの作成

以下のような設定ができます。Prpfileですね

  • Lambdaに設定されているIAMロール設定
  • デプロイ時にどのファイルとかディレクトリを含めるかの設定
  • 使用するプラグインの設定
service: serverless-test
frameworkVersion : 3
provider:
  name: aws
  runtime: python3.8
  stage: dev
  region: ap-northeast-1

functions:
  hello:
    handler: handler.hello

3.4 ローカルでテスト

$ serverless invoke local --function hello

3.5 デプロイ

以下を実行すると CloudFormation Stack が作成される。

$ serverless deploy 

4. 発展

Flaskアプリのデプロイを考えてみます。FlaskのアプリケーションはWSGIアプリケーションなので対応させなくてはなりません。

まずは、pluginの追加

$ serverless plugin install -n serverless-wsgi

※ serverless-wsgi: API Gatewayから LambdaへのリクエストをWSGIアプリ用に形式変換してくれる
api.py

from flask import Flask

app = Flask(__name__)

@app.route("/hello")
def hello():
    return "hello-serverless-flask" 

yamlの記述

serverless.yml

service : example

provider:
    name : aws
    runtime : python3.8
    region: ap-northeast-1

plugins:
    - serverless-wsgi
    
functions:
    api:
        handler: wsgi_handler.handler
        events:
            - http: ANY /
            - http: ANY /{proxy+}
custom:
    wsgi:
        app:api.app

デプロイ

$ serverless deploy

5. 終わりに

Serverless Frameworkはテンプレートが豊富だったりして使いやすかったです。Zappaよりできることも多いように感じました。Terraformとの連携もあるようですので今後勉強していきたいと思います!

6.参考文献

Discussion