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

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

こちらの記事がとても参考になりました。
・[AWS Lambda入門①(Node編)〜関数をデプロイして動かす〜](https://qiita.com/ozaki25/items/883aec0ab4398aa4abbe)

# 動作環境

```
$ 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` で確認できます。）

# 全体構成

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

![p3ng.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259125/be08bd1b-2e3b-4b05-4049-956785fe9be7.png)

# プロジェクトの作成

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

テンプレートは[公式サイト](https://www.serverless.com/framework/docs/providers/aws/cli-reference/create#available-templates)を参照してください。いろいろあります。

```
# 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
```

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

作成されたそれぞれのファイル（`.gitignore`、`handler.js`、`serverless.yml`）の3つの中身をみてみます。

```text:.gitignore
# package directories
node_modules
jspm_packages

# Serverless directories
.serverless
```

```javascript: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 };
};
```

```yaml: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` がレスポンスの `body` の `input` の 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.yml` と `handler.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

![スクリーンショット 2020-11-09 19.46.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259125/e49ee923-a3f6-e4b9-ea4a-9c9d9da00b8b.png)

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

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

CloudFormationやスタックについては[こちら](https://dev.classmethod.jp/articles/cloudformation-beginner01/)の記事がわかりやすいかと思います。

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

## Lambda

![スクリーンショット 2020-11-09 19.47.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259125/fe66ed01-a72b-636a-d9b6-c3a59fbcd8fa.png)

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

## CloudWatch Logs

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

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

![スクリーンショット 2020-11-09 20.31.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259125/4a3af470-9905-7c12-c5af-c3c2b4f9ca83.png)


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

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

```
$ sls remove -v
```

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

# おわりに
以上になります。

続編
・[【Serverless Framework 入門】 API Gateway + Lambda + DynamoDB サンプル](https://qiita.com/sugurutakahashi12345/items/8eafa9ef6ce26531290a)