Successfully reported this slideshow.

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

1

Share

Upcoming SlideShare
Azure Functions 入門
Azure Functions 入門
Loading in …3
×
1 of 63
1 of 63

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Related Audiobooks

Free with a 14 day trial from Scribd

See all

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

  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. ありがとうございました。

×