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

Serverlessな世界をのぞいてみよう! / Let's dive serverless ...

sugimount
October 31, 2019

Serverlessな世界をのぞいてみよう! / Let's dive serverless world

Oracle Cloud Hangout Cafe(OCHaCafe) Season 2 #3 での発表資料です。
https://ochacafe.connpass.com/event/147285/

Serverless の入門者向けの内容です。

sugimount

October 31, 2019
Tweet

More Decks by sugimount

Other Decks in Technology

Transcript

  1. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Serverlessな世界をのぞいてみよう! 日本オラクル株式会社 オラクル・デジタル 第二ソリューションエンジニアリング部 ソリューションエンジニア 杉山 卓 Oracle Cloud Hangout Café Season2 #3
  2. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 1. サーバレスをざっくりと理解する 2. Oracle のサーバレスサービスを知る 今日の目標 2
  3. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 自己紹介 3 @sugimount • 杉山 卓 (すぎやま すぐる) • 日本オラクル ソリューションエンジニア – Oracle Cloud 全般を扱い、お客様の意思決定を技術的に支援するお仕事 – いわゆる、プリセールスエンジニア • 好きなサービス – Oracle Functions, Oracle Container Engine for Kubernetes
  4. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | ServerlessDays Tokyo 2019 4 • 登壇しました • Oracle も スポンサー しました ここ 灰色のロゴ
  5. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 本日の内容 • サーバレス入門 • Oracle Functions の紹介 • サーバレス Web アプリケーションデモ • まとめ 5
  6. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | アンケート • サーバレスを使ったことある人? 7 • 本番環境で使っている人?
  7. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | サーバレスの歴史 8 2006 2008 2012 Zimki Google App Engine IronWorker Firebase 2014 AWS Lambda サーバレスが 広く知られる きかっけ 2016 2017 2018 2019 Google Cloud Functions Azure Functions OpenWisk by IBM IBM Cloud Functions Fn Project by Oracle Knative Firecracker Oracle Functions (New!) KEDA i i
  8. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | なぜサーバレスが注目されているのか 9 ビジネス価値の向上 Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |
  9. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 課題 10 生み出すプロダクトが市場に合うかわからない 開発に時間をかけられない お金・人が少ない 初めから大規模なシステムはコストが高い Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |
  10. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | どうするべきか 11 すばやくプロダクトをリリース 開発に時間を掛けない 低コストなシステム 容易にスケール可能 Copyright © 2019, Oracle and/or its affiliates. All rights reserved. |
  11. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | サーバレスで解決 12 フレキシブル 低コスト スケーラブル シンプル
  12. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | サーバレスとは • 誤解 「それサーバあるじゃん」 13 サーバレスサービス
  13. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | CNCF の定義(意訳) 14 https://github.com/cncf/wg-serverless/tree/master/whitepapers/serverless-overview サーバレスとは • サーバ管理を必要としない、アプリケーションの構築モデルを指す – サーバの作成、メンテナンス、アップデート、スケール、キャパシティ予測から解放 – サーバという考え方が抽象化され、ビジネスロジックに集中できる • 何も動作していない時は、サーバ部分の課金無し サーバレスを実現するためのサービス • FaaS(Functions-as-a-Service) • BaaS(Backend-as-a-Service)
  14. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | CNCF の定義(意訳) 15 https://github.com/cncf/wg-serverless/tree/master/whitepapers/serverless-overview サーバレスとは • サーバ管理を必要としない、アプリケーションの構築モデルを指す – サーバの作成、メンテナンス、アップデート、スケール、キャパシティ予測から解放 – サーバという考え方が抽象化され、ビジネスロジックに集中できる • 何も動作していない時は、サーバ部分の課金無し サーバレスを実現するためのサービス • FaaS(Functions-as-a-Service) • BaaS(Backend-as-a-Service)
  15. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | サーバ管理を必要としないってどういうこと? その前に、サーバを使った時に必要な作業を 振り返ってみよう 16
  16. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | サーバ管理に必要な作業 17 設計 構築 運用 • サーバに必要な スペックは? • どうやって可用性を 担保する? • サーバーへのアクセス 制御はどうする? • どれくらいのスペックが余っ ているのか • 新しいアプリケーションは どうやってデプロイする? • このサーバーは正常に動 いているのか? などなど・・・ • サーバーを1台ずつ構築し ていく? • すべて手作業で行う?
  17. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | サーバレスにすることで 18 • サーバ自体が不要になるため、サーバ管理作業は必要なし • ビジネスに価値のある作業(=アプリケーション開発)に集中することが可能
  18. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 具体的に、どうやってサーバ管理をなくすの? 19
  19. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | CNCF の定義(意訳) 20 https://github.com/cncf/wg-serverless/tree/master/whitepapers/serverless-overview サーバレスとは • サーバ管理を必要としない、アプリケーションの構築モデルを指す – サーバの作成、メンテナンス、アップデート、スケール、キャパシティ予測から解放 – サーバという考え方が抽象化され、ビジネスロジックに集中できる • 何も動作していない時は、サーバ部分の課金無し サーバレスを実現するためのサービス • FaaS(Functions-as-a-Service) • BaaS(Backend-as-a-Service)
  20. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | FaaS(Functions-as-a-Service)とは 21 • 何かの処理を行うコード(=Function) を、クラウドへアップロード • クラウド側で、よしなに運用・管理を行ってくれる • 良く知られているサービス – AWS Lambda, Azure Functions, Google Cloud Functions, IBM Cloud Functions
  21. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function のアップロード Function アップロード 起動条件設定 FaaS サービス
  22. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | FaaS サービス 1個のイベントトリガー Function イベント発生 i イベント発生をトリガーにして、Functionが起動し、処理を行う
  23. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 大量のイベントトリガー FaaS サービス Function イベント発生 i イベントに応じて、Functionが起動する イベント発生 i イベント発生 i イベント発生 i イベント発生 i イベント発生 i イベント発生 i イベント発生 i イベント発生 i イベント発生 i Function Function Function Function Function Function Function Function Function
  24. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 一定時間後削除 一定時間後削除 FaaS サービス
  25. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | BaaS(Backend-as-a-Service)とは 26 • システムのバックエンドを構成する一部品を、置き換えることの出来るサービス – ユーザ管理、認証、プッシュ通知、メッセージング、分析、Pub/Subキュー など • ビジネスの価値に直結しない部分を、クラウド側に任せる アプリケーション アプリケーション 自分で開発 自分で開発 BaaS 置き換え 自分で開発
  26. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | サーバレスの課金体系例 27 従来システム構成 サーバレス構成 0 1 2 3 4 5 サーバ台数 0 1 2 3 4 5 Function実行時間 確保している サーバ分 お金が掛かる Functionの実行 時間のみ課金 アイドル時間は課 金されない
  27. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | どうするべきか (再掲) 28 Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | すばやくプロダクトをリリース 開発に時間を掛けない 低コストなシステム 容易にスケール可能
  28. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | サーバレスを使うことで、以下のように解決 29 Copyright © 2019, Oracle and/or its affiliates. All rights reserved. | 不要な作業を排除し ビジネスロジックに集中 真の従量課金 自動スケール すばやくプロダクトをリリース 開発に時間を掛けない 低コストなシステム 容易にスケール可能
  29. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 制限事項 30 • コールドスタート問題 (FaaS) • Function の実行時間上限 (FaaS)
  30. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 対応方法 31 • コールドスタート問題 (FaaS) • Function の実行時間上限 (FaaS) → Function の定期実行 → アプリケーションの設計を イベントドリブンに変更 ※バッチ処理のような時間の掛かる 処理はFaaS化は難しい
  31. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 主なユースケース 33 Web バックエンド ビッグデータ IoT データ変換処理 定期実行
  32. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | ユースケース Webアプリのバックエンド 34 認証サービス API Gateway Function データベース Webサイト ホスティング Web ブラウザ HTML・CSS・ JavaScript ユーザー認証 HTTP Endpoint JSON Response サーバレスサービス データ管理 処理 凡例
  33. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | ユースケース ビッグデータ・IoT 35 Stream処理 データベース Function ソーシャルメディア データ IoT ビジネスの中で 発生したデータ 大量データを ストリーム処理 データ加工 データ管理 サーバレスサービス 凡例 データ分析
  34. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | ユースケース データ変換処理 36 Object Storage データ処理元 データ変換 サービス Function Object Storage データ処理先 画像データ 動画データ データを格納 データ処理 画像や動画データ の変換 処理後のデータを 格納 サーバレスサービス 凡例
  35. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | ユースケース 定期実行 37 Function システム システム ヘルスチェック サーバレスサービス 凡例 メール送信 サービス 問題が発生した 場合、メール送付
  36. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Oracle Functions 39 • Oracle Cloud Infrastructure(以下OCI)で、提供しているFaaS • 特徴 – OSSベース Fn Project – インフラを選ばないオープンな FaaS 基盤 – Container Native – 基本的にはどのような言語でも動作可能 – 低価格で高性能
  37. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Fn Projectとは 40 • Function as a Service(FaaS)を構築するためのフレームワーク – オラクル主導で開発されているOSS • https://fnproject.io/ • https://github.com/fnproject/ – Iron.ioのFaaS技術(IronFunctions)がルーツ • 任意のインフラ上にFn Projectを展開することで、 Oracle Functions互換の環境を構築可能 – オンプレミス、クラウド、ラップトップ…
  38. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Fn Project互換環境の選択肢 41 • Oracle Functions – Fn Projectのマネージド・サービス – クラウドのFaaSらしい、「使った分 だけ」の課金体型 – OCIのEventsサービスと連携した トリガーを容易に構成 • Kubernetes – オンプレミス、クラウドの任意 のKubernetesクラスターでFn Projectを実行 – Helmを利用することでプロダク ションレベルの構成を容易に構 築 • 任意のDockerホスト – Dockerをインストール済みのマ シンでコンテナとして Fn Projectを実行 – Oracle Functionsのローカル開 発環境としても利用 – Raspberry Piなどで実行して Edgeとしての利用も 同一Functionを相互移行可能
  39. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Container Native 42 • Function をコンテナイメージとして実装 • 依存関係を簡単にパッケージ • コンテナ上で、 どのような言語でも実装可能
  40. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Oracle Functions の価格 43 リソース利用 リクエスト数 $0.00001417 43 $0.20 FREE FREE OCIR(Oracle Cloud Infrastructure Registry)
  41. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 事前準備 44 Oracle Functions OCI Registry (Docker Registry) Oracle Cloud Virtual Cloud Network 手元の環境 Docker, Oracle Functions で使う CLI の導入 など 仮想ネットワークの 作成 https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm
  42. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 45 Oracle Functions OCI Registry (Docker Registry) Oracle Cloud Virtual Cloud Network 手元の環境 Application https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm Application という枠組みを作成 Virtual Cloud Network に紐づけ
  43. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 46 Oracle Functions OCI Registry (Docker Registry) Virtual Cloud Network 手元の環境 Application Oracle Cloud Dockerfile Functionコード + import FDK https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm Docker Image 作成
  44. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 47 Oracle Functions OCI Registry (Docker Registry) Virtual Cloud Network 手元の環境 Application Oracle Cloud https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm Imageアップロード
  45. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 48 Oracle Functions OCI Registry (Docker Registry) Virtual Cloud Network 手元の環境 Application Oracle Cloud https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm Function 起動条件設定
  46. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 49 Oracle Functions OCI Registry (Docker Registry) Virtual Cloud Network 手元の環境 Application Oracle Cloud イベント イベント イベント https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm イベント発生
  47. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 50 Oracle Functions OCI Registry (Docker Registry) Virtual Cloud Network 手元の環境 Application Oracle Cloud https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm Instance Instance イベントに応じて、 インスタンスの増減 インスタンスの作成
  48. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 51 Oracle Functions OCI Registry (Docker Registry) Virtual Cloud Network 手元の環境 Application Oracle Cloud Instance Instance https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm Image Pull
  49. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 52 Oracle Functions OCI Registry (Docker Registry) Virtual Cloud Network 手元の環境 Application Oracle Cloud Instance Instance https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm コンテナが Function と して稼働 イベントに応じて、コンテナの増減 コンテナへパラメータを渡す
  50. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 53 Oracle Functions OCI Registry (Docker Registry) Virtual Cloud Network 手元の環境 Application Oracle Cloud Instance Instance VCN 内のリソース Database など https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm VCN内のリソースにアクセス可能
  51. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 54 Oracle Functions OCI Registry (Docker Registry) Virtual Cloud Network 手元の環境 Application Oracle Cloud Instance Instance VCN 内のリソース Database など https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm コンテナからレスポンスを受け取り Clientに返す
  52. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 55 Oracle Functions OCI Registry (Docker Registry) Virtual Cloud Network 手元の環境 Application Oracle Cloud Instance Instance 次回以降のリクエストは、 生存しているコンテナが処理を行う https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm
  53. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Function を動かすときの流れ 56 Oracle Functions OCI Registry (Docker Registry) Virtual Cloud Network 手元の環境 Application Oracle Cloud Instance Instance 一定時間経過後削除 https://docs.cloud.oracle.com/iaas/Content/Functions/Concepts/functionshowitworks.htm
  54. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Demo : Hello World in Oracle Functions 57
  55. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Demo : Hello World 58 •Oracle Functions で Hello World を実行する
  56. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | メタデータファイル (func.yaml) 59 schema_version: 20180708 name: helloworld-func version: 0.0.2 runtime: go entrypoint: ./func Function を作成する際のメタデータを指定するファイル 指定可能パラメータ(抜粋) ・名前 ・バージョン ・ランタイム ・タイムアウト値 ・Functionに割り当てるメモリ など https://docs.cloud.oracle.com/iaas/Content/Functions/Tasks/functionscustomizing.htm https://github.com/fnproject/docs/blob/master/fn/develop/func-file.md 詳細 Document
  57. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | ソースコード (func.go) 60 package main import ( "context" "encoding/json" "fmt" "io" fdk "github.com/fnproject/fdk-go" ) func main() { fdk.Handle(fdk.HandlerFunc(myHandler)) } 次に続く ・FDK (Function Development Kits) を Import ・Functionが起動した時に、動かす関数 myHandler を指定
  58. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | ソースコード (func.go) 61 type Person struct { Name string `json:"name"` } func myHandler(ctx context.Context, in io.Reader, out io.Writer) { p := &Person{Name: "World"} json.NewDecoder(in).Decode(p) msg := struct { Msg string `json:"message"` }{ Msg: fmt.Sprintf("Hello %s", p.Name), } json.NewEncoder(out).Encode(&msg) } ・myHandler 関数を FDK に渡している ・Personという構造体(struct)を生成し、 Nameフィールドには、”World を格納” ・Function実行時のリクエストに、Nameがあれば、 構造体のNameフィールドを上書き Nameが無ければ、”World”のまま ・FunctionのResponseとして、msg構造体をPrint ・結果、 Hello World と表示される
  59. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 62 FDK(Function Development Kits) とは • Function を簡単に書くための Development Kits • FDK は各種言語の パッケージ / ライブラリ / gem として提供されている • FDK のインターフェースに沿って関数を実装 • 主な機能 – Input データを関数に渡す – Output を Oracle Functions に返す – コンテナがtimeoutするまで Listen しつづけて、次の Request に対して高速に応答する Ruby
  60. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 63 Oracle Functions Function Container myHandler(input){ ... } events events events FDK Oracle Functions から Request を受け取り、 myHandler関数 へ 抽象化されたIO を受け渡す Golangでは、 io.Reader, io.Writer インターフェース が使われている FDKの役割 HTTP over UNIX Socket 経由で Input, Output https://www.youtube.com/watch?v=TMt2P1pF6lA
  61. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 64 Oracle Functions Function Container myHandler(input){ ... } events events events 独自 実装 FDK で実装している IO インターフェースを実装すれ ば、任意の言語で動作可能 ベータ版ツールの Fn HotWrap が参考になる https://github.com/fnproject/hotwrap FDKが提供されていない言語の場合 HTTP over UNIX Socket 経由で Input, Output https://www.youtube.com/watch?v=TMt2P1pF6lA
  62. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | 自動生成 Dockerfile 65 FROM fnproject/go:dev as build-stage WORKDIR /function WORKDIR /go/src/func/ ENV GO111MODULE=on COPY . . RUN cd /go/src/func/ && go build -o func FROM fnproject/go WORKDIR /function COPY --from=build-stage /go/src/func/func /function/ ENTRYPOINT ["./func"] Golang を Build する用のコンテナイメージ マルチステージビルド 自動生成したソースコードを使用して、 Golang の Build Function として動かすコンテナイメージ ビルドしているコンテナから、バイナリファイルを COPYして、ENTRYPOINT として指定 Dockerfileは好きな内容に Customize 可能
  63. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Oracle Functions の起動方法 68 • SDK, CLIから直接実行 • oci-curl を使用して実行 • HTTPから実行 (API Gateway経由) • 他サービスとの連携 – Eventsサービス経由 • 定期実行 (今後予定)
  64. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | API Gateway 69 Oracle Cloud Internet API Gateway Oracle Functions バックエンド (HTTP) • Oracle Functions も含む、API のエンドポイントを提供 • 認証、スロットリング、Logging、カスタムドメイン などの機能を提供 • 2019年10月現在、限定提供中 Identity Cloud Service authentication
  65. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Events 70 • Oracle Cloud 上の様々なリソースの状態変化に応じて、 イベントを発行するサービス • アクションとして、Oracle Functions を起動することが可能 • CNCF で定義されている CloudEvents の仕様に準拠のメッセージを Functions に送る Object Storage Events Oracle Functions 検知 トリガー Fileの格納
  66. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | CloudEvents 71 https://cloudevents.io/ • イベントデータの標準化を目指して定義されている仕様 • CNCFの Incubating Project • 各種Service や Platform で発生したイベントの配信を容易にすることを目指している – 例えば、Public Cloud間、オンプレミス、エッジ環境 で相互にイベント連携 オンプレミス Public Cloud
  67. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | ログ・メトリクス 72 • Oracle Functions の ログ・メトリクスは、Oracle Cloud 上で確認可能 • Metrics – 実行回数 – 実行時間 – エラー発生回数 – スロットリングで制限 (too many request)
  68. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Fn Flow 73 • Fn Project で進められている、Function のオーケストレーションを実現 • Function のワークフローを定義 • Function の平行処理、順序処理、遅延の待ち、エラー処理 などを制御 • Flow 制御を Code で表現 • Oracle Functions では、今後提供予定
  69. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | ワークフロー定義 74 https://www.youtube.com/watch?v=TMt2P1pF6lA Function 3個を定義 3個の Function を順番に実行して、 エラーが無かったら成功処理 エラーが発生したらキャンセル処置
  70. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | フローの可視化 75 https://github.com/fnproject/tutorials/blob/master/FlowSaga/README.md 3個の Function の実行時間、及び、成功した事を可視化
  71. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Web Apps with Serverless 77 • サーバレスサービスを活用した、画像投稿サービス(Webアプリケーション) デモアプリなので、トランザクションの異常系な どは考慮しておりません。
  72. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Demo 作成に掛かった時間 78 Phoenix リージョン (API Gatewayは、2019年10月現在、Phoenix リージョンで限定提供中のため) API Gateway Oracle Functions Tokyo リージョン Object Storage 画像格納用 User (Web Browser) Events Oracle Functions Oracle DB API Gateway Oracle Functions Webサイト ホスティング 約2日で サーバレス アーキテクチャ
  73. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | アーキテクチャ 画像投稿 79 Phoenix リージョン (API Gatewayは、2019年10月現在、Phoenix リージョンで限定提供中のため) API Gateway Oracle Functions Tokyo リージョン Object Storage 画像格納用 User (Web Browser) 2. Object Storageの アップロード用URLを取得 Events Oracle Functions Oracle DB API Gateway 4. 画像メタデータ保存 (URL, 名前, 作成日時 など) Oracle Functions 3. アップロード用URL宛に、 直接画像をアップロード Webサイト ホスティング 1. 静的ページ取得 (React) HTML, JavaScriptなど
  74. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | アーキテクチャ 画像投稿 80 Phoenix リージョン (API Gatewayは、2019年10月現在、Phoenix リージョンで限定提供中のため) API Gateway Oracle Functions Tokyo リージョン Object Storage 画像格納用 User (Web Browser) Events Oracle Functions Oracle DB API Gateway Oracle Functions Webサイト ホスティング 1. Object Storage から、事前承認済みリクエストを取得 2. JSON として事前承認済みリクエストを Response GitHub でソース公開 https://github.com/Sugi275/serless_objectstorage_pre-auth
  75. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Object Storage の事前承認済みリクエスト 81 Object Storage 画像格納用 API Gateway Oracle Functions User (Web Browser) 事前承認済リクエスト https://objectstorage.ap-tokyo-1.oraclecloud.com/p/<hogehogeurl>/n/<namespace-name>/b/<bucket-name>/o/ 1. 事前認証済みリクエストの取得 ※ Oracle Functions に、権限設定済み 2. 事前認証済みリクエストを JSON として渡す 3. ブラウザから直接 Object Storage へアップロード • Object Storage へアップロード権限がないClientへ、一時的なURLを発行する仕組み
  76. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Oracle Functions でやっていること 82 ... snip ... provider, err := auth.ResourcePrincipalConfigurationProvider() client, err := objectstorage.NewObjectStorageClientWithConfigurationProvider(provider) ... snip ... response, err := client.CreatePreauthenticatedRequest(ctx, request) ... snip ... funcResponse := struct { RequestID string `json:"request_id"` AccsessURI string `json:"access_uri"` }{ RequestID: *response.Id, AccsessURI: "https://objectstorage.ap-tokyo-1.oraclecloud.com" + *response.AccessUri, } json.NewEncoder(out).Encode(&funcResponse) リソースプリンシパルと呼ばれる仕組みを 使って、Function の権限を取得 Object Storage の client を生成 事前承認済みリクエストを取得 JSONとしてエンコードして、 FDK経由でReponseを返す func.go
  77. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | API Gateway でやっていること 83 "routes": [ { “path”: “/getBucketPreAuthURL”, “methods”: [ “GET” ], “backend”: { “type”: “ORACLE_FUNCTIONS_BACKEND”, “functionId”: “<Functions の ID>” }, "requestPolicies": { "cors":{ "allowedOrigins": ["*", "*"], "allowedMethods": ["*", "GET"], "allowedHeaders": [], "exposedHeaders": [], "isAllowCredentialsEnabled": false, "maxAgeInSeconds": 3000 } } } アクセス path と methods を定義 backend として動かす Function のIDを指定 https://<API Gatewayのendpoint>/v1/getBucketPreAuthURL • パス、ルーティング、様々なポリシーを設定 • エンドポイントにアクセスすると、Functionが動く
  78. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | export default function getPreAuthURL() { const p = new Promise((resolve, reject) => { fetch(‘https://<API GatewayのEndpoint>/v1/getBucketPreAuthURL') .then(response => { if (response.ok) { return response.json(); } else { return Promise.reject(new Error('エラーです!')); } }) .then(jsonData => { console.log(jsonData); resolve(jsonData.access_uri); }) .catch(e => { console.log(e.message); // エラーです! }); }); return p; } Front(React) で関係している箇所 84 GitHubでソース公開 https://github.com/Sugi275/serless_front src/oraclecloud/getpreauthuri.js API Gateway経由で、事前認証済みリクエストを取得
  79. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | async handleUploadImage() { console.log("start handleUploadImage") const preAuthURI = await GetPreAuthURI() store.dispatch(addPreAuthURI(preAuthURI)) const files = store.getState().imagePreview.images files.map(file => this.uploadImage(file)) console.log("end handleUploadImage") } ... snip ... uploadImage(file) { axios.put(store.getState().imagePreview.preAuthURI + file.name, file, options) .then(result => { console.log("Response from object storage"); }) .then(() => { store.dispatch(previewClear()) }) } Front(React) で関係している箇所 85 GitHubでソース公開 https://github.com/Sugi275/serless_front src/component/imageupload.js 事前承認済みリクエストを、Reduxの Store に格納 事前承認済みリクエストを使って、 file(画像) をObject Storage にUpload
  80. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | アーキテクチャ 画像投稿 86 Phoenix リージョン (API Gatewayは、2019年10月現在、Phoenix リージョンで限定提供中のため) API Gateway Oracle Functions Tokyo リージョン Object Storage 画像格納用 User (Web Browser) Events Oracle Functions Oracle DB API Gateway Oracle Functions Webサイト ホスティング 1. Events が Object Storage に格納された画像を検知 2. Events が Oracle Functions を起動 3. Oracle Functions は メタデータをデータストアに格納 GitHub でソース公開 https://github.com/Sugi275/serless_metadeta-to-oracledb
  81. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Oracle Functions でやっていること 87 ... snip ... func fnMain(ctx context.Context, in io.Reader, out io.Writer) { // Events から受け取るパラメータ input := &EventsInput{} json.NewDecoder(in).Decode(input) ... snip ... func getDSN() (string, error) { oracleUsername, ok := os.LookupEnv(envOracleUsername) oraclePassword, ok := os.LookupEnv(envOraclePassword) oracleServiceName, ok := os.LookupEnv(envOracleServiceName) ... snip ... query := "INSERT INTO IMAGES (id, ImageName, Detail, ImageURL, UserName, CREATE_DATE, DELETED) " + "values (:1, :2, :3, :4, :5, :6, :7)" Events からパラメータを受け取って、 どの画像がアップロードされたかを認識 Oracle DB への接続情報を 環境変数から取得 INSERT を実行して、 画像のメタデータを保存 func.go
  82. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | Events から渡されるパラメータを抜粋 (CloudEvents) 88 { "cloudEventsVersion": "0.1", "eventID": "51827a0e-7d03-4d6a-b274-fb51e2b0b764", "eventType": "com.oraclecloud.objectstorage.createobject", "source": "objectstorage", ...snip... "data": { "compartmentId": "ocid1.compartment.oc1..secret", "compartmentName": "susugiya", "resourceName": "3eventsample.txt", "resourceId": "", "definedTags": { "Operations": { "CostCenter": "" } }, "additionalDetails": { "namespace": "tenancyname", "publicAccessType": "", "eTag": "498e8542-2e9b-4684-87e2-f75ab90354b9" } どのリソースからイベントが発生したのか リソースの名前 (画像のファイル名) Object Storage の namespace名 (Object Storage へのアクセスに必要)
  83. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | アーキテクチャ 画像取得 89 Phoenix リージョン (API Gatewayは、2019年10月現在、Phoenix リージョンで限定提供中のため) API Gateway Oracle Functions Tokyo リージョン Object Storage 画像格納用 User (Web Browser) Events Oracle Functions Oracle DB API Gateway 2.画像メタデータ取得 Oracle Functions 3.画像メタデータ取得 (URL, 名前, 作成日時 など) Webサイト ホスティング 1. 静的ページ取得 (React) HTML, JavaScriptなど 4. 画像を取得
  84. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | アーキテクチャ 画像取得 90 Phoenix リージョン (API Gatewayは、2019年10月現在、Phoenix リージョンで限定提供中のため) API Gateway Oracle Functions Tokyo リージョン Object Storage 画像格納用 User (Web Browser) Events Oracle Functions Oracle DB API Gateway Oracle Functions Webサイト ホスティング 1. データストアからメタデータを取得 2. JSON 形式でブラウザへ返却 3. ブラウザがページをレンダリングする時に、 直接 Object Storage を参照して画像を表示 https://github.com/Sugi275/serless_get-image-metadata
  85. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | ブラウザが直接 Object Storage を参照 91 <img tabindex="0" src="https://objectstorage.ap-tokyo-1.oraclecloud.com/n/<namespace>/b/<bucket>/o/<image>"> • HTML の img タグの src に Object Storage のURLを指定 • Object Storage は Public Bucket にしている (書式に従ったURLで参照可能) render() { images = store.getState().imageList.images for (var i in images) { list.push(<ImageCard key={images[i].id} image={images[i]}></ImageCard>); } return ( <div className="flex"> {list} </div> ) React の Component
  86. Copyright © 2019, Oracle and/or its affiliates. All rights reserved.

    | まとめ 93 • サーバレスの特徴 – シンプル、フレキシブル、低コスト、スケーラブル • Oracle もサーバレス • コミュニティと共に、サーバレス業界を盛り上げていきたい