Slide 1

Slide 1 text

GoogleCloudFunctionsでHTTP フックなGoスクリプトを書く 2019/03/20(水) Makuake LT Party #11

Slide 2

Slide 2 text

convto jisibari Twitter: @convto Github: convto 2

Slide 3

Slide 3 text

もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった! - 嬉しかったこと - 困ったこと - まとめ

Slide 4

Slide 4 text

もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった! - 嬉しかったこと - 困ったこと - まとめ

Slide 5

Slide 5 text

GoogleCloudFunctionsって? - Runtimeもnodeとかpythonとかgoとか似たようなも ん - Lambdaみたいにプロバイダ側のマネージドサービ スとかの Event hook で動かせる - Log はstackdriver(cloudwatchみたいなやつ)に飛ば します

Slide 6

Slide 6 text

GoogleCloudFunctionsって? - Runtimeもnodeとかpythonとかgoとか似たようなも ん - Lambdaみたいにプロバイダ側のマネージドサービ スとかの Event hook で動かせる - Log はstackdriver(cloudwatchみたいなやつ)に飛ば します lambdaのGCP版

Slide 7

Slide 7 text

GoogleCloudFunctionsって? - Runtimeもnodeとかpythonとかgoとか似たようなも ん - Lambdaみたいにプロバイダ側のマネージドサービ スとかの Event hook で動かせる - Log はstackdriver(cloudwatchみたいなやつ)に飛ば します lambdaのGCP版 https://cloud.google.com/functions/feature s/

Slide 8

Slide 8 text

コンソールはこんな感じ

Slide 9

Slide 9 text

コンソールはこんな感じ Goがコンソールで書ける!

Slide 10

Slide 10 text

めっちゃうれしい(lambdaはできない)

Slide 11

Slide 11 text

もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった! - 嬉しかったこと - 困ったこと - まとめ

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

2019/1/17

Slide 15

Slide 15 text

2019/1/17 めっちゃ最近!!! 

Slide 16

Slide 16 text

lambdaとの違い - デプロイするのがソースコードzip(lambdaはバイナ リzip) - 作った関数がGoogleCloudFunctions側のmain関数 から呼ばれる(lambdaはユーザーがmainを書く) - 依存の解決とかもGCF側でやる

Slide 17

Slide 17 text

lambdaとの違い - デプロイするのがソースコードzip(lambdaはバイナ リzip) - 作った関数がGoogleCloudFunctions側のmain関数 から呼ばれる(lambdaはユーザーがmainを書く) - 依存の解決とかもGCF側でやる GCFの方は、自分で書くスクリプトは あくまでパッケージとして提供する

Slide 18

Slide 18 text

lambdaとの違い - デプロイするのがソースコードzip(lambdaはバイナ リzip) - 作った関数がGoogleCloudFunctions側のmain関数 から呼ばれる(lambdaはユーザーがmainを書く) - 依存の解決とかもGCF側でやる GCFの方は、自分で書くスクリプトは あくまでパッケージとして提供する package名はmainだとダメ 起動する関数は大文字スタートじゃなきゃダ メ(exportしないとエラー)

Slide 19

Slide 19 text

さわってみたい!(触ってみました)

Slide 20

Slide 20 text

もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった! - 嬉しかったこと - 困ったこと - まとめ

Slide 21

Slide 21 text

作ったやつ(DEMO)

Slide 22

Slide 22 text

つくったやつ - custom emoji manager - help機能(hidden message) - list機能(hidden message) - stamp機能

Slide 23

Slide 23 text

Slack slash command にした理由 - ざっくりAPI立ててすぐに使える - とはいえこいつのためにサーバー借りるとかはだ るい - 粒度がちょうどFaaSに向いてそう!!

Slide 24

Slide 24 text

ざっくりやってるこ - 入力を見てhelp, list, stampのいずれかを実行 - listは emoji.list とかでとってる - stampは chat.postMessage とか chat.postEphemeral とかを使ってる

Slide 25

Slide 25 text

ざっくりやってるこ - 入力を見てhelp, list, stampのいずれかを実行 - listは emoji.list とかでとってる - stampは chat.postMessage とか chat.postEphemeral とかを使ってる SlackAPI: https://api.slack.com/web

Slide 26

Slide 26 text

もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった! - 嬉しかったこと - 困ったこと - まとめ

Slide 27

Slide 27 text

HTTPホックの関数を作りやすい - Lambdaだとapi-gatewayとかALBをつくって紐づける 必要がある - CloudFunction は関数作成時にすごく雑に選択し て作れる

Slide 28

Slide 28 text

No content

Slide 29

Slide 29 text

もしかしたら内部的には LB的なのを自動生成してるのかも... (まだ追ってないです)

Slide 30

Slide 30 text

net/http.Handlerで処理かける - 普通のハンドラ関数書くのと同じ書き方でかけ る! - requestからの情報の取り方、responseの返し方ま で同じ! - Middleware, ライブラリなど、net/httpにまつわるエ コシステムに乗れる!

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

ハンドラ書くのと全く同じ

Slide 33

Slide 33 text

ちなみにlambdaだと

Slide 34

Slide 34 text

ちなみにlambdaだと net/http系の資産をうまく使うために こういうプロジェクトもあるらしいです https://github.com/awslabs/aws-lambda-g o-api-proxy

Slide 35

Slide 35 text

もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった! - 嬉しかったこと - 困ったこと - まとめ

Slide 36

