そんな今日この頃の技術ネタ

本家側に書くほどでもない小ネタ用

Google Cloud Functions / Go111からSlackに投稿してみる

Google Cloud Functionsで新たにgolangが使えるようになったので、試しにHTTPリクエストをトリガーとしてSlackにメッセージを投稿してみるコードを組んでみた。

1. Slackトークンの取得

ひとまずSlack投稿のためのトークンを取得しておく必要がある。 (毎度Slackのトークン取得のたびにサイト内で迷子になる・・・)

api.slack.com


まずは新規アプリとして登録。仮にGCF-Slackとでも名付けておく。

f:id:blue1st:20190323021638p:plain


次に投稿できるようにPermissionとしてchat:write:botを設定。

f:id:blue1st:20190323021700p:plain


最後にInstall App to Workspaceでトークンを取得する。

f:id:blue1st:20190323021941p:plain


2. コードの記述

ひとまず、環境変数から

  1. 先程手に入れたSlackのトークン
  2. 宛先のChannelID
  3. 投稿メッセージ

を取り込んでポストするだけの簡単なものを書いてみた。

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内で指定したチャンネルに投稿されていることが確認できる。

f:id:blue1st:20190323030715p:plain



今回の事例だとSlackのincoming webhookを叩くのと変わらないのでさほど面白みは無いが、GCFでトリガーとしてURLが発行されるのでそれを指定してSlackのボタン投稿へのリアクションなんかもできるし(この辺は再度別記事で書きたい)、GCSやその他のトリガーを活用しても面白いことはできそうだ。