Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

できる!サーバレスアーキテクチャ

3,909 views

Published on

Perlで乗りこなすAzure Functions

Published in: Internet

できる!サーバレスアーキテクチャ

  1. 1. + できる! サーバレスアーキテクチャ Perlで乗りこなすAzure Functions @ytnobody
  2. 2. + わいとんです。よろしく!  あずま さとし  @ytnobody  👶 Hakodate  🏢 Roppongi  🐪 CPAN Author / YTURTLE  🍻 Ooimachi.pm(マチピー)  perl node unity(C#) etc…  The 何でも屋
  3. 3. + 話す事  サーバレスアーキテクチャとは  サーバレスアーキテクチャの歴史と現状  Azure Functionsで作る理由  Azure FunctionsとPerl  Azure FunctionsとPerlを使ったサーバレスなシステム例  まとめ
  4. 4. + 念のために言っておきますが・・・ MSの中の人ではありません。 回し者ではあるかもしれません Azureユーザの一人としての見解です。
  5. 5. + Section 1 サーバレスアーキテクチャとは
  6. 6. + サーバレスアーキテクチャという ワードに明確な定義はない  よく言われるのがこの定義  BaaS(Backend as a Service)を使ってイベントで接続する受動的な システム  FaaS(Function as a Service)を使ったフルマネージドな実行環境  今でも定義自体に様々な議論がある
  7. 7. ちょっとよく わからないですね
  8. 8. + ぼくのかんがえた さいきょうのていぎ  自分で運用しない  VMやサーバを使わない  自分で作らない  できるだけ外部サービスで済ませる  道具をつないで目的を達成する  なるべく外部サービス同士をつなぐロジックだけ書く
  9. 9. 少しわかりやすく なった気がしますね
  10. 10. + サーバレスアーキテクチャの 主な構成要素  PaaS - Platform as a Service  FaaS - Function as a Service  SaaS - Software as a Service  DBaaS - DataBase as a Service  CaaS - Cache as a Service  QaaS - Queue as a Service
  11. 11. + 今回解説する”サーバレス〜”に 登場しないもの  サーバ  VM  コンテナ・Docker  IaaS  LBあるいはLBに類されるもの
  12. 12. これまで触ってきたものが 根こそぎ登場しないッッッ!!!
  13. 13. + サーバレスアーキテクチャに 何を求めるのか  流行り?  安さ?  性能?  それとも・・・?
  14. 14. + Section2 サーバレスアーキテクチャの歴史と現状
  15. 15. + 2014年 サーバレスアーキテクチャの夜明け  AWS Lambda  Function as a Service  AWS Aurora  DB as a Service  GCP Cloud SQL  DB as a Service
  16. 16. + 2015年 Azureの密かなサーバレスシフト  Azure  Logic Apps  ワークフロー自動化
  17. 17. + 2016年 サーバレスとSaaS隆盛の年  AWS  Rekognition 2016~  画像認識  Athena 2016~  S3向けクエリサービス  Polly 2016~  テキスト読み上げ  Pinpoint 2016~  モバイルターゲティング通 知  Batch 2016~  Batch as a Service  Step Function 2016~  分散アプリ用ワークフロー  GCP  Cloud Functions  Function as a Service  Cloud Dataproc  Hadoop as a Service  Azure  Functions  Function as a Service  Cognitive Services  各種認知サービス
  18. 18. + 2017年 サーバレス実戦投入の年?  既に2016年で実戦投入  担当サービスのモバイルプッシュ  間に処理が入るのでAzure Functionsで対応。  毎分1000件以上の処理を捌いております。
  19. 19. + 各地で開催される サーバレス関連イベント数の推移  Connpass上で「serverless」で検索した結果のイベント数を月別に集 計  https://gist.github.com/ytnobody/15bea58941817424962f7e1083971 450 0 1 2 3 4 5 6 7 2015/10 2015/11 2015/12 2016/01 2016/02 2016/03 2016/04 2016/05 2016/06 2016/07 2016/08 2016/09 2016/10 2016/11 2016/12 2017/01 Serverless にマッチしたイベント数 イベント数
  20. 20. + Section 3 Azure Functionsで作る理由
  21. 21. + Azure Functionsで作ると 享受できる恩恵(1)  運用の手間からの解放  サーバ/VM  ネットワーク  DB  キャッシュ  ジョブキュー  環境構築の手間からの解放  プロビジョニング  ネットワーク構築
  22. 22. + Azure Functionsで構築すると 享受できる恩恵(2)  BaaSを利用した開発労力軽減  顔画像からの個人識別  自然言語の解釈  モバイルプッシュの送信  柔軟なスケーラビリティの獲得  自動的なスケールアウト  スケールアウトのための設計が不要
  23. 23. + 運用の手間からの解放  サーバのセキュリティ対策のた めにパッチを当てる仕事がなく なる  OpenSSLの脆弱性とか  glibcの脆弱性とか  サーバの負荷監視が不要になる  ZabbixとかNewRelicとか  topを叩く必要性もない  なぜなら…  サーバなどないから!
  24. 24. + 環境構築の手間からの解放  環境は最初から整っている  git, bash, nodeなどなど。  基本、プロビジョニングが不要。  Functionsを使う上で、それ が必要な設計はおかしい。
  25. 25. + BaaSを利用した開発労力軽減  実装困難な仕組みを外部に委譲 できる  機械学習  画像・音声認識  ビッグデータ基盤への繋ぎこ み  起動トリガーの定義が明確で、 期待しない動作を防げる  HTTP POSTだけに反応する とか
  26. 26. + 柔軟なスケーラビリティの獲得  リクエスト数が増えたら自動的 にリソースが増強されると最 高。  Azure Functionsはリクエス ト数に応じて自動的かつリニ アにリソースが増大・縮小。  Auto scalingの設定は不要。  スケーラビリティ確保のことを 心配する必要がなくなるので、 より本質的な開発に集中出来 る。
  27. 27. + Azure Functionsが 解決してくれないこと  コスト削減  もちろん設計によってはある程度軽減できるかもしれないけど…  それはおそらく従来の設計に何らかのオーバヘッドがあっただけ  パフォーマンス改善  様々なBaaSを組み合わせたりするため、HTTPオーバヘッドが積み 重なる。そのため速度は若干遅くなるかもしれない。  ただしたくさんの処理を捌いたから遅くなる、というような従来型 の刺さり方はない。
  28. 28. + Azure Functionsのデメリット  データの秘匿性  DBaaS(外部)にデータを預けることになる。  セキュリティ的に安全ではないという意味ではなく、ポリシーに よっては許容できないケースが発生しうるという意味。  クラウドを使う以上は避けられない。  システムトラブルが不可抗力的  クラウドの不具合は得てして自力ではどうにもならない。  クラウドを使う以上は避けられない。  SLAなどの軽減策を提供している。  Azure Functionsの流儀に則る必要性  ある程度敷かれたレールに沿う必要がある。  レールがある良さの裏返し。
  29. 29. + Section 4 Azure Functions と Perl
  30. 30. + Azure Functionsは公式には Perlをサポートしていない  正式対応している言語  C#  Node.js  F#  試験段階として対応している言語  Python  PHP  Bash  Batch(PowerShell)
  31. 31. + ところが実は・・・
  32. 32. わかる?わかります? Perl動いてんべ!!!
  33. 33. デモ
  34. 34. + どうやらPerlが動くらしい!  Perlはサーバレス対応言語!!!!  やったッ!!!これで勝つる!!!!!
  35. 35. だが待ってほしい
  36. 36. + Azure Functions… 根はWindowsなのであった!  じゃあこのPerlは何!?  MinGW-64なPerl5.22らしい。
  37. 37. + 様々な制約  cpanmやcpmは使えない  厳しい  XSモジュールは使えない  むちゃくちゃ厳しい  MinGWで動作しないモジュールは色々期待できない  結構厳しい  GCCとかglibcとかopensslとか色々諦めるしかない  超厳しい  でもEXEファイルが実行できる  嬉しい?!
  38. 38. + Perlプログラマから見たときには どうなのか。  割とほしいモジュールは最初から入ってる  JSON::PP  JSONは入ってない  JSON::PPが最初から入ってるので、こっちを使いましょう  HTTP::Messages  これでHTTP::Requestとか使える  LWP::UserAgent  平文通信ならOK  でもSSL関連は入ってない  LWP::Protocol::https  正直めちゃくちゃ痛い
  39. 39. + 実際のところ  外部のAPI叩くのは今のところcurlで頑張るしかない  もしくはC#とかNode.JSを使う  古き良きパイプラインを生かしたプログラミングが肝  こういう感じのやつ  昔のUNIXっぽいですね $ curl -L https://… | perl mycode.pl > $res
  40. 40. + Azure Functionsにおける 関数の構成要素  関数設定ファイル function.json  起動トリガー  入力バインディング  出力バインディング  関数ファイル  index.js  run.sh  などなど・・・
  41. 41. + function.json  関数の設定ファイル。起動と入出力をよろしく設定する。 { "bindings": [ { "type": "httpTrigger", "name": "req", "direction": "in" }, { "type": "http", "name": "res", "direction": "out" } ], "disabled": false }
  42. 42. + function.jsonの構成  bindings  起動トリガーとバインディングに関する設定を配列として定義する。  disabled  関数の有効性をboolで定義する。false=有効 true=無効  無効にすると関数が起動されない。
  43. 43. + 起動トリガー  関数を起動するための引き金  httpTrigger  HTTPリクエスト時  timerTrigger  指定時刻  eventHubTrigger  Azure Event Hubsからのイベント受信時  blobTrigger  Azure blobストレージのファイル作成・更新時  queueTrigger  Azure queueストレージの新規ジョブ受信時  serviceBusTrigger  Azure Service Busからのメッセージ受信時
  44. 44. + httpTrigger(1)  HTTPリクエストを受け付けるためにはこれを使う。  name: どういう変数名でデータを受け取るかという定義  direction: “in” 限定  methods: 受け付けるHTTPメソッドを配列で定義。  省略すると全て受け付ける。  route: 関数へアクセスするためのパスを定義。  Amon2やMojoliciousのように、プレースホルダーを利用可能。  https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings- http-webhook#a-namehttp-triggerahttp-trigger { "type": "httpTrigger", "name": "req", "direction": "in”, "methods": [ "GET" ], "route": "values/{id}" },
  45. 45. + httpTrigger(2)  ほとんどのリクエストデータは環境変数で取得可能  例えばfooというクエリパラメータの値は…  REQ_QUERY_FOOという環境変数に格納される  POSTされたContent Bodyは…  受信変数名がreqの場合、 cat $req などとすれば中身を取得できる  HTTPヘッダは…  例えばContent-Typeをとりたい場合  REQ_HEADER_Content-Typeに値が入ってくる。  http出力バインディングを使う場合  受付変数名がresの場合  echo “{body: {message: ‘hello’}, status: 200}” > $res  のようにするとJSONでレスポンスが返せる
  46. 46. + timerTrigger  CRON形式に似たスケジューリング定義が可能。  schedule: CRON形式っぽいスケジューリング定義  一個多い気が・・・  秒 分 時 日 月 週(0-6)  秒単位の起動ができる!!!!  10時から12時の間、10秒おきに実行する例 { "schedule": “*/10 * 10-12 * * * *", "name": “myTimer", "type": "timerTrigger", "direction": "in" }
  47. 47. + eventHubTrigger  Azure Event Hubsからのイベントを受信した時に起動する  Azure Event Hubsはハイパースケールのジョブキュー  拙作Net::Azure::EventHubsを使えば簡単に利用できます!  Perl5 Advent Calendar 2016 の10日目のエントリで紹介  name: 入力データが格納される変数名  path: Event Hubs内のイベントハブ名  connection: Event Hubsへの接続をするための接続文字列が入った環境 変数名 { "type": "eventHubTrigger", "name": ”inputEvent", "direction": "in", "path": ”myEventHub”, "connection": “myEventHubConnection" }
  48. 48. + 入力バインディング  関数起動時にデータ受け取り元となるリソース  blob  blobストレージ  table  tableストレージ  mobileTable  Azure Mobile Apps テーブル  documentDB  Azure DocumentDB
  49. 49. + 出力バインディング(1)  関数起動時に出力先となるリソース  http  HTTPレスポンス  blob  ファイル出力  eventHub  Azure Event Hubsへのジョブ送信  queue  queueストレージへの出力  serviceBus  Azure Service Busへのメッセージ送信
  50. 50. + 出力バインディング(2)  table  tableストレージへの出力  mobileTable  Azure Mobile Apps テーブルへの出力  documentDB  Azure DocumentDBへの出力  notificationHub  Azure Notification Hubsによるモバイルプッシュ  twilioSms  TwilioによるSMS送信
  51. 51. その他トリガーと バインディングについては 以下のドキュメントを 参照してください https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-triggers-bindings
  52. 52. + Section 5 Azure FunctionsとPerlを使ったサーバレスなシステム例
  53. 53. + 事例1:DocumentDBによる簡単な 会員登録  DocumentDB  手っ取り早く言うならば MongoDB as a Service  事実上無限にスケールアウト可能  Functionsから利用する場合  idで登録し、idで引いてくるKVS的な使い方  複雑な検索などには対応していない  そういう向きにはAzure Searchを併用することをお勧めします。  Azure Search = Lucene as a Service
  54. 54. + 事例1 構成図 HTTP Request • id • name Register to DocumentDB Store the Document
  55. 55. デモ
  56. 56. + 事例2:EventHubsを使ったデータ 蓄積 イベント発 生 イベント受 信 • ジョブ作成 • キューイング ジョブ検出 • データ登録 データ蓄積
  57. 57. デモ
  58. 58. + Wrap up まとめ
  59. 59. + まとめ  サーバレスは運用の手間を減らし設計をシンプルにするための 手口の一つ  Azure Functionsならスケーラビリティも確保できる!  Azure FunctionsならPerlも動く!  制約はあるけどw  Azure FunctionsならHTTPエンドポイントが付いてくる!  様々なSaaSと連携することで軸となるコードをシンプルに  バグ削減に貢献
  60. 60. + ここまで見て こう思いませんでしたか? あれ・・・ これってCGI?
  61. 61. + サーバレスはCGI Functionsはスーパーデーモン  Azure Functionsってまるでxinetdみたいだと思いません?  まるで・・・・  昔のPerl!!!!  でも昔みたいなイケてなさって感じないですよね?
  62. 62. + おまけ  Azure Functionsのヘルパーライブラリもどきを書いていま す。  https://gist.github.com/ytnobody/47ceda82f35a5323f90ddb92f00968 fa  よかったら改造してみてくだい。
  63. 63. ありがとうございました。

×