aws lambda + python資料 ver0.94 20160825

52
@Yasuharu Suzuki PUBLIC 2016.08.27 鈴鈴鈴鈴 twitter @yasuharutwi facebook yasuharu.suzuki.50 AWS Lambda + Python with Serverless Framework PyCharm CORS Ver.0.94

Upload: yasuharu-suzuki

Post on 09-Jan-2017

1.625 views

Category:

Software


0 download

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

なんで Python なん?

・使ってみたかったから!・機械学習、人工知能が流行っているから!

初心者向けの内容だから別にいいよね!\ (^o^) /

@Yasuharu Suzuki PUBLIC

機械学習、人工知能って本当に流行ってるの?

@Yasuharu Suzuki PUBLIC

100 年間続いてきた常識をひっくり返してしまいかねないのが、人工知能である。いままでは、ある問題を解くために方程式をプログラムの形で書いたが、これからはその一部は人工知能に学習させて解くようになる。 ( 途中略 )

「 100 年の常識をひっくり返す」

流行りではなく、これからの新常識

@Yasuharu Suzuki PUBLIC

行動ログを活用したレコメンデーション話していて楽しい対話 BOT→ ユーザの活性化、継続利用率向上新たなゲームアイテムを生み出す画像生成器→ デザインコストの削減人に変わってゲームをプレイして難易度を評価してくれる AI→ テストプレイコスト削減、ユーザーの活性化&継続利用率向上、企画屋のゲームバランス設定を自動化

実業務での取り組み

これからは様々な仕事が人工知能化!

@Yasuharu Suzuki PUBLIC

社会の大きな変化

現代は「 FinTech 革命」などと言われているようにクレジットカードの購入履歴がクラウドの会計ソフトに自動アップロードされるなど、非常に生産性が向上している。アメリカではそういった会計情報をもとに AI が会社の査定を行ったり、実績のない会社でも AI を使って Facebook 上の人のつながりから査定ができるようになっている。未だに手書きが多い日本は遅れているが、そのうち銀行では銀行員や窓口業務が減り、税理士はコンサルティング業務の比重が高くなるのではないか。 税理士: F さん

@Yasuharu Suzuki PUBLIC

機械学習 = Python ?機械学習や DeepLeaning するのにPython 以外の言語ではだめなのか?

聞いてみた!

@Yasuharu Suzuki PUBLIC

機械学習エンジニア: K さん

機械学習やるなら、絶対 Python です!

@Yasuharu Suzuki PUBLIC

機械学習エンジニア: O さん

研究所で使っていた MATLAB の代わりになるものを探していろいろ試したがPython が一番良かった。

@Yasuharu Suzuki PUBLIC

とりあえずPython が良さそうですね!

@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じゃだめなん?

@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

Python の開発環境を探す・ Atom・ Xcode・ Visual Studio Code・ Jupyter Lab・ PyCharm

@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

じゃあとりあえず、何かつくってみましょうか!

@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

CORS の設定・・・・

ver0.5.6 にあったs-function.json がない!

@Yasuharu Suzuki PUBLIC

良い子は ver.0.5.6 を使いましょう!

直前になって ver1.00 に挑んだ私がバカでした!

@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

CORS 設定のテストプログラムindex.html common.js

@Yasuharu Suzuki PUBLIC

CORS 設定の動作確認出力結果

成功!

@Yasuharu Suzuki PUBLIC

unittest 設定@ PyCharm

ここから[Python tests] → [unittest]を選択

unittest に使用する .py を指定

使用する Python を指定複数入れている場合は適切なパスを指定してあげてください。

@Yasuharu Suzuki PUBLIC

PyCharm でデバッガ実行

ここから実行

デバッグ出力

ブレイクポイントを設定

@Yasuharu Suzuki PUBLIC

まとめ・ Serverless Framework 便利!ただし ver0.5.6 を使いましょう。・ Python 遅いイメージがあったがそんなに遅くない。 ただし計算は遅い。 開発環境は作りやすい。ソースすっきり。  DeepLearning しようぜ!

@Yasuharu Suzuki PUBLIC

PyData.Okinawa

毎月のだいたい第3土曜日に開催されています。前回は Keras で深層学習でした!

@Yasuharu Suzuki PUBLIC

PythonBeginners 沖縄 (仮 )

PyData の仲間で集まっています。もくもく会です。

@Yasuharu Suzuki PUBLIC

PythonBeginners 沖縄・助け合い所https://www.facebook.com/groups/789800504490702/

質問用グループ作りました!

初心者向けの課題解決を目的としたFacebook グループです!気軽にご参加ください\ (^o^) /

@Yasuharu Suzuki PUBLIC

ご清聴ありがとうございました!