@Yasuharu Suzuki
2016.08.27 鈴木康元
twitter @yasuharutwi
facebook yasuharu.suzuki.50
AWS Lambda + Python
with Serverless Framework、PyCharm、CORS
”
“
1
Ver.0.94
@Yasuharu Suzuki2
鈴木 康元
出身 茨城 → 東京 → 北海道 → 沖縄
趣味 勉強会、嫁、半導体情報収集
経歴 ゲーム開発(15年)、教育系アプリ開発、
SIer(1年)、レキサス2年目
担当 ハロペアプリ開発リーダー(SPL)
コトバンバン開発リーダー(SPL)
ADOC-H開発リーダー(SPL) など
得意技 地味プログラム
肩書 LIT(Lexues Innovation Team)
R&D担当システムエンジニア
@Yasuharu Suzuki3
なんでPythonなん?
・使ってみたかったから!
・機械学習、人工知能が流行っているから!
初心者向けの内容だから
別にいいよね!\(^o^)/
@Yasuharu Suzuki4
機械学習、人工知能って
本当に流行ってるの?
@Yasuharu Suzuki5
100年間続いてきた常識をひっくり返
してしまいかねないのが、
人工知能である。
いままでは、ある問題を解くために方
程式をプログラムの形で書いたが、こ
れからはその一部は人工知能に学習さ
せて解くようになる。(途中略)
「100年の常識をひっくり返す」
流行りではなく、これからの新常識
@Yasuharu Suzuki6
行動ログを活用したレコメンデーション
話していて楽しい対話BOT
→ユーザの活性化、継続利用率向上
新たなゲームアイテムを生み出す画像生成器
→デザインコストの削減
人に変わってゲームをプレイして難易度を評価し
てくれるAI
→テストプレイコスト削減、ユーザーの活性化&継続利用率
向上、企画屋のゲームバランス設定を自動化
実業務での取り組み
これからは様々な仕事が人工知能化!
@Yasuharu Suzuki7
社会の大きな変化
現代は「FinTech革命」などと言われているように
クレジットカードの購入履歴がクラウドの会計ソフトに自動アッ
プロードされるなど、非常に生産性が向上している。
アメリカではそういった会計情報をもとにAIが会社の査定を行っ
たり、実績のない会社でもAIを使ってFacebook上の人のつながり
から査定ができるようになっている。
未だに手書きが多い日本は遅れているが、そのうち銀行では銀行
員や窓口業務が減り、税理士はコンサルティング業務の比重が高
くなるのではないか。
税理士:Fさん
@Yasuharu Suzuki8
機械学習 = Python?
機械学習やDeepLeaningするのに
Python以外の言語ではだめなのか?
聞いてみた!
@Yasuharu Suzuki9
機械学習エンジニア:Kさん
機械学習やるなら、
絶対Pythonです!
@Yasuharu Suzuki10
機械学習エンジニア:Oさん
研究所で使っていたMATLABの
代わりになるものを探して
いろいろ試したが
Pythonが一番良かった。
@Yasuharu Suzuki11
とりあえず
Pythonが良さそうですね!
@Yasuharu Suzuki12
パフォーマンス
http://d.hatena.ne.jp/cero-t/20160101/1451665326
言語によってだいぶ違うけど・・・
Pythonは?
まだ情報が少ない…。
@Yasuharu Suzuki13
パフォーマンス
http://acro-engineer.hatenablog.com/entry/2016/08/02/120000
継続的にアクセスされず、かつCPUも
あまり使わない処理であれば、
Pythonが速い。
継続的にアクセスされ、かつCPUをあ
まり使わない処理であれば、
どの言語も大差ない。
@Yasuharu Suzuki14
パフォーマンス
・CPUを大量に使うのであれば、
Javaが速い。
http://acro-engineer.hatenablog.com/entry/2016/08/02/120000
フィボナッチ数列計算
計算が少なければ
Pythonで良さそう!
@Yasuharu Suzuki15
なぜLambda?
EC2じゃだめなん?
@Yasuharu Suzuki
LambdaとEC2の比較(1)
16
EC2 Lambda
サービスを利用して
いない時
Amazon
EC2
稼働中
課金される
AWS
Lambda
停止
課金されない
サービスを利用中
AWS
Lambda
Amazon
EC2
稼働中
課金される
起動
課金される
(実行中のみ)
@Yasuharu Suzuki
LambdaとEC2の比較(2)
17
EC2 Lambda
AWS
Lambda
停止中
課金されない
急激なアクセス増
一時的にアクセス数
が減った時
Amazon
EC2
4台稼働
そのまま課金
(急なスペック変更はできない)
Amazon
EC2
タイムラグがある
起動待ち
AWS
Lambda
1000台まで瞬時に起動
1000台まで
自動起動
@Yasuharu Suzuki
LambdaとEC2の比較(3)
18
EC2 Lambda
言語
通常のサーバと同様に使える。
OSや言語を自由に選択可能。
言語を自由に選択できない。Java8、
Python 2.7、Javascript(node4.3)のみ。
オート
スケール
オートスケールに構築も可能。ただし、イ
ンスタンスの起動/停止に2〜3分以上か
かるため、間に合わないことも。
オートスケールで自動的に1000台まで起
動する。
運用
コスト
最大負荷にあわせてスペックを上げておく
必要がある。
稼働中は常に課金され、その価格が安くは
ない。
プログラムが実行されていない間は課金さ
れない。
Amazon側もハードウェアを有効活用でき
るため価格が安い。
開発
しやすさ
従来通りの開発が可能。
豊富なライブラリ、フレームワークを選択
できる。
フレームワークは発展途上のものが多く、
開発コストがかかる。
ステートレスに組む必要がある。
@Yasuharu Suzuki
LambdaとEC2の比較(4)
19
(抜粋)
待機が多いシステムや負荷に緩急が
あるシステムでは、AWS Lambdaに
移行することで、90%以上もコスト
を削減することができる。
運用コストはLambdaが圧倒的に有利!
@Yasuharu Suzuki20
Lambdaのフレームワークを探す
・Python Serverless Microframework for AWS
・Serverless Framework
(Chalice)
(旧:JAWS Framework)
@Yasuharu Suzuki21
Python Serverless Microframework
for AWS (Chalice)
・Python専用のため学習コストが低く
、すぐに試せる。
・最近まで1ソースファイルしかサポ
ートしていなかった → 7/22対応
・複数のソースディレクトリは非対応
・APIGatewayが毎回更新されてしま
う。
すごく簡単で便利なのですが、マイクロ過ぎて使えない!
今後のバージョンアップに期待!
@Yasuharu Suzuki22
Serverless Framework
・node.jsベースでPythonの情報が少ない
(→何とかなるレベル)
・ロール設定がテキスト定義可能。
・APIGatewayも細かい設定が可能。
UrlDecodeなど。
・細かい設定ができる分、ちょっととっつ
きにくい。
・まだバージョンが0.5.6。
少し前にv1.0.0がβ1リリースした。
とりあえずこれで。
@Yasuharu Suzuki23
Pythonの開発環境を探す
・Atom
・Xcode
・Visual Studio Code
・Jupyter Lab
・PyCharm
@Yasuharu Suzuki24
エディタ 使用した印象
Atom
普段良く使うフリーのテキストエディタ。
保存するとダブルコーテーションが文字化けし、コンパイ
ルに失敗。使えない。
Xcode
文字化けは起きないが、使用感が重い。
Python特有の解析ツール(pip8など)も適用されていな
い。
Visual Studio
Code
文字化けは起きない。バージョンアップを重ねてだいぶ
使いやすくなった。Python特有の解析ツール(pip8など
)は適用されていない。
コンソール
Pythonはコンソール上でデバッガも出来るため、慣れれ
ば使いやすいらしい。
Pythonの開発環境
@Yasuharu Suzuki25
Jupiter Lab
まだ発表されたばかりで機能も少ないが、今後化けるかも?
IPython Notebookの開発者
(Fernando Perez氏)が開発した、
ブラウザベースの統合環境。
.pyファイルと.ipynbを1つのフレ
ームワーク内で使える。こんなの
が欲しかった!(*´Д`*)
@Yasuharu Suzuki26
PyCharm
これからプログラミングを学びたい人で、特に「綺麗なコード」を意識する人
にはPython+PyCharmはおすすめしたい。
コードは書く時間よりも読まれる時間の方がずっと長い!
もちろんPythonが初めての方にもオススメです。
人気の高い開発環境「IntelliJ IDEA」
で有名なJetBrains社のPython統合環
境。
デバッガはもちろん、コーディング
規約のpip8や命名規則に準じたワー
ニングも表示される。
@Yasuharu Suzuki27
じゃあとりあえず、何かつくってみましょうか!
@Yasuharu Suzuki28
S3Lambda
CORS-
TEST1.0
静的HTMLの
ダウンロード
静的HTMLからの
Ajax通信
CORS-TEST VER1.0 - CLOUD DIAGRAMS
@Yasuharu Suzuki29
CORS
(Cross-Origin Resource Sharing)
http://dev.classmethod.jp/cloud/cors-cross-origin-resource-sharing-cross-domain/
(抜粋)
ブラウザがオリジン(HTMLを読
み込んだサーバのこと)以外のサ
ーバからデータを取得する仕組み
です。
↓
※抜け道(JSONP)を使わずに通
信可能とするには、サーバ側から
許可する必要があります。
@Yasuharu Suzuki30
Gitリポジトリ作成
https://gitlab.com/へ移動
「New Project」をクリック
Project名「CORS-Test01」としま
した。
「Create Project」をクリック。
@Yasuharu Suzuki31
Gitリポジトリ作成
https://gitlab.com/ で作成したProject
をSource URLに指定して
「Clone」をクリック
適当にファイルを追加して
Commit & Push。
@Yasuharu Suzuki32
PyCharmのダウンロード
PyCharmのサイトへアクセス
「DOWNLOAD NOW」をクリック
無料のCommunity版をダウンロー
ドしましょう。
もちろんリッチな殿方は
Professional版でも構いません。
@Yasuharu Suzuki33
PyCharmプロジェクト作成
PyCharmを起動
「Create New Project」をクリック
フォルダを割り当てるだけで
Projectが作成されます。
Project名は「CORS-Test01」とし
ました。
@Yasuharu Suzuki34
AWSアカウント作成
ルートアカウントしか持っていなか
ったのでIAMユーザ作ることにした
。
アクセスキーID、シークレットアク
セスキーをメモしておく
IAMユーザーにパスワードを付け、
適当なポリシーをアタッチしたら、
「IAMユーザーのサインインリンク」か
らログインする。
@Yasuharu Suzuki35
Serverless Frameworkのインストール
http://qiita.com/susieyy/items/1c2af0ef7b88b742c37a
nodeのバージョンを確認します。v4系ならOKです。
> node --version
v4.3.2
node無いときは入れます(nodebrewでのインストール方法 http://mae.chab.in/archives/2880)
> brew install nodebrew
> export PATH=$HOME/.nodebrew/current/bin:$PATH
> source ~/.bashrc
> nodebrew install-binary stable
use v6.2.2
Serverless Frameworkのインストール
> npm install serverless -g
> sls version
1.0.0-beta.1.1
な、なんだってー!!!! (ちょっと前までv0.5.6だった)
AWS CLIをインストールします。
> pip install awscli
AWSのcredentials確認。defaultを見に行くので確認しておく。
> cat ~/.aws/credentials
[default]
aws_access_key_id = <<アクセスキー>>
aws_secret_access_key = <<シークレットアクセスキー>>
[suzuki_yasuharu-private]
aws_access_key_id = <<アクセスキー>>
aws_secret_access_key = <<シークレットアクセスキー>>
無いときは書く
> mkdir ~/.aws/
> vi ~/.aws/credentials
参考サイト
Defaultでver1.0.0-beta.1.1が
インストールされる。
@Yasuharu Suzuki36
Serverless Frameworkのdeploy
serverless project作成
> sls create -t aws-python
severless.ymlを変更
> vi serverless.yml
service: corstest01
defaults:
stage: dev
region: ap-northeast-1 <---- 変更してみた
functions: <---- 変更してみた
show:
handler: handler.hello
events:
- http: GET users/show
> vi serverless.env.yml
regions:
ap-northeast-1: <---- 変更してみた
デプロイしてみる
> sls deploy
数分待たされる
Service Information
service: cors-test01
stage: dev
region: ap-northeast-1 <---- 反映されてた。
endpoints:
GET - https://aaa.execute-api.ap-northeast-1.amazonaws.com/dev/users/show
functions:
cors-test01-dev-hello: arn:aws:lambda:ap-northeast-1:bbb:function:cors-test01-dev-hello
テスト実行
> curl https://aaa.execute-api.ap-northeast-1.amazonaws.com/dev/users/show
ローカルテスト実行
> sls invoke --function hello
https://github.com/serverless/serverless/blob/master/docs/
guide/overview-of-event-sources.md#http-endpoint
参考サイト (公式のみ。まだ情報が少ない!)
ver0.5.6と比較して
破壊的なバージョンアップ
orz
@Yasuharu Suzuki37
CORSの設定・・・・
ver0.5.6にあった
s-function.jsonがない!
@Yasuharu Suzuki38
良い子はver.0.5.6を使いましょう!
直前になってver1.00に挑んだ私が
バカでした!
@Yasuharu Suzuki39
Serverless Framework@0.5.6の再インストール
http://qiita.com/mamo/items/6f1cf71ccd82216fe25b
npmのuninstallコマンドを忘れがちなのでメモ
アンインストール前に念のためバージョン確認
> sls -v
1.0.0-beta.1.1アンインストール実行
> npm uninstall serverless --save -g
http://qiita.com/448jp/items/58c5cbd5576c07177b8d
npmでパッケージの特定バージョンをインストールする
Serverless Framework@0.5.6 のインストール
> npm install serverless@0.5.6 -g
バージョンの確認
> sls -v
0.5.6
参考サイト
@Yasuharu Suzuki40
Serverless Framework@0.5.6のProject作成
参考サイト
http://tech.pero.li/entry/2016/04/08/142649
node.jsの例ですがseverlessフレームワークの情報多め
Serverlessフレームワークで Amazon API Gateway + Lambda のAPIを作った
プロジェクト作成(v1.00とかなり異なる)
> sls project create
_______ __
| _ .-----.----.--.--.-----.----| .-----.-----.-----.
| |___| -__| _| | | -__| _| | -__|__ --|__ --|
|____ |_____|__| ___/|_____|__| |__|_____|_____|_____|
| | | The Serverless Application Framework
| | serverless.com, v0.5.6
`-------'
Serverless: Initializing Serverless Project...
Serverless: Enter a name for this project: (serverless-s15t8i) sls-cors-test02
Serverless: Enter a new stage name for this project: (dev)
Serverless: For the "dev" stage, do you want to use an existing Amazon Web Services profile or create a
new one?
> Existing Profile
Create A New Profile
Serverless: Select a profile for your project:
> default
suzuki_yasuharu-private
Serverless: Creating stage "dev"...
Serverless: Select a new region for your stage:
us-east-1
us-west-2
eu-west-1
eu-central-1
> ap-northeast-1
Serverless: Creating region "ap-northeast-1" in stage "dev"...
Serverless: Deploying resources to stage "dev" in region "ap-northeast-1" via Cloudformation (~3
minutes)...
Serverless: Successfully deployed "dev" resources to "ap-northeast-1"
Serverless: Successfully created region "ap-northeast-1" within stage "dev"
Serverless: Successfully created stage "dev"
Serverless: Successfully initialized project "sls-cors-test02"
Project名
ステージ
AWS Profileの選択
regionの選択
@Yasuharu Suzuki
作成したproject内にディレクトリを移動して、endpoint作成
> cd sls-cors-test02
> sls function create functions/hello/world
Serverless: Please, select a runtime for this new Function
nodejs4.3
> python2.7
nodejs (v0.10, soon to be deprecated)
Serverless: For this new Function, would you like to create an Endpoint, Event, or just the Function?
> Create Endpoint
Create Event
Just the Function...
Serverless: Successfully created function: "functions/hello/world"
デフォルトで出力されたソースファイルを表示
> cd functions/hello/world
> cat handler.py
from __future__ import print_function
import json
import logging
log = logging.getLogger()
log.setLevel(logging.DEBUG)
def handler(event, context):
log.debug("Received event {}".format(json.dumps(event)))
return {}
functions/hello/world/handler.handlerのソースを修正。戻り値をちょっと変えただけ。
return {"message":"cors test !"}
41
Serverless Framework@0.5.6のendpoint作成
参考サイト
http://tech.pero.li/entry/2016/04/08/142649
@Yasuharu Suzuki42
Serverless Framework@0.5.6のdeploy
ソースを書き換えてローカルで実行。
ローカルで軽く動作確認できるのは便利!
ただしどうやらpythonではコンソール出力がされない様子。
> sls function run
Serverless: Running world...
Serverless: -----------------
Serverless: Success! - This Response Was Returned:
Serverless: {"message":"cors test !"}
参考サイト
http://tech.pero.li/entry/2016/04/08/142649
デプロイ!
> sls dash deploy
-- (途中略) --
Serverless: Select the assets you wish to deploy:
world
function - world
endpoint - world - GET
- - - - -
> Deploy
Cancel
Serverless: Successfully deployed endpoints in "dev" to the following regions:
Serverless: ap-northeast-1 ------------------------
Serverless: GET - world - https://aaa.execute-api.ap-northeast-1.amazonaws.com/dev/world
curlで叩いてみる
とても簡単ですね!
> curl https://aaa.execute-api.ap-northeast-1.amazonaws.com/dev/world
{"message": "cors test !"}
@Yasuharu Suzuki43
Serverless Framework@0.5.6のCORS設定
参考サイト
http://davidcai.github.io/blog/posts/serverless-and-cors/
Serverless Framework & AWS API Gateway CORS
s-function.jsonを開く。
GETメソッドのResponseパラメータを追加
OPTIONSメソッド追加
"responseParameters": {
"method.response.header.Access-Control-Allow-Headers": "'Content-Type,X-Amz-
Date,Authorization,X-Api-Key,Cache-Control'",
"method.response.header.Access-Control-Allow-Methods": "'*'",
"method.response.header.Access-Control-Allow-Origin": "'*'"
},
{
"path": "hello/world",
"method": "OPTIONS",
"type": "AWS",
"authorizationType": "none",
"authorizerFunction": false,
"apiKeyRequired": false,
"requestParameters": {},
"requestTemplates": {
"application/json": ""statusCode": 200"
},
"responses": {
"default": {
"statusCode": "200",
"responseParameters": {
"method.response.header.Access-Control-Allow-Headers": "'Content-Type,X-Amz-
Date,Authorization,X-Api-Key,Cache-Control'",
"method.response.header.Access-Control-Allow-Methods": "'*'",
"method.response.header.Access-Control-Allow-Origin": "'*'"
},
"responseModels": {},
"responseTemplates": {
"application/json": ""
}
}
}
@Yasuharu Suzuki44
CORS設定のテストプログラム
index.html common.js
@Yasuharu Suzuki45
CORS設定の動作確認
出力結果
成功!
@Yasuharu Suzuki46
unittest設定@PyCharm
ここから
[Python tests] → [unittest]
を選択
unittestに使用する.pyを指定
使用するPythonを指定
複数入れている場合は適切なパスを指
定してあげてください。
@Yasuharu Suzuki47
PyCharmでデバッガ実行
ここから実行
デバッグ出力
ブレイクポイントを設定
@Yasuharu Suzuki48
まとめ
・Serverless Framework
便利!ただしver0.5.6を使いましょう。
・Python
遅いイメージがあったがそんなに遅くない。
ただし計算は遅い。
開発環境は作りやすい。ソースすっきり。
DeepLearningしようぜ!
@Yasuharu Suzuki49
PyData.Okinawa
毎月のだいたい第3土曜日に開催されています。
前回はKerasで深層学習でした!
@Yasuharu Suzuki50
PythonBeginners沖縄(仮)
PyDataの仲間で集まっています。
もくもく会です。
@Yasuharu Suzuki51
PythonBeginners沖縄・助け合い所
https://www.facebook.com/groups/789800504490702/
質問用グループ作りました!
初心者向けの課題解決を目的とした
Facebookグループです!
気軽にご参加ください\(^o^)/
@Yasuharu Suzuki52
ご清聴ありがとうございました!

AWS Lambda + Python資料 ver0.94 20160825