SlideShare a Scribd company logo
serverless frameworkでAWS
Lambda
PyCon Kyushu 2018 Fukuoka
2018/06/30@LINE Fukuoka
自己紹介
• Masato Nakamura
• twitter: masahito
• work at Nulab inc. Typetalk team
• Python Lover
Goal
• AWS LambdaをPythonで気軽にかけるように!
• 書いた後で改善しやすく!
説明しないこと
• AWS の各サービスの説明
• nodeの環境の作り方
Pythonお仕事で使ってる人? !
Pythonなんに使ってます?
• 自動化処理?
• デプロイ?
• Web開発?
• データ解析?
ここでは自動化処理についてフォーカ
スします
定期処理
• スポットで処理を行いたい
• Twitterでエゴサーチ
• 1日ごとのバッチの起動
• データ集計
定期処理
• Cron
• 外部サービス
• いわゆるServerless環境
• AWS Lambda
• Google Cloud Functions
• Microsoft Azule Functions
ここではAWS Lambdaを使うパター
ンを紹介します
Target
• Python初心者
• AWSLambdaは使ったことがある/使っている
Goal
• ! AWS LambdaをPythonで気軽にかけるように!
• 書いた後で改善しやすく!
AWSのコンソールから登録可能
• コード書く
• テスト実行
一回だけ使う場合は正直これで十分
• 例: 障害検知 -> チャットへの投稿
• 例: 障害検知 -> チャットへの投稿
• ! 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 ~~
 AWS コンソールでちょとやりづら
いこと
! 3rd party ライブラリ使ったりとか
! 特にC-APIが絡むとき
! コードのバージョン管理(gitとか)
AWSへのデプロイ
• zipファイルでのデプロイが可能
! コードのバージョン管理
• 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
うーんもうちょい楽にしたい
! 変更するたびに自力でzip -> deploy
! ローカルでのテスト実行
• 今のところ必要な処理
$ edit python-file
$ (pip install ~~)
$ zip /path/to/service-dir
$ aws lambda ~~
Serverless frameworkの紹介
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 アプリケ
ーションを作ろう
serveless frameworkの説明
• pros !
! git/svn/hgでのファイル管理が可能
! zip -> deployがコマンド一発
! CloudWatch/ AWS IAMの制御とかもできる
serverless frameworkの利用
環境の作り方.
$ npm install serverless -g
$ sls -v
1.27.3
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
• 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
ローカルでのテスト実行
$ cd py3-hello
$ sls invoke local -f hello
{
"statusCode": 200,
"body": "{"message": "Go Serverless v1.0! Your function executed successfully!", "input": {}}"
}
AWS Lambdaへのデプロイ
! IAM/Roleの設定が終わればdeployコマンドがシンプルに
$ sls deploy
ライブラリインストールの手間も減らしたい
! 3rd-party ライブラリのインストールが必要
# ! ここを忘れがち
$ pip install -r requirement.txt -t vendor/
$ sls deploy
ライブラリインストールの手間も減らしたい
serverless-frameworkのpluginを使う
• UnitedIncome/serverless-python-requirements
• serverless >= v1.12
プラグインの導入
$ 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
デプロイ
($ sls requirements install)
$ sls deploy
やったコマンド一発!
非Pure Pythonなモジュール
• 開発環境はWindows/OSXなことが多い
• Python CAPIで書かれたライブラリは結構ある
• numpy
• 画像ライブラリ: pillow etc
• ローカルで固めるとLambdaで動かない !
• Amazon LambdaはLinux環境のため
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
この先は管理してくときの話をします
Goal
• AWS LambdaをPythonで気軽にかけるように!
• ! 書いた後で改善しやすく!
デバッグがしんどい問題
ロギング
まずはロギング
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!'
何の処理なのか忘れる問題
AWS Lambdaの処理は増えがち
• AWS Lambda TAG
• わかりやすい関数名をつける
• AWS Lambda のdescription(説明)をきちんと書く
AWS Lambdaの処理を削除するときにも使える
• 後で数が増えたときにどの処理を残していくべきかわかりや
すい
コードで何やってたか忘れる問題
コメントを書こう
• 何を実装しようとしてたか忘れるよね
• 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
unittestを書こう
• 集計スクリプトを回す時とか、ちゃんとチェックしておきた
いよね
• python にはdoctestっていう良いものがありますし!
def hello(name: str) -> str:
"""
>>> from hello import hello
>>> hello('test')
'hello, test'
"""
return f'hello {name}'
run unites
• nose, pytestとかのrunnerを使うと便利
変数見ても何やってるかわからない問題
• 引数だけ読んでもすぐに処理を思い出せないとかありますよ
ね
def ham(ipadresses):
return ','.join(buffer)
TypeHintsを使うとわかりやすく(Python3 later)
from typing import List
def ham(ipadresses: List[str]) -> str:
return ','.join(buffer)
TypeHintsを使うとわかりやすく(Python2)
** あんまりPython2で書くことはないかもしれませんが**
from typing import List
def ham(ipadresses): # type: List[str] -> str
return ','.join(buffer)
静的解析もかけたい時はmypyを使うと便利
まとめ
• serverlessを使うことで気軽にかけるように!
• 処理を書くことに集中できる
• 重要なのは書くときより、書いた後
• UnitTest/Comment/Type Hints
• 後で思い切って捨てるがより簡単に!
Thanks
Q&A

