[Serverless Framework] インストールからデプロイするまで [初心者]

# 概要
n番煎じ？ 許してください。
初めてServerless Frameworkを使ったので、それを使ってAWSにLambdaをデプロイするまでのメモ書き。


# Serverless Frameworkのインストール
## 前提
- node.jsのv4以上がインストールされている必要がある([serverless.com : AWS - Installation](https://serverless.com/framework/docs/providers/aws/guide/installation/))
- 以下のコマンドで確認

```Bash
$ node -v
v8.10.0
```


問題なければServerless Frameworkをインストール

```Bash
$ npm install -g serverless
```


完了したら以下のコマンドを叩いてみる

```Bash
$ serverless

Commands
* You can run commands with "serverless" or the shortcut "sls"
.
.
.
（省略）
```
エイリアスもあるので以下のコマンドでも同じ

```Bash
$ sls

Commands
* You can run commands with "serverless" or the shortcut "sls"
.
.
.
（省略）
```

概要っぽいものがずらっと出てくればOK

そのほか、以下のコマンドでバージョン確認など

```Bash
$ sls -v
1.26.1
```

# IAMの作成
デプロイするのにアクセスキーIDとシークレットアクセスキーが必要なので、それを作成。
IAMユーザー追加して、「AdministratorAccess」のポリシーを付与。
AWSマネジメントコンソールからぽちぽちしました。

厳密には以下のような状態になってます。

- グループ作成
- グループに「AdministratorAccess」のポリシーを付与
- IAMユーザー作成
- グループにユーザーを追加



# AWSCLI
## インストール
作成したIAMユーザーの「アクセスキーID」「シークレットアクセスキー」を設定するために、AWSCLIをインストール。
Homebrewでできる。

```Bash
$ brew install awscli
```

完了したら以下のコマンドで確認してみる

```Bash
$ aws --version
aws-cli/1.14.60 Python/3.6.4 Darwin/16.7.0 botocore/1.9.13
```


## プロファイルの設定

以下のコマンドを叩くと、いろいろ聞かれる

```Bash
$ aws configure
```

アクセスキーIDを入力してエンター

```
AWS Access Key ID [None]: xxxxxxxxxxxxxxxxxxxxxxxxx
```

シークレットアクセスキーを入力してエンター

```
AWS Secret Access Key [None]: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
```

デフォルトで呼び出しを実行する対象のリージョンを入力してエンター（ap-northeast-1 : 東京）

```
Default region name [None]: ap-northeast-1
```

デフォルトの出力形式は空のままエンターでスルー
json、text、tableから選ぶが、指定しなければjsonになる

```
Default output format [None]:
```


設定内容はこの2つのファイルに保存されてる

~/.aws/
　├ config
　└ credentials


また、slsコマンドでも設定できるとのこと
[serverless.com : AWS - Config Credentials](https://serverless.com/framework/docs/providers/aws/cli-reference/config-credentials/#aws---config-credentials)



上記はdefaultの設定をしているが、名前をつけて複数のプロファイルの設定もできる
[AWS Documentation : 名前付きプロファイル](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-multiple-profiles.html)


# プロジェクト
やっと準備できた...のでプロジェクト作っていく

## 作成
```Bash
$ mkdir testProject
$ cd testProject
$ sls create -t aws-python3
```

-t は どのランタイムかを指定で、以下のようなものを指定する

> - aws-nodejs
> - aws-nodejs-typescript
> - aws-python
> - aws-python3

あとはこっちでオプション一覧確認してみてください
[serverless.com : AWS - Create](https://serverless.com/framework/docs/providers/aws/cli-reference/create/#aws---create)



createを実行すると以下のようなファイルが作成される

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

- handler.py
    - Lambdaファンクション。作成時点では HelloWorld 的な中身になってる。
- serverless.yml
    - 設定ファイル。ファイルの中身やら[リファレンス](https://serverless.com/framework/docs/providers/aws/guide/serverless.yml/)やら読んで適切に設定しよう。


## ローカル実行
[ドキュメント](https://serverless.com/framework/docs/providers/aws/cli-reference/invoke-local/)見ると、Python、Node、Javaならローカルで実行できるっぽい（2018/03/30 時点）
>Currently, invoke local only supports the NodeJs, Python & Java runtimes.

コマンド叩いてみる

```Bash
$ sls invoke local -f hello

{
    "statusCode": 200,
    "body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": {}}"
}
```

データも渡せる

```Bash
$ sls invoke local -f hello -d "hoge"

{
    "statusCode": 200,
    "body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": \"hoge\"}"
}
```
こんなのも

```Bash
$ sls invoke local -f hello -d '{"foo":"bar"}'

{
    "statusCode": 200,
    "body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": {\"foo\": \"bar\"}}"
}
```
jsonファイルも

```JSON:data.json
{
    "aaaaa": "AAAAA",
    "bbbbb": {
        "ccccc": "CCCCC",
        "ddddd": "DDDDD"
    }
}
```

```Bash
$ sls invoke local -f hello -p ./data.json

{
    "statusCode": 200,
    "body": "{\"message\": \"Go Serverless v1.0! Your function executed successfully!\", \"input\": {\"aaaaa\": \"AAAAA\", \"bbbbb\": {\"ccccc\": \"CCCCC\", \"ddddd\": \"DDDDD\"}}}"
}
```



## デプロイ

```Bash
$ sls deploy
```

serverless.ymlに書いた設定でデプロイされる

## Lambdaの実行
デプロイしたLambda関数を実行する

```Bash
$ sls invoke -f hello
```
こっちもデータ渡せる

```Bash
$ sls invoke -f hello -d "hoge"
```

```Bash
$ sls invoke -f hello -d '{"foo":"bar"}'
```

```Bash
$ sls invoke -f hello -p ./data.json
```

## リソースの削除

これだけでデプロイしたリソースを削除してくれる

```Bash
$ sls remove
```

ローカルにあるのもいらないなら適当に ` $ rm -r testProject ` みたいな感じで消しちゃえばいいと思います