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.

AWS Lambda + Python資料 ver0.94 20160825

3,290 views

Published on

JAWS-UG沖縄 真夏の熱すぎるサーバレス祭り! 2016年08月
および、PythonBeginners 2ndの発表資料です。

えーっと、AWS LambdaでPython使ってみたいけど、LambdaでPythonってどっから手つけたら良いのかわからんので、とりあえずフレームワーク使っておけば型ができるからServerlessFramework(ver.0.56)とPyCharm使って手軽に構築してみたよ、って内容です。ついでにCORSの設定もしてみています。

学生などの初心者も意識して作成した資料のため「なぜPython?」や「AWS アカウント作成」「Git作成」などの記載もありますが、スキルに合わせて読み飛ばしてくださいませ〜(`・ω・´)ノシ

Published in: Software
  • Be the first to comment

AWS Lambda + Python資料 ver0.94 20160825

  1. 1. @Yasuharu Suzuki 2016.08.27 鈴木康元 twitter @yasuharutwi facebook yasuharu.suzuki.50 AWS Lambda + Python with Serverless Framework、PyCharm、CORS ” “ 1 Ver.0.94
  2. 2. @Yasuharu Suzuki2 鈴木 康元 出身 茨城 → 東京 → 北海道 → 沖縄 趣味 勉強会、嫁、半導体情報収集 経歴 ゲーム開発(15年)、教育系アプリ開発、 SIer(1年)、レキサス2年目 担当 ハロペアプリ開発リーダー(SPL) コトバンバン開発リーダー(SPL) ADOC-H開発リーダー(SPL) など 得意技 地味プログラム 肩書 LIT(Lexues Innovation Team) R&D担当システムエンジニア
  3. 3. @Yasuharu Suzuki3 なんでPythonなん? ・使ってみたかったから! ・機械学習、人工知能が流行っているから! 初心者向けの内容だから 別にいいよね!\(^o^)/
  4. 4. @Yasuharu Suzuki4 機械学習、人工知能って 本当に流行ってるの?
  5. 5. @Yasuharu Suzuki5 100年間続いてきた常識をひっくり返 してしまいかねないのが、 人工知能である。 いままでは、ある問題を解くために方 程式をプログラムの形で書いたが、こ れからはその一部は人工知能に学習さ せて解くようになる。(途中略) 「100年の常識をひっくり返す」 流行りではなく、これからの新常識
  6. 6. @Yasuharu Suzuki6 行動ログを活用したレコメンデーション 話していて楽しい対話BOT →ユーザの活性化、継続利用率向上 新たなゲームアイテムを生み出す画像生成器 →デザインコストの削減 人に変わってゲームをプレイして難易度を評価し てくれるAI →テストプレイコスト削減、ユーザーの活性化&継続利用率 向上、企画屋のゲームバランス設定を自動化 実業務での取り組み これからは様々な仕事が人工知能化!
  7. 7. @Yasuharu Suzuki7 社会の大きな変化 現代は「FinTech革命」などと言われているように クレジットカードの購入履歴がクラウドの会計ソフトに自動アッ プロードされるなど、非常に生産性が向上している。 アメリカではそういった会計情報をもとにAIが会社の査定を行っ たり、実績のない会社でもAIを使ってFacebook上の人のつながり から査定ができるようになっている。 未だに手書きが多い日本は遅れているが、そのうち銀行では銀行 員や窓口業務が減り、税理士はコンサルティング業務の比重が高 くなるのではないか。 税理士:Fさん
  8. 8. @Yasuharu Suzuki8 機械学習 = Python? 機械学習やDeepLeaningするのに Python以外の言語ではだめなのか? 聞いてみた!
  9. 9. @Yasuharu Suzuki9 機械学習エンジニア:Kさん 機械学習やるなら、 絶対Pythonです!
  10. 10. @Yasuharu Suzuki10 機械学習エンジニア:Oさん 研究所で使っていたMATLABの 代わりになるものを探して いろいろ試したが Pythonが一番良かった。
  11. 11. @Yasuharu Suzuki11 とりあえず Pythonが良さそうですね!
  12. 12. @Yasuharu Suzuki12 パフォーマンス http://d.hatena.ne.jp/cero-t/20160101/1451665326 言語によってだいぶ違うけど・・・ Pythonは? まだ情報が少ない…。
  13. 13. @Yasuharu Suzuki13 パフォーマンス http://acro-engineer.hatenablog.com/entry/2016/08/02/120000 継続的にアクセスされず、かつCPUも あまり使わない処理であれば、 Pythonが速い。 継続的にアクセスされ、かつCPUをあ まり使わない処理であれば、 どの言語も大差ない。
  14. 14. @Yasuharu Suzuki14 パフォーマンス ・CPUを大量に使うのであれば、 Javaが速い。 http://acro-engineer.hatenablog.com/entry/2016/08/02/120000 フィボナッチ数列計算 計算が少なければ Pythonで良さそう!
  15. 15. @Yasuharu Suzuki15 なぜLambda? EC2じゃだめなん?
  16. 16. @Yasuharu Suzuki LambdaとEC2の比較(1) 16 EC2 Lambda サービスを利用して いない時 Amazon EC2 稼働中 課金される AWS Lambda 停止 課金されない サービスを利用中 AWS Lambda Amazon EC2 稼働中 課金される 起動 課金される (実行中のみ)
  17. 17. @Yasuharu Suzuki LambdaとEC2の比較(2) 17 EC2 Lambda AWS Lambda 停止中 課金されない 急激なアクセス増 一時的にアクセス数 が減った時 Amazon EC2 4台稼働 そのまま課金 (急なスペック変更はできない) Amazon EC2 タイムラグがある 起動待ち AWS Lambda 1000台まで瞬時に起動 1000台まで 自動起動
  18. 18. @Yasuharu Suzuki LambdaとEC2の比較(3) 18 EC2 Lambda 言語 通常のサーバと同様に使える。 OSや言語を自由に選択可能。 言語を自由に選択できない。Java8、 Python 2.7、Javascript(node4.3)のみ。 オート スケール オートスケールに構築も可能。ただし、イ ンスタンスの起動/停止に2〜3分以上か かるため、間に合わないことも。 オートスケールで自動的に1000台まで起 動する。 運用 コスト 最大負荷にあわせてスペックを上げておく 必要がある。 稼働中は常に課金され、その価格が安くは ない。 プログラムが実行されていない間は課金さ れない。 Amazon側もハードウェアを有効活用でき るため価格が安い。 開発 しやすさ 従来通りの開発が可能。 豊富なライブラリ、フレームワークを選択 できる。 フレームワークは発展途上のものが多く、 開発コストがかかる。 ステートレスに組む必要がある。
  19. 19. @Yasuharu Suzuki LambdaとEC2の比較(4) 19 (抜粋) 待機が多いシステムや負荷に緩急が あるシステムでは、AWS Lambdaに 移行することで、90%以上もコスト を削減することができる。 運用コストはLambdaが圧倒的に有利!
  20. 20. @Yasuharu Suzuki20 Lambdaのフレームワークを探す ・Python Serverless Microframework for AWS ・Serverless Framework (Chalice) (旧:JAWS Framework)
  21. 21. @Yasuharu Suzuki21 Python Serverless Microframework for AWS (Chalice) ・Python専用のため学習コストが低く 、すぐに試せる。 ・最近まで1ソースファイルしかサポ ートしていなかった → 7/22対応 ・複数のソースディレクトリは非対応 ・APIGatewayが毎回更新されてしま う。 すごく簡単で便利なのですが、マイクロ過ぎて使えない! 今後のバージョンアップに期待!
  22. 22. @Yasuharu Suzuki22 Serverless Framework ・node.jsベースでPythonの情報が少ない (→何とかなるレベル) ・ロール設定がテキスト定義可能。 ・APIGatewayも細かい設定が可能。 UrlDecodeなど。 ・細かい設定ができる分、ちょっととっつ きにくい。 ・まだバージョンが0.5.6。 少し前にv1.0.0がβ1リリースした。 とりあえずこれで。
  23. 23. @Yasuharu Suzuki23 Pythonの開発環境を探す ・Atom ・Xcode ・Visual Studio Code ・Jupyter Lab ・PyCharm
  24. 24. @Yasuharu Suzuki24 エディタ 使用した印象 Atom 普段良く使うフリーのテキストエディタ。 保存するとダブルコーテーションが文字化けし、コンパイ ルに失敗。使えない。 Xcode 文字化けは起きないが、使用感が重い。 Python特有の解析ツール(pip8など)も適用されていな い。 Visual Studio Code 文字化けは起きない。バージョンアップを重ねてだいぶ 使いやすくなった。Python特有の解析ツール(pip8など )は適用されていない。 コンソール Pythonはコンソール上でデバッガも出来るため、慣れれ ば使いやすいらしい。 Pythonの開発環境
  25. 25. @Yasuharu Suzuki25 Jupiter Lab まだ発表されたばかりで機能も少ないが、今後化けるかも? IPython Notebookの開発者 (Fernando Perez氏)が開発した、 ブラウザベースの統合環境。 .pyファイルと.ipynbを1つのフレ ームワーク内で使える。こんなの が欲しかった!(*´Д`*)
  26. 26. @Yasuharu Suzuki26 PyCharm これからプログラミングを学びたい人で、特に「綺麗なコード」を意識する人 にはPython+PyCharmはおすすめしたい。 コードは書く時間よりも読まれる時間の方がずっと長い! もちろんPythonが初めての方にもオススメです。 人気の高い開発環境「IntelliJ IDEA」 で有名なJetBrains社のPython統合環 境。 デバッガはもちろん、コーディング 規約のpip8や命名規則に準じたワー ニングも表示される。
  27. 27. @Yasuharu Suzuki27 じゃあとりあえず、何かつくってみましょうか!
  28. 28. @Yasuharu Suzuki28 S3Lambda CORS- TEST1.0 静的HTMLの ダウンロード 静的HTMLからの Ajax通信 CORS-TEST VER1.0 - CLOUD DIAGRAMS
  29. 29. @Yasuharu Suzuki29 CORS (Cross-Origin Resource Sharing) http://dev.classmethod.jp/cloud/cors-cross-origin-resource-sharing-cross-domain/ (抜粋) ブラウザがオリジン(HTMLを読 み込んだサーバのこと)以外のサ ーバからデータを取得する仕組み です。 ↓ ※抜け道(JSONP)を使わずに通 信可能とするには、サーバ側から 許可する必要があります。
  30. 30. @Yasuharu Suzuki30 Gitリポジトリ作成 https://gitlab.com/へ移動 「New Project」をクリック Project名「CORS-Test01」としま した。 「Create Project」をクリック。
  31. 31. @Yasuharu Suzuki31 Gitリポジトリ作成 https://gitlab.com/ で作成したProject をSource URLに指定して 「Clone」をクリック 適当にファイルを追加して Commit & Push。
  32. 32. @Yasuharu Suzuki32 PyCharmのダウンロード PyCharmのサイトへアクセス 「DOWNLOAD NOW」をクリック 無料のCommunity版をダウンロー ドしましょう。 もちろんリッチな殿方は Professional版でも構いません。
  33. 33. @Yasuharu Suzuki33 PyCharmプロジェクト作成 PyCharmを起動 「Create New Project」をクリック フォルダを割り当てるだけで Projectが作成されます。 Project名は「CORS-Test01」とし ました。
  34. 34. @Yasuharu Suzuki34 AWSアカウント作成 ルートアカウントしか持っていなか ったのでIAMユーザ作ることにした 。 アクセスキーID、シークレットアク セスキーをメモしておく IAMユーザーにパスワードを付け、 適当なポリシーをアタッチしたら、 「IAMユーザーのサインインリンク」か らログインする。
  35. 35. @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が インストールされる。
  36. 36. @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
  37. 37. @Yasuharu Suzuki37 CORSの設定・・・・ ver0.5.6にあった s-function.jsonがない!
  38. 38. @Yasuharu Suzuki38 良い子はver.0.5.6を使いましょう! 直前になってver1.00に挑んだ私が バカでした!
  39. 39. @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 参考サイト
  40. 40. @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の選択
  41. 41. @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
  42. 42. @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 !"}
  43. 43. @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": "" } } }
  44. 44. @Yasuharu Suzuki44 CORS設定のテストプログラム index.html common.js
  45. 45. @Yasuharu Suzuki45 CORS設定の動作確認 出力結果 成功!
  46. 46. @Yasuharu Suzuki46 unittest設定@PyCharm ここから [Python tests] → [unittest] を選択 unittestに使用する.pyを指定 使用するPythonを指定 複数入れている場合は適切なパスを指 定してあげてください。
  47. 47. @Yasuharu Suzuki47 PyCharmでデバッガ実行 ここから実行 デバッグ出力 ブレイクポイントを設定
  48. 48. @Yasuharu Suzuki48 まとめ ・Serverless Framework 便利!ただしver0.5.6を使いましょう。 ・Python 遅いイメージがあったがそんなに遅くない。 ただし計算は遅い。 開発環境は作りやすい。ソースすっきり。 DeepLearningしようぜ!
  49. 49. @Yasuharu Suzuki49 PyData.Okinawa 毎月のだいたい第3土曜日に開催されています。 前回はKerasで深層学習でした!
  50. 50. @Yasuharu Suzuki50 PythonBeginners沖縄(仮) PyDataの仲間で集まっています。 もくもく会です。
  51. 51. @Yasuharu Suzuki51 PythonBeginners沖縄・助け合い所 https://www.facebook.com/groups/789800504490702/ 質問用グループ作りました! 初心者向けの課題解決を目的とした Facebookグループです! 気軽にご参加ください\(^o^)/
  52. 52. @Yasuharu Suzuki52 ご清聴ありがとうございました!

×