Google Cloud Functionsで新たにgolangが使えるようになったので、試しにHTTPリクエストをトリガーとしてSlackにメッセージを投稿してみるコードを組んでみた。
1. Slackトークンの取得
ひとまずSlack投稿のためのトークンを取得しておく必要がある。 (毎度Slackのトークン取得のたびにサイト内で迷子になる・・・)
まずは新規アプリとして登録。仮にGCF-Slackとでも名付けておく。
次に投稿できるようにPermissionとしてchat:write:bot
を設定。
最後にInstall App to Workspace
でトークンを取得する。
2. コードの記述
ひとまず、環境変数から
- 先程手に入れたSlackのトークン
- 宛先のChannelID
- 投稿メッセージ
を取り込んでポストするだけの簡単なものを書いてみた。
package p import ( "fmt" "github.com/nlopes/slack" "net/http" "os" "time" ) func PostMessage(w http.ResponseWriter, r *http.Request) { client := &http.Client{ Timeout: 10 * time.Second, } slack.OptionHTTPClient(client) token := os.Getenv("SLACK_TOKEN") api := slack.New(token) channelID := os.Getenv("CHANNEL_ID") message := os.Getenv("MESSAGE") msgOptText := slack.MsgOptionText(message, true) _, _, err := api.PostMessage(channelID, msgOptText) if err != nil { fmt.Fprintf(w, "error: %v", err) return } fmt.Fprint(w, "success!") }
また、おなじみのgo mod init
をやっておく。
$ go mod init gcf-slack go: creating new go.mod: module gcf-slack
3. 環境変数の定義
先のコードで記述したように環境変数に諸々の固有情報を記述しておきたい。
以下のようなvars.yamlファイルを作成。それぞれ適時記入しておく。
CHANNEL_ID: <YOUR_SLACK_CHANNEL_ID> MESSAGE: <MESSAGE> SLACK_TOKEN: <YOUR_SLACK_TOKEN>
4. デプロイ
gcloud functions deploy
コマンドでファンクション名・トリガーの種別・実際に叩く関数名・ランタイム・先の環境変数の定義ファイルを指定してデプロイを実行する。
成功すれば下記のような形で実際のURLも表示される。
$ gcloud functions deploy gcf-slack --trigger-http --entry-point=PostMessage --runtime=go111 --env-vars-file=./vars.yaml Deploying function (may take a while - up to 2 minutes)...done. availableMemoryMb: 256 entryPoint: PostMessage environmentVariables: CHANNEL_ID: XXXXX MESSAGE: Test! SLACK_TOKEN: XXXXXXXXXXXXXXXXXX httpsTrigger: url: https://xxxxxxxx.cloudfunctions.net/gcf-slack labels: deployment-tool: cli-gcloud name: projects/project-id-xxxxxxx/locations/us-central1/functions/gcf-slack runtime: go111
実際にアクセスしてみると、コードに記述したように「Success!」の文字が表示され、yaml内で指定したチャンネルに投稿されていることが確認できる。
今回の事例だとSlackのincoming webhookを叩くのと変わらないのでさほど面白みは無いが、GCFでトリガーとしてURLが発行されるのでそれを指定してSlackのボタン投稿へのリアクションなんかもできるし(この辺は再度別記事で書きたい)、GCSやその他のトリガーを活用しても面白いことはできそうだ。