lambda入門(Node) - serverless frameworkを使ってみる

こんにちは、lambdaとslackを連携させて
あれこれやってみたいと思っている@smith_30 です

ひとまず今回は、lambdaを使うにあたりやったことを書き残しておきたいと思います

## 使ったもの

OS: Mac

- Node
私がlambdaを書くに当たってつかえるのはjavascriptだけだったので。

- phpstorm
php書く際にお世話になっています、
フロントエンド範囲だったら大体なんでも便利にしてくれます。

- eslint
lambdaがサポートしているNodeのバージョンはv4なので
es6で書けるため。
phpstormに読み込ませて、文法を校正してもらう。

- serverless framework
https://github.com/serverless/serverless


## 準備

### phpstorm にeslintの設定を行う

eslintの設定は、google javascript style guideのものを使う

- インストール

```
$ npm install -g eslint eslint-config-google
```

- 設定ファイル作成

```eslintrc.json
{
  "parserOptions": {
    "ecmaVersion": 6
  },
  "extends": ["google"],
  "rules": {
    // Additional, per-project rules...
  }
}
```

- phpstormに読ませる

![e3d10d243ff703bb8347a2eb1956646e.png](https://qiita-image-store.s3.amazonaws.com/0/47896/1135d7eb-fba3-7dfc-1563-4ca2583ab116.png)

### serverless framework

amazonが出している[serverless framework的なやつ](https://github.com/awslabs/serverless-application-model)もあるのですが
gcpとかその他クラウドサービスでもserverlessで何かという場合に
柔軟でありたいと思いこちらにしました。

serverless.ymlのproviderのnameあたりいじればいい。
awsでないsampleは[こちらから](https://serverless.com/framework/docs/providers/)

- インストール

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

- awsのIAMを操作。Credential作成

1. IAMのページにアクセス→ユーザータブをクリック→ユーザーを追加をクリック  


2. アクセスの種類は「プログラムによるアクセス」


3. 既存のポリシーを直接アタッチ、AdministratorAccessを選択


4. ユーザーの作成を実行

- マシンに環境変数を設定

```
export AWS_ACCESS_KEY_ID=<your-key-here>
export AWS_SECRET_ACCESS_KEY=<your-secret-key-here>
```

- プロジェクト作成(スクラッチで始める)
- Or [Existing Services](https://github.com/serverless/serverless#how-to-install-a-service)から既存のプロジェクトを持ってきて使える

```
$ serverless create --template aws-nodejs --path testProject
Serverless: Generating boilerplate...
Serverless: Generating boilerplate in "/serverless/testProject"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.8.0
 -------'

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

```

- サービスのデプロイ

```
$ serverless deploy -v
```

プロジェクト内の全ての変更を反映させたいとき
(serverless.ymlの変更など)

serverless.ymlで指定されているデフォルトのリージョンはus-east-1なので
好きなところに編集しておくとよろしいかと。

- lambda function のデプロイ

```
$ serverless deploy function -f hello
```

ここ以降の`hello`は、プロジェクト作成時に入っているファイルを指す

```handler.js
'use strict';

module.exports.hello = (event, context, callback) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Go Serverless v1.0! Your function executed successfully!',
      input: event,
    }),
  };

  callback(null, response);

  // Use this code if you don't use the http event with the LAMBDA-PROXY integration
  // callback(null, { message: 'Go Serverless v1.0! Your function executed successfully!', event });
};
```

- lambda function を実行してデバッグ(AWSで行われる)

```
$ serverless invoke -f hello -l
```

こんな感じでレスポンス返ってきます。

```
{
    "statusCode": 200,
    "body": "{\"message\":\"Go Serverless v1.0! Your function executed successfully!!\",\"input\":{}}"
}
--------------------------------------------------------------------
START RequestId: 264f962d-0808-11e7-8ff3-1f23314ea4ee Version: $LATEST
END RequestId: 264f962d-0808-11e7-8ff3-1f23314ea4ee
REPORT RequestId: 264f962d-0808-11e7-8ff3-1f23314ea4ee	Duration: 2.02 ms	Billed Duration: 100 ms 	Memory Size: 1024 MB	Max Memory Used: 15 MB	
```


- function の実行ログを取得

```
$ serverless logs -f hello -t
```



- プロジェクトの削除

```
$ serverless remove
```

## まとめ

予想以上にseverless frameworkが便利、
簡単にlambdaでの開発が進みそう。

phpstorm で編集→エディタのターミナルからデプロイのサイクルが
回せるのは楽だなーと。

また、lambdaってデバッグとかどうすんだろーとか、
デプロイいちいちzipにしてやらずに済むこととかが明らかになった。

デプロイコマンド打つとs3にzipがアップされるので
本番でこいつを指定してやればlambdaの設定は完了なのかな。。

今後作りたいものは、dynamoDBとlambdaの連携とかしたいので
ローカルで開発どうすんだろーとか考えていきたい。
あと、slackからのリクエストをローカルでモックして開発とかか。
APIGateWayだっけか、そこと組み合わせるだろうから勉強しないと。。