$30 off During Our Annual Pro Sale. View Details »

Serverless Frameworkを本番環境に投入するために

Serverless Frameworkを本番環境に投入するために

Serverless Frameworkを本番環境に投入するために

さっちゃん

November 17, 2016
Tweet

More Decks by さっちゃん

Other Decks in Programming

Transcript

  1. Serverless Frameworkを
    本番環境に投⼊するために

    View Slide

  2. .。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

    View Slide

  3. View Slide

  4. DreeVee (動画広告プラットフォーム) 等

    View Slide

  5. サーバーサイドエンジニア

    View Slide

  6. Serverless
    Architecture
    FaaS Serverless
    Framework
    Case
    Study

    View Slide

  7. Serverless
    Architecture
    FaaS Serverless
    Framework
    Case
    Study

    View Slide

  8. サーバーレスアーキテクチャとは?

    View Slide

  9. サーバー (レスアーキテクチャ) とは?

    View Slide

  10. Client

    View Slide

  11. 常駐
    Process
    Client
    Event

    View Slide

  12. 常駐
    Process
    Client
    狀態
    Event

    View Slide

  13. 常駐
    Process
    Client
    狀態
    Client Client Client Client
    Client Client
    Client Client Client Client

    View Slide

  14. 常駐
    Process
    Client
    狀態
    Client Client Client Client
    Client Client
    Client Client Client Client
    常駐
    Process
    常駐
    Process
    狀態 狀態

    View Slide

  15. 常駐
    Process
    Client
    狀態
    Client Client Client Client
    Client Client
    Client Client Client Client
    常駐
    Process
    常駐
    Process
    狀態 狀態
    管理

    View Slide

  16. 管理すべき事

    Eventの振り分け (Load balancing)
    処理能⼒の割り當て (Scale up)
    Process數の増減 (Scale out)
    死活監視
    Ver.更新

    View Slide

  17. 管理すべき事

    Eventの振り分け (Load balancing)
    処理能⼒の割り當て (Scale up)
    Process數の増減 (Scale out)
    死活監視
    Ver.更新
    (╯°□°)╯︵ ┻━┻

    View Slide

  18. サーバーレスアーキテクチャとは?

    View Slide

  19. 常駐
    Process
    Client
    狀態
    Client Client Client Client
    Client Client
    Client Client Client Client
    常駐
    Process
    常駐
    Process
    狀態 狀態
    管理

    View Slide

  20. Client Client Client Client Client
    Client Client
    Client Client Client Client
    狀態
    サーバーレスアーキテクチャ
    管理
    Fun
    Fun
    Fun
    Fun
    Fun
    Fun

    View Slide

  21. サーバーレスアーキテクチャ

    BaaS (Backend as a Service)
    FaaS (Function as a Service)
    S3, Cognito, Pusher, Auth0, Algolia, …

    View Slide

  22. サーバーレスアーキテクチャ

    Functionを第⼀級市⺠として扱ふインフラ設計。
    Application serverの、出來る事を殆ど減らさず
    管理costを無くせる。

    View Slide

  23. Awesome

    https://github.com/anaibol/awesome-serverless

    View Slide

  24. Tips:「serverless」でググってはいけない(☍﹏⁰)
    (Serverless Framework (後述) の事しか
    出て來ない)

    View Slide

  25. Serverless
    Architecture
    FaaS Serverless
    Framework
    Case
    Study

    View Slide

  26. FaaS ?

    View Slide

  27. FaaS ?

    AWS Lambda
    Google Cloud Functions
    Azure Functions
    IBM OpenWhisk

    View Slide

  28. FaaS (Function as a Service) ?

    View Slide

  29. FaaS (Function as a Service) ?

    View Slide

  30. FaaS (函數 as a Service) ?

    View Slide

  31. Function (函數, 働き)

    View Slide

  32. P Q
    f

    View Slide

  33. Function

    函數: ⼊⼒と出⼒の對
    働き: 狀態遷移
    (⾮形式的に) ⾔葉のイメージとしては、
    Function=函數∪働き

    View Slide

  34. Function

    1つの⼊⼒と1つの出⼒を持ち、狀態を變更する

    View Slide

  35. FaaS ?

    View Slide

  36. Event
    source
    狀態
    Function
    變更
    結果
    Event

    View Slide

  37. Event
    source
    狀態
    Function
    變更
    結果
    Event
    Function

    View Slide

  38. 狀態
    Function
    變更
    Function
    Event
    source
    Event
    source
    Event
    source

    View Slide

  39. Event
    source
    狀態
    Function
    Event
    source
    Event
    source
    Function
    Function
    Function
    Function
    Function
    Function
    Event

    View Slide

  40. Event
    source
    狀態
    Function
    Event
    source
    Event
    source
    Function
    Function
    Function
    Function
    Function
    Function
    Event
    Eventと
    Functionが
    1對1

    View Slide

  41. FaaS

    Functionを實⾏するインフラを提供する

    View Slide

  42. FaaS

    「 1つの⼊⼒と1つの出⼒を持ち、狀態を變更す
    る」ものを實⾏するインフラを提供する

    View Slide

  43. 管理すべきだった事

    Eventの振り分け (Load balancing)
    処理能⼒の割り當て (Scale up)
    Process數の増減 (Scale out)
    死活監視
    Ver.更新

    View Slide

  44. FaaSで管理すべき事

    Eventの振り分け (Load balancing)
    処理能⼒の割り當て (Scale up)→設定する
    Process數の増減 (Scale out)
    死活監視→Log監視
    Ver.更新→⾃然なBlue-Green

    View Slide

  45. FaaSで管理すべき事

    Eventの振り分け (Load balancing)
    処理能⼒の割り當て (Scale up)→設定する
    Process數の増減 (Scale out)
    死活監視→Log監視
    Ver.更新→⾃然なBlue-Green
    ♪(*>ω<)o∀*∀o(>ω<*)♪カンパーイ

    View Slide

  46. Tips:「FaaS」でググってはいけない(☍﹏⁰)
    (Fraud as a Service: 詐欺代⾏
    named by RSA Security@2008の事しか
    出て來ない)

    View Slide

  47. Serverless
    Architecture
    FaaS Serverless
    Framework
    Case
    Study

    View Slide

  48. https://serverless.com/

    View Slide

  49. Serverless Framework

    FaaSを中⼼として、サーバーレスアーキテクチャ
    でserviceを構築する爲のframework

    View Slide

  50. (〃l _ l)<でもFaaSは樂だし、framework要らな
    くない?

    View Slide

  51. (まぁFaaSは樂だよ。FaaSは)Oo。.(l _ l〃)

    View Slide

  52. Event
    source
    狀態
    Function
    變更
    結果
    Event
    Function

    View Slide

  53. Event
    source
    狀態
    Function
    變更
    結果
    Event
    Function
    Event sourceって
    具體的には何?

    View Slide

  54. Evet source

    Storageの更新/cron/HTTP access/MQTT access

    例へばAWS Lambdaに對するAPI Gateway

    View Slide

  55. API Gateway

    何かに對するREST interfaceを作成する
    どうやって?

    View Slide

  56. Terraformで剥き出しのAWS resourceを
    管理する例
    API GatewayとLambdaの組み合はせでリリースするバージョンを制御する - c4se記:さっちゃんですよ☆
    http://c4se.hatenablog.com/entry/2016/07/26/122508

    View Slide

  57. Terraformで剥き出しのAWS resourceを管理する例
    API GatewayとLambdaの組み合はせでリリースするバージョンを制御する - c4se記:さっちゃんですよ☆ http://c4se.hatenablog.com/entry/2016/07/26/122508
    管理するもの

    aws_lambda_function/aws_lambda_alias/aws_lambda_alias/aws_lam
    bda_permission/aws_lambda_permission/aws_api_gateway_rest_api/
    aws_api_gateway_deployment/aws_api_gateway_deployment/aws_ap
    i_gateway_resource/aws_api_gateway_resource/aws_api_gateway_m
    ethod/aws_api_gateway_method/aws_api_gateway_integration/aws_
    api_gateway_integration/aws_api_gateway_method_response/aws_ap
    i_gateway_method_response/aws_api_gateway_method_response/aw
    s_api_gateway_method_response/aws_api_gateway_method_respons
    e/aws_api_gateway_method_response/aws_api_gateway_integration_
    response/aws_api_gateway_integration_response/aws_api_gateway_i
    ntegration_response/aws_api_gateway_integration_response/aws_api
    _gateway_integration_response/aws_api_gateway_integration_respon
    se

    View Slide

  58. Terraformで剥き出しのAWS resourceを管理する例
    API GatewayとLambdaの組み合はせでリリースするバージョンを制御する - c4se記:さっちゃんですよ☆ http://c4se.hatenablog.com/entry/2016/07/26/122508
    deploy⼿順

    1. aws_lambda_alias.prodのfunction_versionを
    "$LATEST" にしておく。Lambda函數作成前で、
    publish_versionもしてゐずバージョンが未だ無い爲。
    2. LambdaとAPI Gatewayをデプロイ。
    3. API Gatewayをstagingステージにデプロイ。
    4. stagingで検証。
    5. Lambdaをpublish_versionして、Versionをメモする。
    6. aws_lambda_alias.prodのfunction_versionを 上でメ
    モしたバージョンに書き換へる。
    7. Lambdaをデプロイ。
    8. API Gatewayをprodステージにデプロイ。

    View Slide

  59. Terraformで剥き出しのAWS resourceを管理する例
    API GatewayとLambdaの組み合はせでリリースするバージョンを制御する - c4se記:さっちゃんですよ☆ http://c4se.hatenablog.com/entry/2016/07/26/122508
    deploy⼿順

    1. aws_lambda_alias.prodのfunction_versionを
    "$LATEST" にしておく。Lambda函數作成前で、
    publish_versionもしてゐずバージョンが未だ無い爲。
    2. LambdaとAPI Gatewayをデプロイ。
    3. API Gatewayをstagingステージにデプロイ。
    4. stagingで検証。
    5. Lambdaをpublish_versionして、Versionをメモする。
    6. aws_lambda_alias.prodのfunction_versionを 上でメ
    モしたバージョンに書き換へる。
    7. Lambdaをデプロイ。
    8. API Gatewayをprodステージにデプロイ。
    (╯°□°)╯︵ ┻━┻

    View Slide

  60. Terraformで剥き出しのAWS resourceを管理する例
    API GatewayとLambdaの組み合はせでリリースするバージョンを制御する - c4se記:さっちゃんですよ☆ http://c4se.hatenablog.com/entry/2016/07/26/122508
    deploy⼿順

    1. aws_lambda_alias.prodのfunction_versionを
    "$LATEST" にしておく。Lambda函數作成前で、
    publish_versionもしてゐずバージョンが未だ無い爲。
    2. LambdaとAPI Gatewayをデプロイ。
    3. API Gatewayをstagingステージにデプロイ。
    4. stagingで検証。
    5. Lambdaをpublish_versionして、Versionをメモする。
    6. aws_lambda_alias.prodのfunction_versionを 上でメ
    モしたバージョンに書き換へる。
    7. Lambdaをデプロイ。
    8. API Gatewayをprodステージにデプロイ。
    Event sourceの管理とEvent sourceとFunctionの
    對應の管理には、温かみの在る⾮⼈間的な作業が
    ⼀杯!

    View Slide

  61. Serverless Frameworkで管理する例

    provider:
    stage: staging
    functions:
    example:
    handler: handler.handler
    events:
    - http:
    path: "example/example”
    method: get
    integration: lambda
    - http:
    path: "example/example”
    method: put
    integration: lambda

    View Slide

  62. Serverless Frameworkで管理する例

    `sls deploy ‒s prod`

    View Slide

  63. Serverless Frameworkで管理する例

    `sls deploy ‒s prod`
    ♪(*>ω<)o∀*∀o(>ω<*)♪カンパーイ

    View Slide

  64. Serverless Frameworkとは

    FaaSに對して、Function/Event source/狀態を保
    持するserviceをdeployするtool

    View Slide

  65. AWSに對するServerless Frameworkとは

    Cloud Formation + Lambda
    Suuuuuuuuuuuuuuuuper simple!

    View Slide

  66. Tips:「Serverless Framework」で
    ググってもよいです(〃l _ l)

    View Slide

  67. Serverless
    Architecture
    FaaS Serverless
    Framework
    Case
    Study

    View Slide

  68. ⼩さなHTTP serviceを作った話
    Serverless Frameworkをv0.5→v1.0に更新した話
    RDSのslow queryを監視する話

    View Slide

  69. ⼩さなHTTP serviceを作った話
    Serverless Frameworkをv0.5→v1.0に更新した話
    RDSのslow queryを監視する話

    View Slide

  70. RDSが1時
    間毎に作る
    slowquery
    log
    RDSが1時
    間毎に作る
    slowquery
    log
    RDSが1時間
    毎に作る
    slowquery
    log
    CloudWatch
    Schedule
    Lambda
    Chat
    room
    1回/1 hour
    取得
    投稿

    View Slide

  71. service: xxx-export-slow-query
    provider:
    name: aws
    region: ap-northeast-1
    stage: prod
    runtime: python2.7
    iamRoleStatements:
    - Effect: Allow
    Action:
    - rds:DescribeDBLogFiles
    - rds:DownloadDBLogFilePortion
    Resource:
    - arn:aws:rds:*
    package:
    exclude:
    - tasks.py
    - tests
    functions:
    exportToChat:
    handler: handler.export_to_chat
    memorySize: 512
    timeout: 6
    events:
    - schedule: rate(1 hour)

    View Slide

  72. ⼀番難しかったところ

    slowquery.logを取得する最⼩のIAM roleを確かめるところ

    View Slide

  73. ⼩さなHTTP serviceを作った話
    Serverless Frameworkをv0.5→v1.0に更新した話
    RDSのslow queryを監視する話

    View Slide

  74. 問題は簡單

    ユーザーの⾏動に依って増減する或るもの個數を管理せよ
    増減履歴も保存する
    半年間増減しなければ0個にする

    View Slide

  75. 解決は難しい

    ユーザー數がそこそこ多い
    増減囘數もわりと多い
    參照囘數はかなり多い
    増減履歴は凄く多い
    Access數が突然増える
    個數がおかしくなったらコ◯スよ
    既存のsystemがかなり複雜

    View Slide

  76. 既存のsystemが複雜だね

    でもmicro serviceに出來るね
    インフラが難しいね

    でもAPI Gateway + Lambda + DynamoDBなら簡單だね!

    View Slide

  77. API
    Gateway
    Lambda
    取得/増減 Dynamo
    DB
    (個數)
    Dynamo
    DB
    (履歴)
    GET/PUT
    追記
    GET/PUT

    View Slide

  78. ⼀番難しかったところ

    DynamoDBでtransactionっぽい事が出來るのを確かめるところ
    (+ 途中迄Terraformで組んでたので、Terraformが難しかった)

    View Slide

  79. ⼩さなHTTP serviceを作った話
    Serverless Frameworkをv0.5→v1.0に更新した話
    RDSのslow queryを監視する話

    View Slide

  80. 前記の⼩さなHTTP serviceは
    Serverless Framework v0.5で作ってゐた

    v1.0がreleaseされたので、更新した

    View Slide

  81. v0.5
    /
    s-project.json
    functions/
    fun-a/
    s-function.json
    aʼs code
    fun-b/
    s-function.json
    bʼs code
    v1.0
    /
    serverless.yml
    fun-a&fun-bʼs code

    View Slide

  82. v0.5→v1.0

    設定が抽象化された (AWSに依存した記法が殆ど無くなった)
    設定が短くなった
    Function毎にcodeを分けなくなった
    AWSに作るresourceの命名法が變はった

    View Slide

  83. v0.5→v1.0

    AWSに作るresourceの命名法が變はった事を利⽤して、
    無停⽌でupgradeした

    View Slide

  84. 舊Lambda
    API
    Gateway
    custome
    domain
    舊API
    Gateway
    resource
    舊Lambda
    API
    Gateway
    custome
    domain
    舊API
    Gateway
    resource
    新Lambda
    新API
    Gateway
    resource
    API
    Gateway
    custome
    domain
    新Lambda
    新API
    Gateway
    resource

    View Slide

  85. ⼀番難しかったところ

    檢證して、インフラを變更する恐怖を乘り越えろ

    View Slide

  86. 纏め

    View Slide

  87. What?/Why?
    サーバーレスアーキテクチャ→
    Functionを第⼀級市⺠として扱ふインフラ設計
    Function→
    1つの⼊⼒と1つの出⼒を持ち、狀態を變更する
    Serverless Framework→
    FaaSと周邊serviceをdeployするtool

    View Slide

  88. What?/Why?
    サーバーレスアーキテクチャ→
    インフラ管理costが激減する
    FaaS→
    Applicationとインフラ管理を分離出來る
    Serverless Framework→
    FaaSへのdeployが凄く簡單になる

    View Slide