1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Lambda関数(Go)でSlack通知

Last updated at Posted at 2021-08-20

はじめに

CICDの一環でGoのLambdaからSlack通知をする仕組みを構築したのでその備忘録を残す。
(CICDという事でリリース作業を想定したSlack通知を作ってみた。また、AWS ChatbotでSlackからLambda関数(Go)を呼び出すの続きで構築した。)

Lambdaの実装

今回はhttp POSTを自分でやるのではなく、slack-go(Slack API)を利用する

Slack Appの作成・Tokenの発行

slack-goを使うにあたってはSlack Appと認証のためのTokenが必要になるので、それらを作成・発行する
そのやり方はこちらが分かりやすいのでそれを参照

slack-goのclientを使って通知の実装

github.com/slack-go/slackを依存関係に加える(importする)

go get package github.com/slack-go/slack

コマンドの実行により、go.modgo.sumにそれぞれ依存関係が追記される
go.mod(Go Modules)を利用せず、GOPATHモード(go getしたものが$GOPATH/srcに入りそれを参照する)の方式の場合は、go get github.com/slack-go/slack

package main

import (
   // 省略
   "fmt"
   "os"
   "strings"
   "github.com/slack-go/slack"
)

var Config = struct {
	// 省略
}{}

type Event struct {
	// 省略
}

func HandleRequest(ctx context.Context, event Event) (string, error) {
	configor.Load(&Config, "config.yaml")

	// 省略

	res, err := slackNotification(event)
	fmt.Println("res", res)
	fmt.Println("err", err)

	return fmt.Sprintf("Module %s", event.Modules), nil
}

func slackNotification(event Event) (string, error) {
	client := slack.New(os.Getenv("SLACK_API_TOKEN"))

	headerText := slack.NewTextBlockObject("mrkdwn", "<!channel>\nこれより *"+event.TargetEnv+"環境* リリース作業を実施致します。\n完了後、通知致します。", false, false)
	headerSection := slack.NewSectionBlock(headerText, nil, nil)

	complete := slack.NewTextBlockObject("mrkdwn", "*完了予定*\n15分", false, false)
	target := slack.NewTextBlockObject("mrkdwn", "*対象環境*\n"+event.TargetEnv, false, false)
	module := slack.NewTextBlockObject("mrkdwn", "*対象サービス*\n"+strings.Join(event.Modules, ", "), false, false)
	fieldSlice := make([]*slack.TextBlockObject, 0)
	fieldSlice = append(fieldSlice, complete)
	fieldSlice = append(fieldSlice, target)
	fieldSlice = append(fieldSlice, module)
	fieldsSection := slack.NewSectionBlock(nil, fieldSlice, nil)

	_, _, err := client.PostMessage(os.Getenv("SLACK_CHANNEL"), slack.MsgOptionBlocks(headerSection, fieldsSection))
	if err != nil {
		fmt.Printf("%s\n", err)
		return fmt.Sprintf("Fail slack notification\nError message is \"%s\"", err), nil
	}
	return "Success slack notification", nil
}

func main() {
	lambda.Start(HandleRequest)
}

ソースコード全体ははじめにを参照
Slackのメッセージを作るにあたって参考になるのは以下

os.Getenv(・・・)は環境変数でLambdaの「設定>環境変数」に以下のように設定している
image.png

実際にSlackに通知されたメッセージは以下のようになる
image.png

参考文献

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?