Serverlessフレームワークを使ってSlackで遊ぶ

この記事は [Node.js Advent Calendar 2015](http://qiita.com/advent-calendar/2015/nodejs) の 22日目の記事です。

今年はNode.jsにとって大きな変革となる1年となりました。
1年間追いかけていて、とても面白かったし、勉強になりました。
使用される場面も増えてきていると感じるので、来年はさらに盛り上がるといいなぁと思います！

では本題に入ります。

[Serverless Framework](https://github.com/serverless/serverless)はAWSを使用して、サーバーレスなアプリケーションを作成できるフレームワークです。Node.js v4で動作確認がされていて、npmを使用してインストールします。
Serverless自体の詳細については[こちら](http://qiita.com/susieyy/items/1c2af0ef7b88b742c37a)の記事がわかりやすかったです。

今日はそのServerlessを使用してもう少し遊んでみようかなと思います。
サーバのことを考えずに、簡単にアプリケーションを作成できることを実感していただければと思います。

それでは、[こちら](https://github.com/serverless/serverless-slackbot)を参考に、Slackのbotを作成してみましょう！
だいたいはREADME.mdに沿ってやっていくだけですが、少し詰まる箇所があったので追記していきます。

---

①Serverlessをインストールし、設定を行う。

- [こちら](http://qiita.com/susieyy/items/1c2af0ef7b88b742c37a)の記事を参考にしてください。

②Serverlessプロジェクトを作成する。

- `$ serverless project create`
- 対話的にプロジェクト名、ドメイン、メールアドレス、ACCESS KEY ID、SECRET ACCESS KEYを入力し、リージョンを選択してください。
- `Serverless: Successfully created project: xxx` と表示されたらOKです。

③作成したプロジェクトに `cd` し、 `serverless-slackbot` をインストールする。

- `$ serverless module install https://github.com/serverless/serverless-slackbot`
- `Serverless: Successfully installed serverless-slackbot module.` と表示されたらOKです。
- `s-project.json` がなんらかの理由で作成されなかった場合は `{ [ServerlessError: Must be in a Serverless project] name: 'ServerlessError', messageId: 12 }` とエラーが出ます。僕はプロジェクトを作成し直しました。

④リソースをAWSにデプロイする。

- `$ serverless resources deploy`
- リージョンを選択してエンターを押下してください。
- `Serverless: Resource Deployer:  Successfully deployed development resources to どっか` と表示されたらOKです。

⑤functionとエンドポイントをデプロイする。

- `$ serverless dash deploy`

 ```
serverless-slackbot - authorize
  function - authorize
  endpoint - slackbot/authorize - GET
serverless-slackbot - incoming
  function - incoming
  endpoint - slackbot/incoming - POST
```
を全て選択して、 `Deploy` でエンターを押下し、リージョンを選択してください。

- `GET` のエンドポイントと `POST` のエンドポイントが出力されることを確認し、忘れないようにメモしておいてください。

⑥Slackを設定する。

- [https://api.slack.com/applications](https://api.slack.com/applications)から`Create a new application` を押下してください。
- 必要事項を入力してください。 `Redirect URI(s)` には上でメモした `GET` のエンドポイントのURLを入力してください。
- 発行される `Client ID` 、 `Client Secret` の値をメモしておいてください。

⑦Slash Commandsを作成する。

- Commandは何でも構いません（ここでは `/command` とします）。
- Request URLに上でメモした `POST` のエンドポイントのURLを入力してください。

- 表示された `Verification Token` の値をメモしておいてください。

⑧Bot Userを作成する。

- 適当な名前を入力してBotユーザーを作成してください。

⑨環境変数を設定する。

 - `$ serverless env set` コマンドで以下の環境変数を設定してください。
 - SLACK_OAUTH_CLIENT_IDに上でメモした`Client ID`
 - SLACK_OAUTH_CLIENT_SECRETに上でメモした`Client Secret`
 - SLACK_TOKENに上でメモした`Verification Token`
 - SERVERLESS_PROJECT_NAMEには適当な名前を入力してください。

- `Serverless: Enter env var key to set a value to:` と表示されたらキーを、`Serverless: Enter env var value to set to the provided key:` `と表示されたらバリューを入力してください。

- 設定できたかは `$ serverless env list` で確認してください。
- `$ serverless function deploy` コマンドを実行して設定を反映させてください。以下の2つのfunctionをデプロイしてください。
 ```
 function - authorize
function - incoming
```

⑩Slackユーザーを設定する。

- [https://slack.com/oauth/authorize?scope=incoming-webhook+commands+bot+team%3Aread+users%3Aread+chat%3Awrite%3Abot+emoji%3Aread+reactions%3Awrite&client_id=YOURSLACKCLIENTIDGOESHERE](https://slack.com/oauth/authorize?scope=incoming-webhook+commands+bot+team%3Aread+users%3Aread+chat%3Awrite%3Abot+emoji%3Aread+reactions%3Awrite&client_id=YOURSLACKCLIENTIDGOESHERE)
（YOURSLACKCLIENTIDGOESHEREは上でメモしたID） にアクセスしてチャンネルなどの設定を行ってください。

⑪確認する。

- Slack上で `/command help` コマンドで `You don\'t need an alarm clock, let your dreams wake you.` と表示されたらOKです。

⑫修正する。

- 多少バグがあるようなので練習も兼ねて修正しましょう。
 - この記事を投稿し終わったらソースをちゃんと読んでPR送ってみようかなと思ってます。

- `/back/modules/serverless-slackbot/lib/skills/team_list.js`
の `'list'` を `null` に変更してください。

```
module.exports = function(SlackBot) {

  SlackBot.addSkill('team', 'list', function(event, context, body, slackTeam) {

    // 中略

  });
};
```

を

```
module.exports = function(SlackBot) {

  SlackBot.addSkill('team', null, function(event, context, body, slackTeam) {

    // 中略

  });
};
```

に修正してください。

- `$ serverless function deploy` でデプロイしたら、 `/command team` コマンドが使用できるかと思います。
- このようにJSファイルを修正することで、ハンドルするイベントを増やしたり、APIを使用したりできます。

# まとめ
  - サーバーレスで簡単にアプリを作成できて夢が広がりますね！
  - AWSやLambdaもこれから触って勉強していきたいと思います！！！！！！！

## おまけ(npmにコントリビュートする方法)
[npm-expansions](https://github.com/npm/npm-expansions)というリポジトリがあります。

下の画像のように、[npmのページ](https://www.npmjs.com)の左上にランダムで表示される、略すとnpmになる3語の言葉を募集しているリポジトリです。

<img width="443" alt="スクリーンショット 2015-12-22 12.09.59.png" src="https://qiita-image-store.s3.amazonaws.com/0/45771/13b4ebb6-95e5-8eb8-1bed-c6f0c406ad19.png">

~~僕が面白いのを思いつかなかったので、~~もし何か思いついた方は是非PRを送ってみるといいかと思います。

それではメリークリスマス&良いお年を！