O slideshow foi denunciado.
Utilizamos seu perfil e dados de atividades no LinkedIn para personalizar e exibir anúncios mais relevantes. Altere suas preferências de anúncios quando desejar.

コンテナで作れるFaaS

1.860 visualizações

Publicada em

2017.7.19 JAWS-UG横浜

Publicada em: Tecnologia
  • Seja o primeiro a comentar

コンテナで作れる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/

×