Slackの設定
Incoming WebHooks
Incoming WebHooksを使って、Lambdaからメッセージ送信をする。
詳細は割愛しますが、ドキュメント [Slack API] (https://api.slack.com/incoming-webhooks
) をみると使い方は簡単です。
Slackの管理画面https://XXXXXXXX.slack.com/apps
からIncoming WebHooksの設定を行い、Webhook URLが取得できたら、curlコマンドでテストしてみる。
1
2
3
| $ curl -X POST -H 'Content-type: application/json' \
--data '{"text":"This is a line of text.\nAnd this is another one."}' \
https://hooks.slack.com/services/000000000/000000000/XXXXXXXXXXXXXXXXXXXXXXXX
|
こんな感じで送信されれば準備OK!
Lambdaの作成
golang
Lambdaの環境変数からSlackのWebhook URLを取得する
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| package main
import (
"context"
"os"
slack "./slack"
"github.com/aws/aws-lambda-go/lambda"
)
func HandleRequest(ctx context.Context) (string, error) {
var slackURL = os.Getenv("slackURL") // Get Environment Variables
sl := slack.NewSlack(slackURL, "This is a line of text.\nAnd this is another one.", "user", ":eyes:", "", "#random")
sl.Send()
return "", nil
}
func main() {
lambda.Start(HandleRequest)
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| package slack
import (
"encoding/json"
"log"
"net/http"
"net/url"
)
type slack struct {
params params
url string
}
type params struct {
Text string `json:"text"`
Username string `json:"username"`
IconEmoji string `json:"icon_emoji"`
IconURL string `json:"icon_url"`
Channel string `json:"channel"`
}
func NewSlack(url string, text string, username string, iconEmoji string, iconURL string, channel string) *slack {
p := params{
Text: text,
Username: username,
IconEmoji: iconEmoji,
IconURL: iconURL,
Channel: channel}
return &slack{
params: p,
url: url}
}
func (s *slack) Send() {
params, _ := json.Marshal(s.params)
resp, err := http.PostForm(
s.url,
url.Values{"payload": {string(params)}},
)
if err != nil {
log.Print(err)
return
}
defer resp.Body.Close()
}
|
待望のAWS LambdaのGolang対応!
を参考に、コンパイルする。
コンパイル
Linux用のコンパイルなのでGOOS=linuxを指定します。
1
| $ GOOS=linux go build -o main
|
ファイル圧縮
Lambdaにアップロードするためにzipで圧縮する
SAM
AWS SAMを使ってみる
を参考に、SAMのテンプレートを作成。
LambdaのEvent実行の定義、SlackのWebhook URLの環境変数への登録を追加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| AWSTemplateFormatVersion : '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: lambda go send to slack.
Resources:
SendSlack:
Type: AWS::Serverless::Function
Properties:
Handler: main
Runtime: go1.x
CodeUri: "main.zip"
# CloudWatch Event設定(毎分起動)
Events:
Timer:
Type: Schedule
Properties:
Schedule: cron(* * * * ? *)
# 環境変数
Environment:
Variables:
slackURL: https://hooks.slack.com/services/000000000/000000000/XXXXXXXXXXXXXXXXXXXXXXXX
|
デプロイ
1
2
3
4
5
| $ aws cloudformation package \
--template-file ./lambda-go-slack.yaml \
--s3-bucket techteco.sample.bucket \
--s3-prefix lambda-go-sample \
--output-template-file packaged-template.yaml
|
1
2
3
4
| $ aws cloudformation deploy \
--template-file packaged-template.yaml \
--stack-name sampleLambdaGoSlack \
--capabilities CAPABILITY_IAM
|
結果
デプロイが完了すると毎分Slackにが通知が来てることを確認