なる早でslackのスラッシュコマンドを作ってみる

# はじめに
`Serverless Framework`使えば割と簡単にスラッシュコマンド作れるのでは?と思いどれくらいで作成できるのか試してみました。
あんまりいいアイディアが出てこなかったので三角関数の値を返すスラッシュコマンドを作ろうと思います。

```
/tri-func sin 30
0.5
/tri-func cos 60
0.5
/tri-func tan 45
1.0
```
こんな感じで(`sinh`とか`conh`がないのは勘弁)

# APIを作る

## プロジェクトを作成

```
$ mkdir <project> && cd <project>
$ sls create -t aws-python3 -n tri-func  
```

```
$ tree
.
├── handler.py
└── serverless.yml
```

## pipenvの導入
標準の`math`ライブラリを使用してもいいのですが最近`serverless-python-requirements`の`dockerizePip`という依存関係があるライブラリをAmazonLinuxのDockerImageからビルドしてくれるものがあると知ったので、今回は`numpy`を使用して三角関数の値を返します。
今回は`pipenv`と`serverless-python-requirements`を使用してライブラリを使用します。

pipenvで仮想環境を作り`numpy`をインストールする

```
$ pipenv install --python 3.6.5
$ pipenv install numpy
```

serverless-python-requirementsのインストール

```
$ sls plugin install -n serverless-python-requirements
```

## serverless.ymlを編集

`profile`を指定しない場合は`default`が使用されます

```yml:serverless.yml
service: tri-func

provider:
  name: aws
  runtime: python3.6
  stage: stg
  region: ap-northeast-1
  profile: <hogehoge> #profileが複数あるので指定する

functions:
  get:
    handler: handler.get_tri
    events: #APIGatewayの設定
      - http: GET /

plugins:
  - serverless-python-requirements

custom:
  pythonRequirements:
    usePipenv: true # pipenvを使用する
    dockerizePip: non-linux # amazonlinuxでビルドする
```

## handler.pyを編集

```python:handler.py

import json
import numpy as np


def get_tri(event, context):
    # event['multiValueQueryStringParameters']['text']にコマンドの引数が入ってくる
    text = event['multiValueQueryStringParameters']['text'][0]
    text = text.split()

    try:
        tri = text[0]
        theta = int(text[1])
        if tri == 'sin':
            result = np.sin(np.pi*theta/180)
        elif tri == 'cos':
            result = np.cos(np.pi*theta/180)
        elif tri == 'tan':
            result = np.tan(np.pi*theta/180)
        else :
            result = 'エラー'
    except Exception as e:
        result = 'エラー'

    body = {
        'text': '結果: {}'.format(result),
    }

    response = {
        'statusCode': 200,
        'isBase64Encoded': False,
        'headers': {'Content-Type': 'application/json'},
        'body': json.dumps(body)
    }


    return response
```

## デプロイ

```
$ sls deploy -v

Serverless: Stack update finished...
Service Information
service: tri-func
stage: stg
region: ap-northeast-1
stack: tri-func-stg
resources: 9
api keys:
  None
endpoints: # URLをメモっておく
  GET - https://xxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/stg
functions:
  get: tri-func-stg-get
layers:
  None
```
デプロイを行うとエンドポイントが表示されるのでメモしておく

# Slackでスラッシュコマンドを登録する
Slack > 管理 > カスタムインテグレーション > Slash > 設定を追加　からCommands　からスラッシュコマンドを作成する

デプロイした際に表示されたエンドポイントをURLにペーストする
<img width="1013" alt="スクリーンショット 2019-02-28 17.00.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/ca903465-539f-fa37-1c61-e3fe4a7ead64.png">
そして作成！

# スラッシュコマンドを使ってみる
とりあえず`sin30`, `cos60`, `tan45`でテスト
<img width="444" alt="スクリーンショット 2019-02-28 17.02.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/6cf9da94-6b7c-1856-7fb1-79f8e79ffbfa.png">
<img width="328" alt="スクリーンショット 2019-02-28 17.04.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/98934f3d-cc7b-b2dc-8d7f-cc03bb0a6852.png">
<img width="323" alt="スクリーンショット 2019-02-28 17.05.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/166626/498791c5-7e2a-1ddd-295e-c01cb281ba93.png">

成功ですね(桁は許して)

# 結局どれくらいかかった？
`Serverless Framework`の環境が整っていればおそらく10分程度でスラッシュコマンドが作れるのではないでしょうか。
ちなみにこの記事を書きながら作成していたので私は約1時間くらいでした。