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

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

convto
March 20, 2019

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

google cloud functions 触ったメモ

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  5. GoogleCloudFunctionsって?
    - Runtimeもnodeとかpythonとかgoとか似たようなも

    - Lambdaみたいにプロバイダ側のマネージドサービ
    スとかの Event hook で動かせる
    - Log はstackdriver(cloudwatchみたいなやつ)に飛ば
    します

    View full-size slide

  6. GoogleCloudFunctionsって?
    - Runtimeもnodeとかpythonとかgoとか似たようなも

    - Lambdaみたいにプロバイダ側のマネージドサービ
    スとかの Event hook で動かせる
    - Log はstackdriver(cloudwatchみたいなやつ)に飛ば
    します
    lambdaのGCP版

    View full-size slide

  7. GoogleCloudFunctionsって?
    - Runtimeもnodeとかpythonとかgoとか似たようなも

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

    View full-size slide

  8. コンソールはこんな感じ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  18. 作ったやつ(DEMO)

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  28. ちなみにlambdaだと

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  31. ひとつめ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  35. Go1.12系で発行したgo.modがあるとインポートできない
    - Go1.12で発行したgo.modはGo1.11.3以前のランタ
    イムでは解決できない
    - GoogleCloudFunctionsは多分ランタイムが1.11.3以

    - そのためgo.modをGo1.12で発行した一部パッケー
    ジが使えない

    View full-size slide

  36. Go1.12系で発行したgo.modがあるとインポートできない
    - Go1.12で発行したgo.modはGo1.11.3以前のランタ
    イムでは解決できない
    - GoogleCloudFunctionsは多分ランタイムが1.11.3以

    - そのためgo.modをGo1.12で発行した一部パッケー
    ジが使えない
    さっきの対応として作ったパッケージで
    綺麗に踏み抜いた

    View full-size slide

  37. 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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide