aws lambda + python資料 ver0.94 20160825
TRANSCRIPT
@Yasuharu Suzuki PUBLIC
2016.08.27 鈴木康元twitter @yasuharutwi
facebook yasuharu.suzuki.50
AWS Lambda + Pythonwith Serverless Framework 、 PyCharm 、 CORS
”
“Ver.0.94
@Yasuharu Suzuki PUBLIC
鈴木 康元
出身 茨城 → 東京 → 北海道 → 沖縄趣味 勉強会、嫁、半導体情報収集経歴 ゲーム開発 (15 年 ) 、教育系アプリ開発、
SIer(1 年 ) 、レキサス2年目担当 ハロペアプリ開発リーダー (SPL)コトバンバン開発リーダー (SPL)
ADOC-H 開発リーダー (SPL) など
得意技 地味プログラム
肩書 LIT(Lexues Innovation Team)R&D 担当システムエンジニア
@Yasuharu Suzuki PUBLIC
100 年間続いてきた常識をひっくり返してしまいかねないのが、人工知能である。いままでは、ある問題を解くために方程式をプログラムの形で書いたが、これからはその一部は人工知能に学習させて解くようになる。 ( 途中略 )
「 100 年の常識をひっくり返す」
流行りではなく、これからの新常識
@Yasuharu Suzuki PUBLIC
行動ログを活用したレコメンデーション話していて楽しい対話 BOT→ ユーザの活性化、継続利用率向上新たなゲームアイテムを生み出す画像生成器→ デザインコストの削減人に変わってゲームをプレイして難易度を評価してくれる AI→ テストプレイコスト削減、ユーザーの活性化&継続利用率向上、企画屋のゲームバランス設定を自動化
実業務での取り組み
これからは様々な仕事が人工知能化!
@Yasuharu Suzuki PUBLIC
社会の大きな変化
現代は「 FinTech 革命」などと言われているようにクレジットカードの購入履歴がクラウドの会計ソフトに自動アップロードされるなど、非常に生産性が向上している。アメリカではそういった会計情報をもとに AI が会社の査定を行ったり、実績のない会社でも AI を使って Facebook 上の人のつながりから査定ができるようになっている。未だに手書きが多い日本は遅れているが、そのうち銀行では銀行員や窓口業務が減り、税理士はコンサルティング業務の比重が高くなるのではないか。 税理士: F さん
@Yasuharu Suzuki PUBLIC
パフォーマンス
http://d.hatena.ne.jp/cero-t/20160101/1451665326
言語によってだいぶ違うけど・・・Python は?
まだ情報が少ない…。
@Yasuharu Suzuki PUBLIC
パフォーマンス
http://acro-engineer.hatenablog.com/entry/2016/08/02/120000
継続的にアクセスされず、かつ CPUもあまり使わない処理であれば、Python が速い。
継続的にアクセスされ、かつ CPU をあまり使わない処理であれば、どの言語も大差ない。
@Yasuharu Suzuki PUBLIC
パフォーマンス・ CPU を大量に使うのであれば、
Java が速い。
http://acro-engineer.hatenablog.com/entry/2016/08/02/120000
フィボナッチ数列計算
計算が少なければPython で良さそう!
@Yasuharu Suzuki PUBLIC
Lambda と EC2 の比較(1)
EC2 Lambda
サービスを利用していない時Amazon
EC2
稼働中
課金される
AWSLambda
停止
課金されない
サービスを利用中AWS
LambdaAmazon
EC2
稼働中
課金される起動
課金される(実行中のみ)
@Yasuharu Suzuki PUBLIC
Lambda と EC2 の比較(2)
EC2 LambdaAWS
Lambda
停止中課金されない
急激なアクセス増
一時的にアクセス数が減った時Amazon
EC2
4台稼働そのまま課金(急なスペック変更はできない)
Amazon EC2
タイムラグがある起動待ち
AWSLambda
1000台まで瞬時に起動
1000台まで自動起動
@Yasuharu Suzuki PUBLIC
Lambda と EC2 の比較(3)
EC2 Lambda
言語 通常のサーバと同様に使える。OS や言語を自由に選択可能。
言語を自由に選択できない。 Java8 、 Python 2.7 、 Javascript(node4.3) のみ。
オートスケール
オートスケールに構築も可能。ただし、インスタンスの起動 /停止に2〜3分以上かかるため、間に合わないことも。
オートスケールで自動的に 1000台まで起動する。
運用コスト
最大負荷にあわせてスペックを上げておく必要がある。稼働中は常に課金され、その価格が安くはない。
プログラムが実行されていない間は課金されない。Amazon側もハードウェアを有効活用できるため価格が安い。
開発しやすさ
従来通りの開発が可能。豊富なライブラリ、フレームワークを選択できる。
フレームワークは発展途上のものが多く、開発コストがかかる。ステートレスに組む必要がある。
@Yasuharu Suzuki PUBLIC
Lambda と EC2 の比較(4)
(抜粋 )待機が多いシステムや負荷に緩急があるシステムでは、 AWS Lambdaに移行することで、 90% 以上もコストを削減することができる。
運用コストは Lambda が圧倒的に有利!
@Yasuharu Suzuki PUBLIC
Lambda のフレームワークを探す・ Python Serverless Microframework for AWS
・ Serverless Framework
(Chalice)
(旧: JAWS Framework)
@Yasuharu Suzuki PUBLIC
Python Serverless Microframework for AWS
(Chalice)・ Python専用のため学習コストが低く、すぐに試せる。・最近まで 1 ソースファイルしかサポートしていなかった → 7/22 対応 ・複数のソースディレクトリは非対応・ APIGateway が毎回更新されてしまう。
すごく簡単で便利なのですが、マイクロ過ぎて使えない!今後のバージョンアップに期待!
@Yasuharu Suzuki PUBLIC
Serverless Framework
・ node.jsベースで Python の情報が少ない(→何とかなるレベル)・ロール設定がテキスト定義可能。・ APIGateway も細かい設定が可能。 UrlDecode など。・細かい設定ができる分、ちょっととっつきにくい。・まだバージョンが 0.5.6 。少し前に v1.0.0 が β1 リリースした。
とりあえずこれで。
@Yasuharu Suzuki PUBLIC
エディタ 使用した印象
Atom普段良く使うフリーのテキストエディタ。保存するとダブルコーテーションが文字化けし、コンパイルに失敗。使えない。
Xcode文字化けは起きないが、使用感が重い。Python特有の解析ツール( pip8 など)も適用されていない。
Visual Studio Code
文字化けは起きない。バージョンアップを重ねてだいぶ使いやすくなった。 Python特有の解析ツール( pip8など)は適用されていない。
コンソール Python はコンソール上でデバッガも出来るため、慣れれば使いやすいらしい。
Python の開発環境
@Yasuharu Suzuki PUBLIC
Jupiter Lab
まだ発表されたばかりで機能も少ないが、今後化けるかも?
IPython Notebook の開発者(Fernando Perez氏 ) が開発した、ブラウザベースの統合環境。.py ファイルと .ipynb を1つのフレームワーク内で使える。こんなのが欲しかった! (*´Д` *)
@Yasuharu Suzuki PUBLIC
PyCharm
これからプログラミングを学びたい人で、特に「綺麗なコード」を意識する人には Python+ PyCharm はおすすめしたい。コードは書く時間よりも読まれる時間の方がずっと長い!もちろん Python が初めての方にもオススメです。
人気の高い開発環境「 IntelliJ IDEA 」で有名な JetBrains 社のPython統合環境。
デバッガはもちろん、コーディング規約の pip8 や命名規則に準じたワーニングも表示される。
@Yasuharu Suzuki PUBLIC
S3Lambda
CORS-TEST1.0
静的 HTML のダウンロード静的 HTML からのAjax通信
CORS-TEST VER1.0 - CLOUD DIAGRAMS
@Yasuharu Suzuki PUBLIC
CORS(Cross-Origin Resource Sharing)
http://dev.classmethod.jp/cloud/cors-cross-origin-resource-sharing-cross-domain/
(抜粋)ブラウザがオリジン( HTML を読み込んだサーバのこと)以外のサーバからデータを取得する仕組みです。 ↓※抜け道( JSONP)を使わずに通信可能とするには、サーバ側から許可する必要があります。
@Yasuharu Suzuki PUBLIC
Git リポジトリ作成https://gitlab.com/へ移動「 New Project 」をクリック
Project名「 CORS-Test01 」としました。「 Create Project 」をクリック。
@Yasuharu Suzuki PUBLIC
Git リポジトリ作成https://gitlab.com/ で作成したProject を Source URL に指定して「 Clone 」をクリック
適当にファイルを追加してCommit & Push 。
@Yasuharu Suzuki PUBLIC
PyCharm のダウンロードPyCharm のサイトへアクセス「 DOWNLOAD NOW 」をクリック
無料の Community版をダウンロードしましょう。もちろんリッチな殿方はProfessional版でも構いません。
@Yasuharu Suzuki PUBLIC
PyCharm プロジェクト作成PyCharm を起動「 Create New Project 」をクリック
フォルダを割り当てるだけでProject が作成されます。Project名は「 CORS-Test01 」としました。
@Yasuharu Suzuki PUBLIC
AWS アカウント作成ルートアカウントしか持っていなかったので IAM ユーザ作ることにした。
アクセスキー ID 、シークレットアクセスキーをメモしておく
IAM ユーザーにパスワードを付け、適当なポリシーをアタッチしたら、「 IAM ユーザーのサインインリンク」からログインする。
@Yasuharu Suzuki PUBLIC
Serverless Framework のインストールhttp://qiita.com/susieyy/items/1c2af0ef7b88b742c37a
node のバージョンを確認します。 v4 系なら OK です。> node --versionv4.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 version1.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 Suzuki PUBLIC
Serverless Framework の deployserverless project作成> sls create -t aws-python
severless.yml を変更> vi serverless.ymlservice: 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 Informationservice: cors-test01stage: devregion: ap-northeast-1 <---- 反映されてた。endpoints: GET - https://aaa.execute-api.ap-northeast-1.amazonaws.com/dev/users/showfunctions: 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 Suzuki PUBLIC
Serverless [email protected] の再インストールhttp://qiita.com/mamo/items/6f1cf71ccd82216fe25bnpm の uninstall コマンドを忘れがちなのでメモ
アンインストール前に念のためバージョン確認
> sls -v1.0.0-beta.1.1 アンインストール実行
> npm uninstall serverless --save -g
http://qiita.com/448jp/items/58c5cbd5576c07177b8dnpm でパッケージの特定バージョンをインストールする
Serverless [email protected] のインストール
> npm install [email protected] -g バージョンの確認
> sls -v0.5.6
参考サイト
@Yasuharu Suzuki PUBLIC
Serverless [email protected] の 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-test02Serverless: 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 ProfileServerless: Select a profile for your project: > default suzuki_yasuharu-privateServerless: 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-1Serverless: 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 PUBLIC
作成した project 内にディレクトリを移動して、 endpoint作成> cd sls-cors-test02> sls function create functions/hello/worldServerless: 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.pyfrom __future__ import print_function
import jsonimport 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 !"}
Serverless [email protected] の endpoint作成参考サイト
http://tech.pero.li/entry/2016/04/08/142649
@Yasuharu Suzuki PUBLIC
Serverless [email protected] の deploy
ソースを書き換えてローカルで実行。
ローカルで軽く動作確認できるのは便利!ただしどうやら python ではコンソール出力がされない様子。
> sls function runServerless: 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 CancelServerless: 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 Suzuki PUBLIC
Serverless [email protected] の 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 Suzuki PUBLIC
unittest 設定@ PyCharm
ここから[Python tests] → [unittest]を選択
unittest に使用する .py を指定
使用する Python を指定複数入れている場合は適切なパスを指定してあげてください。
@Yasuharu Suzuki PUBLIC
まとめ・ Serverless Framework 便利!ただし ver0.5.6 を使いましょう。・ Python 遅いイメージがあったがそんなに遅くない。 ただし計算は遅い。 開発環境は作りやすい。ソースすっきり。 DeepLearning しようぜ!
@Yasuharu Suzuki PUBLIC
PythonBeginners 沖縄・助け合い所https://www.facebook.com/groups/789800504490702/
質問用グループ作りました!
初心者向けの課題解決を目的としたFacebook グループです!気軽にご参加ください\ (^o^) /