今更だけど、Serverless Frameworkを使う

# Serverless Frameworkとは

[Serverless Framework](https://www.serverless.com/)とは、erverless Applicationを構成管理デプロイするためのツールで、ローカルでのデバッグや、デプロイなんかもアッという間にできてしまうツールです。オープンソースというのは素晴らしいですね。
ということで、今更な気もしますが、実際に使ってみたいと思います。

## 環境
Windows10
WSL2
Ubuntu 20.04 LTS
Node.js 12.18.3

## インストール

Node.jsを使うので、環境がない場合は、事前に[こちら](https://qiita.com/ryotaro76/items/ee305b3a3628464f190b)を
やっておくと便利です。


次に、Serverless Frameworkをインストールします。

```bash
$ npm install -g serverless
   ┌───────────────────────────────────────────────────┐
   │                                                   │
   │   Serverless Framework successfully installed!    │
   │                                                   │
   │   To start your first project run 'serverless'.   │
   │                                                   │
   └───────────────────────────────────────────────────┘

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@~2.1.2 (node_modules/serverless/node_modules/chokidar/node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.1.3: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

+ serverless@1.79.0
added 747 packages from 502 contributors in 27.15s
```

警告が若干出ますが、Macしか対応していない模様なのと、「OPTIONAL DEVENDENCY」なので無視します。

```bash
$ serverless --version
Framework Core: 1.79.0
Plugin: 3.7.1
SDK: 2.3.1
Components: 2.34.6
```

無事インストールができました。

# プロジェクトの作成
無事インストールできたので、次にプロジェクトを作成していきます。

```bash
$ serverless create -t aws-python3 -n myapp -p myapp
Serverless: Generating boilerplate...
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.79.0
 -------'

Serverless: Successfully generated boilerplate for template: "aws-python3"
```

無事作成できました。

-tでテンプレートを指定します。ここの指定で利用言語も決まります。詳細は[こちら](https://www.serverless.com/framework/docs/providers/aws/cli-reference/create/)

myapp配下に、serverless.yml、handler.pyが作成されていれば、成功です。

# AWS にデプロイする

## アカウントの設定
事前にServerless framework用のアカウントを作成しておきます。
IAMユーザにAdministratorAccessの管理ポリシーを与えれば、大丈夫ですが、細かい設定はまたの機会に勉強したいともいます。

```bash
serverless config credentials --provider aws --key {アクセスキーID} --secret {シークレットアクセスキー}
```
アクセスキーID、シークレットアクセスキーには作成したIAMアカウントのものを設定してください。

設定がされているかどうかは以下のコマンドで確認が可能です。

```bash
$ cat ~/.aws/credentials
[default]
aws_access_key_id=XXXXXXXXXXXXXXXXXXXX
aws_secret_access_key=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
```

## デプロイ
そのままデプロイしてもいいのですが、デフォルトだと、API Gatewayも利用されないので
少しだけ変更してみます。

```yaml:serverless.yml
functions:
  hello:                              ・・・ 関数名を指定
    handler: handler.hello            ・・・ Handler関数を指定
    events:
      - http:                          
          path: sample/hello          ・・・ APIのリソースを指定
          method: get                 ・・・ HTTPのメソッド
```

次にデプロイを実行します。

```bash
$ serverless deploy -v
Serverless: Stack update finished...
Service Information
service: myapp
stage: dev
region: us-east-1
stack: myapp-dev
resources: 12
api keys:
  None
endpoints:
  GET - https://qcispp8ggg.execute-api.us-east-1.amazonaws.com/dev/sample/hello
functions:
  hello: myapp-dev-hello
layers:
  None

Stack Outputs
HelloLambdaFunctionQualifiedArn: arn:aws:lambda:us-east-1:767994070137:function:myapp-dev-hello:1
ServiceEndpoint: https://qcispp8ggg.execute-api.us-east-1.amazonaws.com/dev
ServerlessDeploymentBucketName: myapp-dev-serverlessdeploymentbucket-1xu5hoa9udend
```

途中、CloudFormationやらのログが出ますが、無事デプロイされると上記のようなログが出力されます。

# 疎通確認

上記ログを見るとendpointsに作成されたAPIのパスが表示されていますので、
呼び出してみます。（ブラウザでも、CurlでもOK）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132118/ed9382d2-359f-9190-0afb-e991e2147631.png)

# 最後に
ここまで、10分もあれば終わりました。AWSのアカウント周りとか若干厄介ですが、かなりラクチンですね。