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.

serverless framework + AWS Lambda with Python

I talked about serverless framework + AWS Lambda with Python

  • Login to see the comments

  • Be the first to like this

serverless framework + AWS Lambda with Python

  1. 1. serverless frameworkでAWS Lambda PyCon Kyushu 2018 Fukuoka 2018/06/30@LINE Fukuoka
  2. 2. 自己紹介 • Masato Nakamura • twitter: masahito • work at Nulab inc. Typetalk team • Python Lover
  3. 3. Goal • AWS LambdaをPythonで気軽にかけるように! • 書いた後で改善しやすく!
  4. 4. 説明しないこと • AWS の各サービスの説明 • nodeの環境の作り方
  5. 5. Pythonお仕事で使ってる人? !
  6. 6. Pythonなんに使ってます? • 自動化処理? • デプロイ? • Web開発? • データ解析?
  7. 7. ここでは自動化処理についてフォーカ スします
  8. 8. 定期処理 • スポットで処理を行いたい • Twitterでエゴサーチ • 1日ごとのバッチの起動 • データ集計
  9. 9. 定期処理 • Cron • 外部サービス • いわゆるServerless環境 • AWS Lambda • Google Cloud Functions • Microsoft Azule Functions
  10. 10. ここではAWS Lambdaを使うパター ンを紹介します
  11. 11. Target • Python初心者 • AWSLambdaは使ったことがある/使っている
  12. 12. Goal • ! AWS LambdaをPythonで気軽にかけるように! • 書いた後で改善しやすく!
  13. 13. AWSのコンソールから登録可能 • コード書く • テスト実行
  14. 14. 一回だけ使う場合は正直これで十分
  15. 15. • 例: 障害検知 -> チャットへの投稿
  16. 16. • 例: 障害検知 -> チャットへの投稿 • ! 3rd Partyライブラリ使いたくなってくる • requests • add requirements.txt requests • run $ pip install -r requirements.txt -t vendor/ $ edit python-file $ zip /path/to/service-dir $ aws lambda ~~
  17. 17.  AWS コンソールでちょとやりづら いこと ! 3rd party ライブラリ使ったりとか ! 特にC-APIが絡むとき ! コードのバージョン管理(gitとか)
  18. 18. AWSへのデプロイ • zipファイルでのデプロイが可能 ! コードのバージョン管理
  19. 19. • zipファイルでのデプロイが可能 $ aws lambda create-function --function-name AccessMemCache --region us-east-1 --zip-file fileb://path-to/app.zip --role execution-role-arn --handler app.handler --runtime python3.6 --timeout 30 --vpc-config SubnetIds=comma-separated-vpc-subnet-ids,SecurityGroupIds=default-security-group-id --memory-size 1024 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/vpc-ec- upload-deployment-pkg.html
  20. 20. うーんもうちょい楽にしたい ! 変更するたびに自力でzip -> deploy ! ローカルでのテスト実行 • 今のところ必要な処理 $ edit python-file $ (pip install ~~) $ zip /path/to/service-dir $ aws lambda ~~
  21. 21. Serverless frameworkの紹介
  22. 22. Serverlessframework? • http://www.serverless.com Serverless Framework – Build web, mobile and IoT applications with serverless architectures using AWS Lambda, Azure Functions, Google CloudFunctions & more! • AWS Lambda, Azure Functions, Google CloudFunctions を 使ってサーバレスアーキテクチャでweb, Mobile IoT アプリケ ーションを作ろう
  23. 23. serveless frameworkの説明 • pros ! ! git/svn/hgでのファイル管理が可能 ! zip -> deployがコマンド一発 ! CloudWatch/ AWS IAMの制御とかもできる
  24. 24. serverless frameworkの利用 環境の作り方. $ npm install serverless -g $ sls -v 1.27.3
  25. 25. serverless frameworkでサービス作成 $ sls create -t aws-python3 -p py3-hello Serverless: Generating boilerplate... Serverless: Generating boilerplate in "/Users/masahito-nulab/src/jobs/typetalk-serverless-internal/py3-hello" _______ __ | _ .-----.----.--.--.-----.----| .-----.-----.-----. | |___| -__| _| | | -__| _| | -__|__ --|__ --| |____ |_____|__| ___/|_____|__| |__|_____|_____|_____| | | | The Serverless Application Framework | | serverless.com, v1.27.3 -------' Serverless: Successfully generated boilerplate for template: "aws-python3" $ tree py3-hello/ py3-hello/ ├── handler.py └── serverless.yml
  26. 26. • handler.py import json def hello(event, context): body = { "message": "Go Serverless v1.0! Your function executed successfully!", "input": event } response = { "statusCode": 200, "body": json.dumps(body) } return response • serverless.yml service: py3-hello provider: name: aws runtime: python3.6 functions: hello: handler: handler.hello
  27. 27. ローカルでのテスト実行 $ cd py3-hello $ sls invoke local -f hello { "statusCode": 200, "body": "{"message": "Go Serverless v1.0! Your function executed successfully!", "input": {}}" }
  28. 28. AWS Lambdaへのデプロイ ! IAM/Roleの設定が終わればdeployコマンドがシンプルに $ sls deploy
  29. 29. ライブラリインストールの手間も減らしたい ! 3rd-party ライブラリのインストールが必要 # ! ここを忘れがち $ pip install -r requirement.txt -t vendor/ $ sls deploy
  30. 30. ライブラリインストールの手間も減らしたい serverless-frameworkのpluginを使う • UnitedIncome/serverless-python-requirements • serverless >= v1.12
  31. 31. プラグインの導入 $ sls plugin install -n serverless-python-requirements service: py3-hello provider: name: aws runtime: python3.6 cfLogs: true plugins: - serverless-python-requirements functions: hello: handler: handler.hello
  32. 32. デプロイ ($ sls requirements install) $ sls deploy
  33. 33. やったコマンド一発!
  34. 34. 非Pure Pythonなモジュール • 開発環境はWindows/OSXなことが多い • Python CAPIで書かれたライブラリは結構ある • numpy • 画像ライブラリ: pillow etc • ローカルで固めるとLambdaで動かない ! • Amazon LambdaはLinux環境のため
  35. 35. dockerize pip docker環境でcross-compile可能 * 裏でdocker image lambci/docker-lambdaを使っている service: py3-hello provider: name: aws runtime: python3.6 cfLogs: true plugins: - serverless-python-requirements custom: pythonRequirements: dockerizePip: true functions: hello: handler: handler.hello
  36. 36. この先は管理してくときの話をします
  37. 37. Goal • AWS LambdaをPythonで気軽にかけるように! • ! 書いた後で改善しやすく!
  38. 38. デバッグがしんどい問題
  39. 39. ロギング まずはロギング print と logging.* 関数はどちらも CloudWatch Logs にログ を書き込み import logging logger = logging.getLogger() logger.setLevel(logging.INFO) def my_logging_handler(event, context): logger.info('got event{}'.format(event)) logger.error('something went wrong') return 'Hello from Lambda!'
  40. 40. 何の処理なのか忘れる問題
  41. 41. AWS Lambdaの処理は増えがち • AWS Lambda TAG • わかりやすい関数名をつける • AWS Lambda のdescription(説明)をきちんと書く
  42. 42. AWS Lambdaの処理を削除するときにも使える • 後で数が増えたときにどの処理を残していくべきかわかりや すい
  43. 43. コードで何やってたか忘れる問題
  44. 44. コメントを書こう • 何を実装しようとしてたか忘れるよね • Whyとかを書いとくと後々思い出しやすくなりますよね def _service_json_to_dict(service_dict) -> Dict[TypetalkPlan, int]: # service_json format is too strange, I'd like to change simple Dict # e.g. [{"key": [“ham”], "value": 7}, {"key": [“spam”], "value": 1}] result: Dict[TypetalkPlan, int] = dict() for m in mixpanel_dict: key = m['key'][0] value = m['value'] result[key] = value return result
  45. 45. unittestを書こう • 集計スクリプトを回す時とか、ちゃんとチェックしておきた いよね • python にはdoctestっていう良いものがありますし! def hello(name: str) -> str: """ >>> from hello import hello >>> hello('test') 'hello, test' """ return f'hello {name}'
  46. 46. run unites • nose, pytestとかのrunnerを使うと便利
  47. 47. 変数見ても何やってるかわからない問題 • 引数だけ読んでもすぐに処理を思い出せないとかありますよ ね def ham(ipadresses): return ','.join(buffer)
  48. 48. TypeHintsを使うとわかりやすく(Python3 later) from typing import List def ham(ipadresses: List[str]) -> str: return ','.join(buffer)
  49. 49. TypeHintsを使うとわかりやすく(Python2) ** あんまりPython2で書くことはないかもしれませんが** from typing import List def ham(ipadresses): # type: List[str] -> str return ','.join(buffer) 静的解析もかけたい時はmypyを使うと便利
  50. 50. まとめ • serverlessを使うことで気軽にかけるように! • 処理を書くことに集中できる • 重要なのは書くときより、書いた後 • UnitTest/Comment/Type Hints • 後で思い切って捨てるがより簡単に!
  51. 51. Thanks
  52. 52. Q&A

×