Slide 36 text

ひとつめ

Slide 37

Slide 37 text

どうしても複数ファイル構成でデプロイできない - ドキュメントをしっかり見てサンプル構成に合わせ てもできない - HTTP + Go の構成だと相性が悪いのかもしれない (まだbetaだし仕方ないかも)

Slide 38

Slide 38 text

どうしても複数ファイル構成でデプロイできない - ドキュメントをしっかり見てサンプル構成に合わせ てもできない - HTTP + Go の構成だと相性が悪いのかもしれない (まだbetaだし仕方ないかも) ドキュメント https://cloud.google.com/functions/docs/c oncepts/go-runtime

Slide 39

Slide 39 text

どうしても複数ファイル構成でデプロイできない - ドキュメントをしっかり見てサンプル構成に合わせ てもできない - HTTP + Go の構成だと相性が悪いのかもしれない (まだbetaだし仕方ないかも) ドキュメント https://cloud.google.com/functions/docs/c oncepts/go-runtime 仕方ないので今回は処理をまとめた パッケージを作りreleaseを切って functionからimportして対応しました

Slide 40

Slide 40 text

Slide 41

Slide 41 text

Go1.12系で発行したgo.modがあるとインポートできない - Go1.12で発行したgo.modはGo1.11.3以前のランタ イムでは解決できない - GoogleCloudFunctionsは多分ランタイムが1.11.3以 下 - そのためgo.modをGo1.12で発行した一部パッケー ジが使えない

Slide 42

Slide 42 text

Go1.12系で発行したgo.modがあるとインポートできない - Go1.12で発行したgo.modはGo1.11.3以前のランタ イムでは解決できない - GoogleCloudFunctionsは多分ランタイムが1.11.3以 下 - そのためgo.modをGo1.12で発行した一部パッケー ジが使えない さっきの対応として作ったパッケージで 綺麗に踏み抜いた

Slide 43

Slide 43 text

Go1.12系で発行したgo.modがあるとインポートできない - Go1.12で発行したgo.modはGo1.11.3以前のランタ イムでは解決できない - GoogleCloudFunctionsは多分ランタイムが1.11.3以 下 - そのためgo.modをGo1.12で発行した一部パッケー ジが使えない さっきの対応として作ったパッケージで 綺麗に踏み抜いた go本体のIssue https://github.com/golang/go/issues/30446

Slide 44

Slide 44 text

Slide 45

Slide 45 text

slackのemoji.listのパースが面倒

Slide 46

Slide 46 text

slackのemoji.listのパースが面倒 keyが動的に変わるので面倒

Slide 47

Slide 47 text

こんな感じでやりました

Slide 48

Slide 48 text

こんな感じでやりました mapで取れるっぽい

Slide 49

Slide 49 text

こんな感じでやりました mapで取れるっぽい 階層が多段になってもnestしたmapで 受け取れます

Slide 50

Slide 50 text

Slide 51

Slide 51 text

Slash comandで送られるリクエストの形式が不思議 - Postでbodyにquery形式の値が入ってる - bodyをstringで受け取った後にnet/url.ParseQuery() とかしてます - 変な感じします

Slide 52

Slide 52 text

こういうのがきました

Slide 53

Slide 53 text

もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった! - 嬉しかったこと - 困ったこと - まとめ

Slide 54

Slide 54 text

まとめ - net/http.Handler で処理かけるのがかなりいい - HTTPで公開する手間がかなり少ない - デプロイは依存解決周りがまだ辛い印象 - slackのAPI、ちょっとレガシー感ある

Slide 55

Slide 55 text

まとめ - net/http.Handler で処理かけるのがかなりいい - HTTPで公開する手間がかなり少ない - デプロイは依存解決周りがまだ辛い印象 - slackのAPI、ちょっとレガシー感ある 単一ファイルのスクリプトで完結する 小さい処理ならめっちゃ幸せになれる

Slide 56

Slide 56 text

まとめ - net/http.Handler で処理かけるのがかなりいい - HTTPで公開する手間がかなり少ない - デプロイは依存解決周りがまだ辛い印象 - slackのAPI、ちょっとレガシー感ある 単一ファイルのスクリプトで完結する 小さい処理ならめっちゃ幸せになれる Goでちょっとしたスクリプト書いて APIにしたいケースならこれで決定 だと思います

Slide 57

Slide 57 text

今回書いたコードここに置いてあります〜 - https://github.com/srttk/cmoji - function.goをそのままGoogleCloudFunctionsに貼り 付けると動く - 雑なのでそのうち整理します(ほんまか?)

Slide 58

Slide 58 text

今回書いたコードここに置いてあります〜 - https://github.com/srttk/cmoji - function.goをそのままGoogleCloudFunctionsに貼り 付けると動く - 雑なのでそのうち整理します(ほんまか?) modulesで参照してるので 書き換えるたびにタグリリースしてます

Slide 59

Slide 59 text

今回書いたコードここに置いてあります〜 - https://github.com/srttk/cmoji - function.goをそのままGoogleCloudFunctionsに貼り 付けると動く - 雑なのでそのうち整理します(ほんまか?) modulesで参照してるので 書き換えるたびにタグリリースしてます はやくzipでデプロイでしたい

Slide 60

Slide 60 text

- プレゼンテーションテーマは SlidesCarnival の ヨークプレゼンテーションテンプレー ト を利用しています クレジット表記

Slide 61

Slide 61 text

ご静聴ありがとう ございました