【AWS】【Serverless Framework 入門】 Serverless Framework をデフォルト設定のままデプロイして挙動を確認してみた


はじめに

タイトルの通りです。
Serverless Framework のデフォルト時の挙動を確認するだけになります。

こちらの記事がとても参考になりました。
AWS Lambda入門①(Node編)〜関数をデプロイして動かす〜

動作環境

$ sls --version
Framework Core: 2.11.0
Plugin: 4.1.2
SDK: 2.3.2
Components: 3.3.0

前提として、Serverless Framework はインストール済み、 aws configure も設定済みになります。(aws configure list で確認できます。)

全体構成

デフォルト設定では以下の環境が作成できます。

プロジェクトの作成

プロジェクトを作成(sls create -t <テンプレート名> -p <作成するディレクトリ名>)してみます。

テンプレートは公式サイトを参照してください。いろいろあります。

# aws-nodejs テンプレートを元に hogehoge ディレクトリにプロジェクトを作成
$ sls create -t aws-nodejs -p hogehoge
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/Users/sugurutakahashi/git/hogehoge"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v2.9.0
 -------'

Serverless: Successfully generated boilerplate for template: "aws-nodejs"

ディレクトリ構造を確認してみます。

$ cd hogehoge 
$ tree -a
.
├── .gitignore
├── handler.js
└── serverless.yml

作成されたファイルの確認

作成されたそれぞれのファイル(.gitignorehandler.jsserverless.yml)の3つの中身をみてみます。

.gitignore
# package directories
node_modules
jspm_packages

# Serverless directories
.serverless
handler.js
'use strict'

module.exports.hello = async event => {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: 'Go Serverless v1.0! Your function executed successfully!',
        input: event,
      },
      null,
      2
    ),
  };

  // 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 };
};
serverless.yml
service: hogehoge
frameworkVersion: '2'

provider:
  name: aws
  runtime: nodejs12.x

functions:
  hello:
    handler: handler.hello

※ serverless.yml はコメント部分を省略しています。

関数の実行

初期値で hello という関数が用意されているようなので実行してみます。

ローカルでの関数の実行(引数なし)

関数はローカルで実行することが可能(sls invoke local --function <関数名>)です。

$ sls invoke local --function hello
{
    "statusCode": 200,
    "body": "{\n  \"message\": \"Go Serverless v1.0! Your function executed successfully!\",\n  \"input\": \"\"\n}"
}

とりあえず実行されたみたいです。

ローカルでの関数の実行(引数あり)

handler.js をよくみると hello 関数の引数 event がレスポンスの bodyinput の value になるみたいなので、引数を渡してあげます。

sls invoke local --function <関数名> --data <引数> で引数を渡しながら関数を実行することができます。

$ sls invoke local --function hello --data test
{
    "statusCode": 200,
    "body": "{\n  \"message\": \"Go Serverless v1.0! Your function executed successfully!\",\n  \"input\": \"test\"\n}"
}

input の value が引数で渡した test になりました。

リモートへのデプロイ

とりあえずデプロイ(sls deploy -v)してみます。
-v--verbose の略で詳細が出力されるオプションです。

$ sls deploy -v
(省略)
Serverless: Stack update finished...
Service Information
service: hogehoge
stage: dev
region: us-east-1
stack: hogehoge-dev
resources: 6
api keys:
  None
endpoints:
  None
functions:
  hello: hogehoge-dev-hello
layers:
  None

Stack Outputs
HelloLambdaFunctionQualifiedArn: arn:aws:lambda:us-east-1:653595591267:function:hogehoge-dev-hello:3
ServerlessDeploymentBucketName: hogehoge-dev-serverlessdeploymentbucket-1q2qo8ezm7dcf

デプロイするとローカルに .serverless というディレクトリが作られていました。

$ tree -a
.
├── .gitignore
├── .serverless
│   ├── cloudformation-template-create-stack.json
│   ├── cloudformation-template-update-stack.json
│   ├── hogehoge.zip
│   └── serverless-state.json
├── handler.js
└── serverless.yml

ちなみに .serverless/hogehoge.zip を解凍したところ、handler.js が入っていました。

serverless.ymlhandler.js を解釈して、.serverless のディレクトリが作成されて、本質的にはこちらのフォルダがデプロイされる感じなのでしょうね。

リモートにデプロイされた関数の実行

デプロイされた hello 関数を実行(sls invoke --function <関数名> --data <引数> --region <リージョン>)してみます。

今回のリージョンは sls deploy -v の結果をみると us-east-1 になっているので、us-east-1 を指定します。

ちなみにデフォルトでのリージョンは us-east-1 に設定されています。

デフォルトから変更する場合は serverless.yml で設定します。例えば、東京であれば ap-northeast-1 を指定してください。

$ sls invoke --function hello --data hogeeee --region us-east-1
{
    "statusCode": 200,
    "body": "{\n  \"message\": \"Go Serverless v1.0! Your function executed successfully!\",\n  \"input\": \"hogeeee\"\n}"
}

AWS コンソールの確認

AWS のコンソールを覗いてみます。
リモート環境にデプロイが反映されていることを確認します。

us-east-1 にデプロイされていることがわかっているのでリージョンはバージニア北部を選択します。

CloudFormation

CloudFormationに hogehoge プロジェクトのスタックが作成されているのがわかります。

デフォルトで dev というステージ名になっているのでそれが反映された形になっています。
ステージ名は自由に設定できるもので serverless.yml で設定できます。

CloudFormationやスタックについてはこちらの記事がわかりやすいかと思います。

スタックは一言で言うとひとつのプロジェクトのかたまりみたいなものです。

Lambda

Lambda に hogehoge プロジェクトの dev ステージの hello 関数が登録されているのがわかります。

CloudWatch Logs

リモートにデプロイされた関数を実行する(sls invoke --function <関数名> --data <引数> --region <リージョン>)と CloudWatch Logs に反映されます。

CloudWatch > CloudWatch Logs > Log groups > /aws/lambda/hogehoge-dev-hello から確認できます。

デプロイしたリソースの削除

最後にデプロイしたリソースを削除(sls remove -v)します。
そのまま放っておいて、あとでお金を請求されるのは困るので、記憶があるうちに消します。

$ sls remove -v

AWS のコンソールの CloudFormation と Lambda を見に行くとリソースが削除されていることが確認できます。

おわりに

以上になります。

続編
【Serverless Framework 入門】 API Gateway + Lambda + DynamoDB サンプル