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!

slak

Lambdaの作成

golang

Lambdaの環境変数からSlackのWebhook URLを取得する

  • main.go
 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)
}
  • ./slack/slack.go
 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で圧縮する

1
$ zip main.zip main

SAM

AWS SAMを使ってみる を参考に、SAMのテンプレートを作成。

LambdaのEvent実行の定義、SlackのWebhook URLの環境変数への登録を追加

  • lambda-go-slack.yaml
 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にが通知が来てることを確認