Serverless on Container
セクションナイン 吉田真吾
2017.7.19
吉田真吾
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!!
FaaSを支えるコンテナ技術
• 多くのFaaSのサービスの基礎はコンテナ技術
でできている
• リソースの調達が素早いので、リクエストのないと
きはリソースを一切使わず、大量にリクエストがあ
るときはスケールさせやすくできる
• スケジューラーによって1VM内に複数の実行環境
を確保できるので、リソースの集約効率が高い
Function as a Service
• AWS Lambda
• Azure Functions
• Google Cloud Functions
• IBM Bluemix OpenWhisk
• Webtask (Auth0)
• Hyper Func (Hyper.sh)
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
誰でもFaaSが作れる
• FaaSを自分の好きな環境で構築できるツールが巷
には多数ある
• FaaSのサポートする言語、イベントソースがさま
ざまであるのと同じように、FaaSのツールもプ
ラットフォームの構築方法からリクエストパラ
メータの渡し方、サポート言語、イベントソース
などに違いがある
• 現在のユースケースとしては「FaaSのローカルテ
スト用」「自前クラスタ上でのアプリ開発速度の
向上」が主眼におかれることが多い印象
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
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
• Dockerベースのコア環境
• Golang製
• Function formatに沿えばどんな言語の実行環境も
載せられる
• 2016/11 αリリース
• Lambda完全サポート
• Lambdaコードをいろんな実行環境に移植できる
• ただしハンドラーに指定できるファイル名は
「func.js」のみ
https://github.com/iron-io/functions
• 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
• モード
• シングルモード
• 組込みDB、MQ、APIエンドポイントを利用
• スタックバージョン
• DB: 環境変数でMySQLかPostgreSQLに接続
• MQ: 環境変数でRedisかIronMQ(SaaS)に接続
• APIエンドポイント: 環境変数でロードバランサーを指定
https://github.com/iron-io/functions
• アプリ: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
• 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
• イメージと呼び出すアプリ名とのルーティング
• 実行
$ 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!
• 実行環境はコントローラー(常駐)とアプリ
(呼び出し事にプロビジョニング:コールドス
タート)
• なので何回やってもだいぶ遅い
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
• 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
• ダッシュボードも利用可能
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
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
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
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
接合部を活用してテストを書く
Serverless Frameworkでもローカル実行できる
$ sls invoke local -f funcname
その他の
Function実行環境
Apache OpenWhisk
• 2016/2 BlueMix上のサービスとしてβ提供開始
→2016/11 Apache Incubator へ登録
• サポート環境
• Node.js, Swift, Python,
Java, Docker
• Docker環境上にセット
アップできるのでPCで
ローカル実行可能
https://github.com/apache/incubator-openwhisk
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
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
まとめ
• ローカルテストとしてのFunction実行環境が
現状のユースケースとして重宝されている
• ローカルテストとは違った目的のFunctionsフ
レームワークも増えている
• Spring Cloud Functions:Spring Bootアプリの開発
〜デプロイ〜実行のライフサイクルを高速化
• k8s系Functionsフレームワーク:自前クラスタ上
でのアプリ開発高速化
Kubeless on k8s on
AWSでサーバーレス
次回予告
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/
コンテナで作れるFaaS

コンテナで作れるFaaS