Serverless FrameworkでAWS Lambdaを作成する

Serverless Frameworkを利用して、Lambda関数をデプロイします。参考にした公式ページはこちら。

Services

環境

  • Serverless Framework
    • Framework Core: 1.67.0 (standalone)
    • Plugin: 3.5.0
    • SDK: 2.3.0
    • Components: 2.22.3

Serviceの作成

まず Service を作成します。Serviceとは、Serverless Frameworkにおけるプロジェクトのようなものらしいです。 create コマンドで作成することができ、 template パラメーターを指定すると、指定した言語でのサンプルファイルを生成してくれます。

$ serverless create --template aws-python3 --path myService

AWS - Create

カレントディレクトリの myService ディレクトリ配下に、以下のファイルが生成されています。

.
├── .gitignore
├── handler.py
└── serverless.yml

handler.py の編集

handler.py ファイルは、Lambdaで実行されるソースコードを記述するファイルとなります。

The handler.js file contains your function code. The function definition in serverless.yml will point to this handler.js file and the function exported here.

今回は、偶数か奇数かを判断する以下のコードを書いています。

handler.py

import json

def run(event, context):

    if 'number' in event:
        if int(event['number']) % 2 == 0:
            body = { 'result': 'even number' }
        else:
            body = { 'result': 'odd number' }

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

    return response

serverless.yml の編集

serverless.yml ファイルは、デプロイするLambda関数の設定を定義したファイルとなっています。このファイルから、CloudFormationのテンプレートが生成されるとのこと。

Every serverless.yml translates to a single AWS CloudFormation template and a CloudFormation stack is created from that resulting CloudFormation template.

サンプルとして雛形を出力してくれているので、それを編集する形で定義を作成します。

serverless.yml

frameworkVersion: ">=1.67.0"

service: myservice

provider:
  name: aws
  runtime: python3.8
  stage: dev
  region: ap-northeast-1
  memorySize: 128
  versionFunctions: true

functions:
  isEven:
    handler: handler.run

デプロイ

デプロイします。

$ serverless deploy --aws-profile (aws profile名)

AWS - deploy

Lambdaのinvoke

作成したLambda関数を実行します。実行する前に、 serverless create したServiceディレクトリのルートパスに event.json というファイルを作成し、実行するLambdaに渡すイベントデータを記載してあげます。

event.json

{
  "number": 2
}

実行します。

$ serverless invoke --function isEven --path event.json --aws-profile (aws profile名)
{
    "statusCode": 200,
    "body": "{\"result\": \"even number\"}"
}

AWS - Invoke

ログの表示

logs コマンドを実行すると、ログを表示してくれます。

$ serverless logs --function isEven --aws-profile (aws profile名)
START RequestId: 1545c57d-5c63-4b00-be5a-aacb5d5dede0 Version: $LATEST
END RequestId: 1545c57d-5c63-4b00-be5a-aacb5d5dede0
REPORT RequestId: 1545c57d-5c63-4b00-be5a-aacb5d5dede0  Duration: 1.34 ms       Billed Duration: 100 ms Memory Size: 128 MB     Max Memory Used: 49 MB  Init Duration: 120.89 ms

AWS - Logs

削除

remove コマンドにて、デプロイしたリソースを削除できます。

$ serverless remove --aws-profile (aws profile名)

AWS - Remove

GitHubからサービスのインストール

gitのホスティングサービス上に公開したServiceを、serverlessコマンド経由でローカルにダウンロードできるとのこと。

$ serverless install -u https://github.com/some/service.git

AWS - Install