Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GoogleCloudFunctionsでHTTPフックなGoスクリプトを書く / Write HTTP hook Go script with GoogleCloudFunctions

66487f93d23ed4f64752cffbafdb938a?s=47 convto
March 20, 2019

GoogleCloudFunctionsでHTTPフックなGoスクリプトを書く / Write HTTP hook Go script with GoogleCloudFunctions

google cloud functions 触ったメモ

66487f93d23ed4f64752cffbafdb938a?s=128

convto

March 20, 2019
Tweet

More Decks by convto

Other Decks in Technology

Transcript

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

  2. convto jisibari Twitter: @convto Github: convto 2

  3. もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった!

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

    - 嬉しかったこと - 困ったこと - まとめ
  5. GoogleCloudFunctionsって? - Runtimeもnodeとかpythonとかgoとか似たようなも ん - Lambdaみたいにプロバイダ側のマネージドサービ スとかの Event hook で動かせる

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

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

    - Log はstackdriver(cloudwatchみたいなやつ)に飛ば します lambdaのGCP版 https://cloud.google.com/functions/feature s/
  8. コンソールはこんな感じ

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

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

  11. もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった!

    - 嬉しかったこと - 困ったこと - まとめ
  12. None
  13. None
  14. 2019/1/17

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

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

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

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

    あくまでパッケージとして提供する package名はmainだとダメ 起動する関数は大文字スタートじゃなきゃダ メ(exportしないとエラー)
  19. さわってみたい!(触ってみました)

  20. もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった!

    - 嬉しかったこと - 困ったこと - まとめ
  21. 作ったやつ(DEMO)

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

    message) - stamp機能
  23. Slack slash command にした理由 - ざっくりAPI立ててすぐに使える - とはいえこいつのためにサーバー借りるとかはだ るい -

    粒度がちょうどFaaSに向いてそう!!
  24. ざっくりやってるこ - 入力を見てhelp, list, stampのいずれかを実行 - listは emoji.list とかでとってる -

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

    stampは chat.postMessage とか chat.postEphemeral とかを使ってる SlackAPI: https://api.slack.com/web
  26. もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった!

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

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

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

    コシステムに乗れる!
  31. None
  32. ハンドラ書くのと全く同じ

  33. ちなみにlambdaだと

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

  35. もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった!

    - 嬉しかったこと - 困ったこと - まとめ
  36. ひとつめ

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

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

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

    ドキュメント https://cloud.google.com/functions/docs/c oncepts/go-runtime 仕方ないので今回は処理をまとめた パッケージを作りreleaseを切って functionからimportして対応しました
  40. Go1.12系で発行したgo.modがあるとインポートできない - Go1.12で発行したgo.modはGo1.11.3以前のランタ イムでは解決できない - GoogleCloudFunctionsは多分ランタイムが1.11.3以 下 - そのためgo.modをGo1.12で発行した一部パッケー ジが使えない

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

    さっきの対応として作ったパッケージで 綺麗に踏み抜いた
  42. 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
  43. slackのemoji.listのパースが面倒

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

  45. こんな感じでやりました

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

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

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

  49. こういうのがきました

  50. もくじ - GoogleCloudFunctionsって? - Go1.11ランタイムが最近出た! - Slack slach command をつくった!

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

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

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

    単一ファイルのスクリプトで完結する 小さい処理ならめっちゃ幸せになれる Goでちょっとしたスクリプト書いて APIにしたいケースならこれで決定 だと思います
  54. 今回書いたコードここに置いてあります〜 - https://github.com/srttk/cmoji - function.goをそのままGoogleCloudFunctionsに貼り 付けると動く - 雑なのでそのうち整理します(ほんまか?)

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

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

    はやくzipでデプロイでしたい
  57. - プレゼンテーションテーマは SlidesCarnival の ヨークプレゼンテーションテンプレー ト を利用しています クレジット表記

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