More Related Content

PDF
Lambdaによるクラウド型言語の実装
PDF
20140930 anything as_code
PDF
DynamoDBのまえにキャッシュおく奴
PDF
Elixir Meetup #1 Loggerの構造と拡張
PDF
SQLによるDynamoDBの操作
PDF
Vagrant で PHP 開発環境を作る ハンズオン
PDF
Azure Websites で作るスケーラブルな PHP アプリケーション
PDF
Ansible ではじめるサーバ作業の自動化
Lambdaによるクラウド型言語の実装
20140930 anything as_code
DynamoDBのまえにキャッシュおく奴
Elixir Meetup #1 Loggerの構造と拡張
SQLによるDynamoDBの操作
Vagrant で PHP 開発環境を作る ハンズオン
Azure Websites で作るスケーラブルな PHP アプリケーション
Ansible ではじめるサーバ作業の自動化

What's hot (20)

PDF
FluentdとRedshiftの素敵な関係
PDF
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編
PDF
わかってるフレームワーク Laravel
PDF
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda
PDF
PHPコードではなく PHPコードの「書き方」を知る
PDF
Heroku で作る
スケーラブルな 
PHP アプリケーション
PPTX
同じサービスを ECSとOpsWorksで 運用してみた
PDF
Vagrant体験入門
PDF
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
PDF
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.
PDF
JAWSUG版 PostgreSQL on Amazon EC2の可能性
PDF
Kafka logをオブジェクトストレージに連携する方法まとめ
PDF
開発現場で活用するVagrant
KEY
Shelly
PDF
Active job meets kubernetes
PDF
Ruby/Rails Benchmarking and Profiling with TDD
PDF
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
PDF
Vagrant で作る PHP 開発環境 [実践編]
PPT
Scala on Hadoop
PDF
CFの便利機能を他の環境でも。Open Service Broker
FluentdとRedshiftの素敵な関係
PHPという概念が存在しない退屈な世界 - AWS LambdaでWebAPP編
わかってるフレームワーク Laravel
20150908 ”時間の流れ” という無限リストを扱うAWS Lambda
PHPコードではなく PHPコードの「書き方」を知る
Heroku で作る
スケーラブルな 
PHP アプリケーション
同じサービスを ECSとOpsWorksで 運用してみた
Vagrant体験入門
Kafkaを使った マイクロサービス基盤 part2 +運用して起きたトラブル集
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.
JAWSUG版 PostgreSQL on Amazon EC2の可能性
Kafka logをオブジェクトストレージに連携する方法まとめ
開発現場で活用するVagrant
Shelly
Active job meets kubernetes
Ruby/Rails Benchmarking and Profiling with TDD
Apache Airflow入門 (マーケティングデータ分析基盤技術勉強会)
Vagrant で作る PHP 開発環境 [実践編]
Scala on Hadoop
CFの便利機能を他の環境でも。Open Service Broker
Ad

