接之前AWS Lex 创建 Slack Bot - Integrating Lex Bot with Slack,介绍怎么在 slack app 的基础上添加 slash command。
slash command 的配置页面需要一个 Request URL,这个 URL 就由 AWS API Gateway 来提供,API Gateway 调用 AWS Lambda 来完成具体的动作,而 Lambda 需要一个 slack token 来验证 slack app 的身份,才能够调用 slack api 来接收/回复信息,这个 token 由 AWS IAM 进行加密保障安全性。下面的教程分别介绍了怎么加密 token,编写 Lambda,配置 API Gateway,来完成一个 slash command 的创建。
Encrypt KMS Key
Step 1: 在 IAM console 创建一个 KMS key,记录下 key-id,后面需要用到。
Step 2: 在 slack apps 选择你的 app,然后在 Basic Information
下的 App Credentials
部分找到 Verification Token
,记录下来,这就是我们需要加密的 token。
Step 3: 我们的目的是用 Step 1 创建的 key 来对 Step 2 记录的 token 进行加密。如果电脑已经装了 awscli,那么直接在命令行输入下面的命令即可。
其中 key-id 就是开始记录下的 kms key id,text 就是 verification token,把产生的 CiphertextBlob
记录下来,在下一步 Lambda Configuration 里要用。
如果没有安装 aws-cli,OSX 系统直接用 brew
命令安装一下,最好不要用 pip
,很大概率会出问题。
|
|
装好后,aws --version
查看是否安装成功, aws configure
命令来配置账户信息,会要求输入
- AWS Access Key ID: 在 aws console 的
My Security Credentials
下 - AWS Secret Access Key: 现在必须创建一个 IAM user 才能得到,戳 create IAM user)
- Default region name: 根据实际情况填,如果是 US East (N. Virginia),就填
us-east-1
,注意不要在末尾加 abcd,us-east-1a
类似的格式会出错 - Default output format: 可以不填
配置完正常进行加密即可。
Lambda Configuration
Lambda blueprint 选 slack-echo-command
,创建 lambda function slashTest
,这里要实现的是当用户 [user] 调用 /test 这个 [command] 时(之后会创建)并输入文本 [text] 时,返回 [user] invoked [command,e.g., /test] in [channel,eg., directmessage] with the following text: [text]"
。代码如下
|
|
配置需要注意的是 Role 的选择,默认从 templates 里选 kmsDecrypt
,不用修改,加个名字就好。在 Environment variables
里填写上一部分记录下的加密后的 token。但是!代码里请不要修改!!
API Gateway Configuration
关于基础的 API Gateway 教程,见 AWS API Gateway + Lambda 教程 - 生成随机数
在 aws console 页面的 Services -> Application Service -> API Gateway 下新建 API,然后在 Action 下拉框下 Create Resource,名称可以写 /test,然后继续 Create Method ,选 POST,Lambda Function 选择之前我们已经建好的 slashTest
,保存后在新页面选择 Integration Request,新建一个 mapping template,如下:
Content-Type: application/x-www-form-urlencoded
Template: { "body": $input.json("$") }
之后部署,Actions -> Deploy API,记下完成页面显示的 Invoke URL。
Slack App Configuration
回到 slack app 页面,选择左侧的 Slash Commands,新建一个 Command,Request URL 填写上一部分记录下来的地址,注意将 sub resource name 补充完整,这里是 /test。完成后记得 reinstall app
返回结果:
如果要返回 plain text,直接修改 lambda function,