serverless framework入門(4)Python Scheduled Cron

こちらのGitHubリポジトリを内容で自分の端末からデプロイしてみました。

github.com

コマンド一発でAWSリソースが無事デプロイできました。

実行したコマンドは以下です。

serverless deploy

deployコマンドのオプションでリージョンを指定しなかったため、us-east-1リージョンにデプロイされていました。
マネジメントコンソールでLambda関数が見つけきれずちょっと焦りましたが、マネジメントコンソールをap-northeast-1からus-east-1に切り替えたらLambda関数が見つかりました。
f:id:JunpeiNakasone:20220115063127p:plain

今回のserverless.ymlでは以下のようにfunctionsで二つ指定しているのでLambda関数も二つ作成されていました。 serverless.ymlのfunctionsがそのままLambdaの関数単位でデプロイされるみたいです。

functions:
  rateHandler:
    handler: handler.run
    events:
      # Invoke Lambda function every minute
      - schedule: rate(1 minute)
  cronHandler:
    handler: handler.run
    events:
      # Invoke Lambda function every 2nd minute from Mon-Fri
      - schedule: cron(0/2 * ? * MON-FRI *)

ちょっと公式ドキュメントも確認します。

www.serverless.com

以下の記述がありましたのでやっぱりfunctionsがそのままLambda関数になるようです。

If you are using AWS as a provider, all functions inside the service are AWS Lambda functions.

ついでにfunction内のeventsについても調べました。

www.serverless.com

Simply put, events are the things that trigger your functions to run.

eventは関数を実行するトリガーとのこと。
続いてこう書かれてました。

If you are using AWS as your provider, all events in the service are anything in AWS that can trigger an AWS Lambda function, like an S3 bucket upload, an SNS topic, and HTTP endpoints created via API Gateway.

S3バケットアップロード、SNSトピック、API Gatewayで作成されるHTTPエンドポイントなどでLambdaを実行することができるとのこと。実用性高そうです。

eventについては以下のドキュメントがありました。

www.serverless.com

今回のチュートリアルでは使ってないですが、S3のイベントも以下のように設定できるみたいです。

 
functions:
  users:
    handler: users.handler
    events:
      - s3:
          bucket: photos
          event: s3:ObjectCreated:*
          rules:
            - prefix: uploads/
            - suffix: .jpg

決まったprefixに.jpgでオブジェクトがアップロードされたらLambdaが実行されるって感じだと思います。

公式ドキュメント読む方にかなり脱線してましたが、今回デプロイしたLambdaで出力したログはCloud Watch Logsで確認できました。
f:id:JunpeiNakasone:20220115064710p:plain

ちなみにPythonのコードは以下のようになっています。

import datetime
import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)


def run(event, context):
    current_time = datetime.datetime.now().time()
    name = context.function_name
    logger.info("Your cron function " + name + " ran at " + str(current_time))

serverless frameworkの雰囲気がわかってきてかなり楽しいです。
あといくつかチュートリアル試してコード読んでみたいと思います。