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.

コンテナで作れるFaaS

1,489 views

Published on

2017.7.19 JAWS-UG横浜

Published in: Technology

コンテナで作れるFaaS

  1. 1. Serverless on Container セクションナイン 吉田真吾 2017.7.19
  2. 2. 吉田真吾 n バックグラウンド 証券システム基盤開発 p 基盤システム開発、Oracleチューニングなど エバンジェリスト p 講演113回(2013年実績) p AWS設計・構築・移行(2014-2015) n 現在のしごと (株) セクションナイン 代表取締役社長 p APN コンサルティングパートナー p DevOps、Dockerize、Serverless 支援など (株) 実績等 p AWSウルトラクイズ 初代チャンピオン (2012年) p AWS Samurai 2014 / 2016 ←New!!
  3. 3. FaaSを支えるコンテナ技術 • 多くのFaaSのサービスの基礎はコンテナ技術 でできている • リソースの調達が素早いので、リクエストのないと きはリソースを一切使わず、大量にリクエストがあ るときはスケールさせやすくできる • スケジューラーによって1VM内に複数の実行環境 を確保できるので、リソースの集約効率が高い
  4. 4. Function as a Service • AWS Lambda • Azure Functions • Google Cloud Functions • IBM Bluemix OpenWhisk • Webtask (Auth0) • Hyper Func (Hyper.sh)
  5. 5. AWS Lambda • 2014年末 re:Invent にて発表 • サポート言語 • Node.js – v4.3.2, v6.10 • Java – Java 8 • Python – Python 2.7, 3.6 • C# - .NET Core 1.0.1 • ホスト • Amazon Linux (時々バージョンアップ) • 実行環境は再利用される • 初回起動が遅いが再利用時は高速 • 一時ストレージとして /tmp 利用可能(スケールしたり破棄 されたりするので頼らないこと) • 課金は使った分だけ • 確保(指定)したメモリ(128MB〜1.5GB) x 実行時間(100ms単 位) x 実行回数 • メモリに比例してCPUの割当ても多くなる http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html
  6. 6. 誰でもFaaSが作れる • FaaSを自分の好きな環境で構築できるツールが巷 には多数ある • FaaSのサポートする言語、イベントソースがさま ざまであるのと同じように、FaaSのツールもプ ラットフォームの構築方法からリクエストパラ メータの渡し方、サポート言語、イベントソース などに違いがある • 現在のユースケースとしては「FaaSのローカルテ スト用」「自前クラスタ上でのアプリ開発速度の 向上」が主眼におかれることが多い印象
  7. 7. Functionsフレームワーク • IronFunctions • https://github.com/iron-io/functions • Apache OpenWhisk • http://openwhisk.org • https://github.com/apache/incubator-openwhisk • Spring Cloud Functions • https://github.com/spring-cloud/spring-cloud- function
  8. 8. Functionsフレームワーク • Kubeless • http://kubeless.io • https://github.com/kubeless/kubeless • fission (Platform9) • http://fission.io • https://github.com/fission/fission • funktion (Fabric8) • https://funktion.fabric8.io • https://github.com/funktionio/funktion
  9. 9. • Dockerベースのコア環境 • Golang製 • Function formatに沿えばどんな言語の実行環境も 載せられる • 2016/11 αリリース • Lambda完全サポート • Lambdaコードをいろんな実行環境に移植できる • ただしハンドラーに指定できるファイル名は 「func.js」のみ https://github.com/iron-io/functions
  10. 10. • Required • Docker 1.12以上 • ベースイメージはDocker Hubから取得 (docker loginし とく) • 環境セットアップ • $ docker run --rm -it --name functions -v ${PWD}/data:/app/data -v /var/run/docker.sock:/var/run/docker.sock -p 8080:8080 iron/functions • CLIセットアップ • curl -LSs https://goo.gl/VZrL8t | sh https://github.com/iron-io/functions
  11. 11. • モード • シングルモード • 組込みDB、MQ、APIエンドポイントを利用 • スタックバージョン • DB: 環境変数でMySQLかPostgreSQLに接続 • MQ: 環境変数でRedisかIronMQ(SaaS)に接続 • APIエンドポイント: 環境変数でロードバランサーを指定 https://github.com/iron-io/functions
  12. 12. • アプリ:Goで"Hello ${NAME}!" package main import ( "encoding/json” "fmt” "os” ) type Person struct { Name string } func main() { p := &Person{Name: "World"} json.NewDecoder(os.Stdin).Decode(p) fmt.Printf("Hello %v!", p.Name) } https://github.com/iron-io/functions
  13. 13. • CLIでbuildしてDocker Hubにイメージをpush $ fn init yoshidashingo/hello assuming go runtime runtime: gofunc.yaml created. $ fn build && fn push (中略) Function yoshidashingo/hello:0.0.1 built successfully. (中略) Function yoshidashingo/hello:0.0.1 pushed successfully to Docker Hub. https://github.com/iron-io/functions
  14. 14. • イメージと呼び出すアプリ名とのルーティング • 実行 $ fn apps create myapp myapp created $ fn routes create myapp /hello /hello created with yoshidashingo/hello:0.0.1 $ curl http://localhost:8080/r/myapp/hello Hello World! $ curl -H "Content-Type: application/json" -X POST -d '{ "name":"Johnny"}' http://localhost:8080/r/myapp/hello Hello Johnny! $ echo '{"name":"Johnny"}' | fn call myapp /hello Hello Johnny!
  15. 15. • 実行環境はコントローラー(常駐)とアプリ (呼び出し事にプロビジョニング:コールドス タート) • なので何回やってもだいぶ遅い INFO[1709] action="server.handleRunnerRequest)-fm" app=myapp call_id=4fb34dd7-671f-5e57-b4a1-e39ec663e156 image=" yoshidashingo/hello:0.0.1" name="run.exec_time" route="/hello" type=time value=1.110867215s https://github.com/iron-io/functions $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2ca07a04bc5d yoshidashingo/hello:0.0.1 "./func" 1 second ago Up Less than a second task-xxxx 60c04e456bd1 iron/functions "/usr/local/bin/en..." 56 seconds ago Up 55 seconds 2375/tcp, 0.0.0.0:8080->8080/tcp functions
  16. 16. • Lambda関数をインポート可能 https://github.com/iron-io/functions $ fn lambda aws-import arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:nodeHelloTest ap-northeast-1 yoshidashingo/nodeHellotest
  17. 17. • ダッシュボードも利用可能 https://github.com/iron-io/functions $ docker run --rm -it --link functions:api -p 4000:4000 -e "API_URL=http://api:8080" iron/functions-ui
  18. 18. LocalStack • AWSをローカル環境でエミュレートする • API Gateway at http://localhost:4567 • Kinesis at http://localhost:4568 • DynamoDB at http://localhost:4569 • DynamoDB Streams at http://localhost:4570 • Elasticsearch at http://localhost:4571 • S3 at http://localhost:4572 • Firehose at http://localhost:4573 • Lambda at http://localhost:4574 • SNS at http://localhost:4575 • SQS at http://localhost:4576 • Redshift at http://localhost:4577 • ES (Elasticsearch Service) at http://localhost:4578 • SES at http://localhost:4579 • Route53 at http://localhost:4580 • CloudFormation at http://localhost:4581 • CloudWatch at http://localhost:4582 https://github.com/localstack/localstack
  19. 19. LocalStack • ローカルホスト上に直接セットアップ • 一番簡単なのはリポジトリをクローンして ※Mac上で共有ディレクトリのマウントにコケるのでワークアラウンド https://bitbucket.org/atlassian/localstack/issues/40/getting-mounts-failed-on-docker-compose-up https://github.com/localstack/localstack $ pip install localstack $ localstack start $ TMPDIR=/private$TMPDIR docker-compose up
  20. 20. LocalStack • ローカルテストでの活用方法はこちらを参照 https://speakerdeck.com/twada/testable-lambda-working-effectively-with-legacy-lambda Testable Lambda Working Effectively with Legacy Lambda 和田 卓人 (@t_wada) Jun 02, 2017 @ AWS Dev Day Tokyo 2017 ]ihmn [mm_ln 9 l_kocl_ $[mm_ln$&8 ]ihmn `m 9 l_kocl_ $`m$&8 ]ihmn j[nb 9 l_kocl_ $j[nb$&8 ]ihmn =RN 9 l_kocl_ $[qm*m^e$&8 ]ihmn m0 9 h_q =RN+N0 u m0Bil]_K[nbNnsf_7 nlo_) fiaa_l7 ]ihmif_) _h^jichn7 h_q =RN+Ah^jichn $bnnj7,,fi][fbimn7124/$& w&8 ^_m]lc_ $fi][fmn[]e f_[lhcha$) & 9: u _`il_ & 9: u l_nolh m0+]l_[n_>o]e_n u>o]e_n7 $n_mn*o]e_n$w&+jligcm_ &+nb_h & 9: u l_nolh m0+jon d_]n u >o]e_n7 $n_mn*o]e_n$) F_s7 $OLYG C +jha$) ?ihn_hnOsj_7 $cg[a_,jha$) >i^s7 `m+l_[^Bcf_Nsh] j[nb+dich YY^clh[g_) $++$) $`crnol_m$) $OLYG C +jha$&& w&+jligcm_ &8 w&8 w&8 cn $m0+a_n d_]n$) & 9: u l_nolh m0+a_n d_]n u>o]e_n7 $n_mn*o]e_n$) F_s7 $OLYG C +jha$w&+jligcm_ &+nb_h l_m& 9: u [mm_ln l_m&8 w&8 w&8 w&8 3 - e SU i : MaU ]ihmn [mm_ln 9 l_kocl_ $[mm_ln$&8 ]ihmn =RN 9 l_kocl_ $[qm*m^e$&8 ]ihmn m0 9 h_q =RN+N0 um0Bil]_K[nbNnsf_7 nlo_) _h^jichn7 h_q =RN+Ah^jichn $bnnj7,,fi][fbimn7124/$&w&8 ]ihmn ih d_]n?l_[n_^ 9 l_kocl_ $++,ih*id_]n*]l_[n_^$&8 ^_m]lc_ $fi][fmn[]e [m_^ n_mn mocn_ `il b[jjs j[nb ][m_m$) & 9: u f_n hiq) _p_hn8 _`il_A[]b & 9: u hiq 9 h_q @[n_ &+a_nOcg_ &8 _p_hn 9 u M_]il^m7 U u m07 u o]e_n7 u h[g_7 n_mn*o]e_n*"uhiqw w) id_]n7 u e_s7 OLYG C Y"uhiqw+jha w w w W w8 l_nolh m0+]l_[n_>o]e_n u>o]e_n7 n_mn*o]e_n*"uhiqw w&+jligcm_ & +nb_h & 9: m0+]l_[n_>o]e_n u>o]e_n7 n_mn*o]e_n*"uhiqwl_mct_^ w&+jligcm_ && +nb_h & 9: m0+jon d_]n u >o]e_n7 n_mn*o]e_n*"uhiqw ) F_s7 OLYG C Y"uhiqw+jha ) ?ihn_hnOsj_7 $cg[a_,jha$) >i^s7 `m+l_[^Bcf_Nsh] j[nb+dich YY^clh[g_) $++$) $`crnol_m$) $OLYG C +jha$&& w&+jligcm_ &&8 w&8 cn $ih d_]n?l_[n_^ ][ff[]e$) & 9: u l_nolh h_q Kligcm_ l_mifp_) l_d_]n& 9: u ]ihmn ][ff[]e 9 _ll) g_mm[a_& 9: _ll ; l_d_]n _ll& 7 l_mifp_ g_mm[a_&8 ih d_]n?l_[n_^ um0) _p_hn) ][ff[]ew&8 w&+nb_h g_mm[a_& 9: u [mm_ln ,Xg_mm[a_,+n_mn g_mm[a_&&8 w&8 w&8 接合部を活用してテストを書く
  21. 21. Serverless Frameworkでもローカル実行できる $ sls invoke local -f funcname
  22. 22. その他の Function実行環境
  23. 23. Apache OpenWhisk • 2016/2 BlueMix上のサービスとしてβ提供開始 →2016/11 Apache Incubator へ登録 • サポート環境 • Node.js, Swift, Python, Java, Docker • Docker環境上にセット アップできるのでPCで ローカル実行可能 https://github.com/apache/incubator-openwhisk
  24. 24. Spring Cloud Functions • 2017/6発表 • mvnでSpring Bootアプリケーションのjarを作成して デプロイでき、curlでWebAPIとして呼び出すひと通 りのFunctionアプリのライフサイクルを構築できる 他、抽象度の高いアプリ(REST API、ストリームプ ロセッシングアプリなど)を作れる • ローカル実行のほか、クラウド用アダプターで Lambdaなどにアップロードできるほか、k8s上の fissionなどにもアップロード可能 https://github.com/spring-cloud/spring-cloud-function
  25. 25. Kubeless / fission / funktion • k8s上で管理されるfunctionフレームワーク • Macローカルであればminikubeで構築可能 • kubectlでk8s上にサードパーティリソースとしてfunction のコントローラーを載せてアプリを制御する • 詳細は各ツールのドキュメントへ • Kubeless • http://kubeless.io • https://github.com/kubeless/kubeless • fission (Platform9) • http://fission.io • https://github.com/fission/fission • funktion (Fabric8) • https://funktion.fabric8.io • https://github.com/funktionio/funktion
  26. 26. まとめ • ローカルテストとしてのFunction実行環境が 現状のユースケースとして重宝されている • ローカルテストとは違った目的のFunctionsフ レームワークも増えている • Spring Cloud Functions:Spring Bootアプリの開発 〜デプロイ〜実行のライフサイクルを高速化 • k8s系Functionsフレームワーク:自前クラスタ上 でのアプリ開発高速化
  27. 27. Kubeless on k8s on AWSでサーバーレス 次回予告
  28. 28. Serverless Community • ServerlessConf Tokyo ’16 http://tokyo.serverlessconf.io • Serverless Meetup (Tokyo|Osaka|Sapporo) https://serverless.connpass.com • Serverless Community (JP) https://www.facebook.com/groups/813718382095265/

×