【入門編】API Gateway/Lambda/S3を使った初めてのSlashコマンド作成

記事タイトルとURLをコピーする

コロナウイルスの影響で在宅勤務になっていることもあり、ファシリティを買い揃えたくてウズウズしているCI部5課の山﨑です。

今回はLambdaの学習の一貫として簡単なSlackコマンドを作成してみました。今回はとにかくSlashコマンドを作成して動かしみるということに主眼を置いているので作成した関数コードの中身は大目に見てください笑

今回作るもの

構成はシンプルです

  • SlackからSlashコマンドを入力(リクエスト先はAPIエンドポイント)
  • API GatewayからLambdaを呼び出す
  • Lambda関数でS3からレスポンスに必要な文章が書かれたテキストファイルを読み込む
  • 読み込んだテキストファイルの内容をレスポンスとして返す

今回はSlash Commandの引数にserverworksと渡すと、サーバーワークスのビジョンが書かれた文章がレスポンスとして返ってくるという仕様にしています。

いざ実践!!

S3作成

まずはS3から作成していきます。バケット名はslash-commands-testとし、サーバーワークスのビジョンが書かれたserverworks.txtというテキストファイルをアップロードしておきます

LambdaとAPI Gatewayの作成

「設計図の使用」を選択し、「slack-echo-command-python」を選択

Function nameは任意の値を入れます。今回はslash-commandsにしています。roleに関しては今回はS3へのアクセス許可をする必要があるので「AmazonS3FullAccess」をアタッチしたrole-lambdaexecというロールを作成して設定しました。

APIは「新規APIの作成」を選択しテンプレートはREST APIを、セキュリティはオープンとして関数を作成します。作成後の関数はランタイムがデフォルトでPython2.7が設定されているのでPython3.6に変更しました。

import boto3
from urllib import parse

s3 = boto3.client('s3')

def lambda_handler(event, context):
    # Slashコマンドから送られてきた引数の文字列を取得
    text = parse.parse_qs(event['body'])['text'][0]
    
    # Slashコマンドの引数がserverworksだったらS3からserverworks.txtの本文を取得してレスポンスを返す
    if text == 'serverworks':
        sentence = s3.get_object(Bucket='slash-commands-test', Key='serverworks.txt')
            
        response = {
            "statusCode": 200,
            "body": format(sentence['Body'].read().decode('utf-8'))
        }
        return response

こちらが今回使用する関数です。

関数を保存したら、API GatewayのAPIエンドポイントを確認します。このAPIエンドポイントは後の工程で使用します

Slashコマンドの作成

以下に示す画像の手順通りに進めていけばコマンドを作成することができます。

Slashコマンドは任意の値を入れてください

URLにAPIエンドポイントのURLを入力して保存すればSlashコマンド完成で〜す!!

Slashコマンドの検証

では早速Slashコマンドを叩いてみます。

無事にレスポンスが返ってきました!!

まとめ

初めてSlashコマンドを作成してみましたが、うまく使えば業務改善にかなり有効だなと思いました!それにLambdaを使えばわざわざサーバーを立てる必要がないので、その点も気軽に開発できるポイントですね!

次は他サービスのAPIと連携させたコマンドを作ってみたいと思います!!