Similar to serverless framework + AWS Lambda with Python (20)

PPTX
Serverless frameworkを使ってみた話 at #nseg #90
PDF
Serverless frameworkでお手軽lambda運用 at #nseg #93
PPTX
serverless
PPTX
サーバーレスで ガチ本番運用までやってるお話し
PPTX
サーバーレスアプリケーションの作り方
PDF
AWS Black Belt Online Seminar 2016 AWS上でのサーバーレスアーキテクチャ入門
PPTX
aws lambdaでpythonを実行するときのチューニング案を試してみた!
PDF
画像処理をAWS LambdaのPythonで!
PDF
担当Pjのciにserverless frameworkを導入した話
PDF
serverless
PDF
AWS LambdaとAPI Gatewayでサーバレスなシステム構築に踏み出してみる
PPTX
はじめてのAws lambda
PPTX
はじめてのAWS Lambda
PDF
AWS Black Belt Techシリーズ AWS Lambda
PDF
20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice
PDF
Serverlessでサイト監視
PDF
コンテナで始める柔軟な AWS Lambda 生活
PDF
AWS Lambdaによるサーバレスアーキテクチャの基本に触れてみよう!【kintone & AWS ハンズオン祭り2015秋 B-2】
PDF
AWS Lambdaによるサーバレスアーキテクチャの基本に触れてみよう!【kintone & AWS ハンズオン祭り2015秋 B-2】
PPTX
初めてのLambda(ラムダ)
Serverless frameworkを使ってみた話 at #nseg #90
Serverless frameworkでお手軽lambda運用 at #nseg #93
serverless
サーバーレスで ガチ本番運用までやってるお話し
サーバーレスアプリケーションの作り方
AWS Black Belt Online Seminar 2016 AWS上でのサーバーレスアーキテクチャ入門
aws lambdaでpythonを実行するときのチューニング案を試してみた!
画像処理をAWS LambdaのPythonで!
担当Pjのciにserverless frameworkを導入した話
serverless
AWS LambdaとAPI Gatewayでサーバレスなシステム構築に踏み出してみる
はじめてのAws lambda
はじめてのAWS Lambda
AWS Black Belt Techシリーズ AWS Lambda
20190619 AWS Black Belt Online Seminar Dive Deep into AWS Chalice
Serverlessでサイト監視
コンテナで始める柔軟な AWS Lambda 生活
AWS Lambdaによるサーバレスアーキテクチャの基本に触れてみよう!【kintone & AWS ハンズオン祭り2015秋 B-2】
AWS Lambdaによるサーバレスアーキテクチャの基本に触れてみよう!【kintone & AWS ハンズオン祭り2015秋 B-2】
初めてのLambda(ラムダ)
Ad

More from masahitojp (16)

PDF
Python と型ヒントとその使い方
PDF
Enjoy Type Hints and its benefits
PDF
Build a RESTful API with the Serverless Framework
PDF
Presentation kyushu-2018
PDF
The Benefits of Type Hints
PDF
20170131 python3 6 PEP526
PDF
chat bot framework for Java8
PDF
Akka meetup 2014_sep
PDF
Pyconjp2014_implementations
PDF
Pyconsg2014 pyston
PDF
Pykonjp2014
PDF
Riak map reduce for beginners
KEY
Play2 translate 20120714
KEY
Play2の裏側
KEY
Play!framework2.0 introduction
ZIP
5分で説明する Play! scala
Python と型ヒントとその使い方
Enjoy Type Hints and its benefits
Build a RESTful API with the Serverless Framework
Presentation kyushu-2018
The Benefits of Type Hints
20170131 python3 6 PEP526
chat bot framework for Java8
Akka meetup 2014_sep
Pyconjp2014_implementations
Pyconsg2014 pyston
Pykonjp2014
Riak map reduce for beginners
Play2 translate 20120714
Play2の裏側
Play!framework2.0 introduction
5分で説明する Play! scala

serverless framework + AWS Lambda with Python