Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.
AWS Labmda x Python
- Error Handling から Test, CI まで -
JAWS UG YOKOHAMA
2017-02-10
Takahiro Ikeuchi
eurie Inc.
Agenda
Serveless Architecture と AWS Lambda 活用事例
AWS Lambda と Error Handling
AWS Lambda と テスト・CI
2
今日のゴール
AWS Lambda における Error Handling の勘どころを掴む
AWS Lambda のローカル開発やテスト、継続的インテグレーション
の事例について学ぶ
3
自己紹介
池内 孝啓 @iktakahiro
Company / Community
eurie Inc. Founder & CEO
SQUEEZE Inc. Tech Adviser
PyData.Tokyo Organizer
Speci...
最近好きなAWS サービス
Amazon Aurora
5
eurie Inc.
B2B 向け SaaS 事業 (https://eurie.io/ja/)
Launched : カスタマーサポート支援クラウド "eurie Desk"
Go言語 4割, TypeScript (React) 4割, P...
https://eurie.io/ja/
7
AWS Lambda 活用事例
8
Architecture
9
10
11
AWS Lambda Use Case
"非同期処理でよい処理系" の Hub として利用
Elasticsearch への登録
Amazon SES, SendGrid への SMTP 処理
Slack など外部システムへの通知
REST A...
AWS Lambda とError Handling
13
SNS 経路の処理が失敗していてもクライアント側からはわからない
成功していて欲しい
成功していて欲しい(祈)
REST API レスポンスは、Amazon SNS をCall した時点で返却“ “
14
祈っても仕方ないので
Error Handling, Retry を考えよう
15
AWS Lambda と例外発生の基本- 1
(非同期呼び出しの場合)
処理が Failure すると 2回まで自動でリトライする
Python 的には Exception をraise すれば Failure 扱い
def always_fa...
AWS Lambda と例外発生の基本- 2
Lambda Function 全体のリトライになるため、冪統性のある
処理にしておくと安全
1. ユーザーデータの登録 => Success
2. メール送信 => Failure
メール送信に失...
AWS Lambda 任せにせず
リトライ実装をして可用性を高めよう
18
みんな大好き Exponential backoff
19
Exponential backoff とは
指数関数的にリトライ間隔を増加させるアプローチ
実装の差違はあるが、各種言語用ライブラリがあり利用が容易
AWSユーザーは必ず覚えておきたいExponential Backoffアルゴリズム
とは何か ...
Python x Exponential backoff
https://github.com/rholder/retrying
decorator を書くだけで、関数, Method 内での例外発生時にリトライ
@retry(wait_expo...
Exponential backoff 利用時の注意
一時的な障害や System Busy に対して強い (いわゆる 500系 エラー)
Bad Request など 400系エラーにいくら対してリトライしてもダメ
AWS Lambda の実行...
今日話せなかったこと
リトライ中に正常復帰しなかった場合どうするの?
Queue などを利用して Lambda Function 自体の再実行を行える
設計にしておく
Dead Letter Queue の活用
http://docs.aws....
AWS Lambda とテスト・CI
24
AWS Lambda と テスト - 1
通常のサーバー環境と違うためローカルでのデバッグ・テストが
行い難い
とはいえ、動作としては通常の Python 関数が呼び出されるだけ
def lambda_handler(event, contex...
ユニットテストを書こう
26
AWS Lambda と テスト - 2
テスト用の event と context (使う場合) を用意して
test_event = {"Records": [
{
"EventVersion": "1.0",
"EventSubscrip...
AWS Lambda と テスト - 3
各関数や Method のテストの他に、エントリーポイントへの
テストを書いておこう
class TestLambdaFunction(object):
resp = lambda_function.l...
AWS Lambda と テスト - 4
AWS Lambda の Emulator を活用するのもよい
https://github.com/fugue/emulambda
特に Time Out 制約は再現し難いので、Emulator を活...
AWS Lambda と CI - 1
3rd Party パッケージを利用する場合、パッケージごと ZIP & Deploy
pip install -U -r requirements.txt -t ./vendor
Vendoring し...
AWS Lambda と CI - 2
これまでの継続的インテグレーションが適応できる
1. GitHub へ PUSH
2. CIツール (Codeship) で CI プロセスを実行
1. ビルド
2. テスト
3. デプロイ (aws c...
Conclusioin
eurie では Serverless Architecture を実現するため
AWS Lambda や AWS サービスを活用しています!
ユニットテストや CI のナレッジは AWS Lambda にも活用可能
エ...
33
Prochain SlideShare
Chargement dans…5
×

AWS Lambda x Python - Error Handling から Test, CI まで

2 021 vues

Publié le

Serverless Architecture の採用により、AWS Lambda の活用の場面は増えています。AWS Lambda はこれまでの Server 環境とは異なるため、開発環境やテスト、エラーハンドリングなど、DevOps に関するトピックもアップデートしていく必要があります。

AWS Lambda を Python で実装、運用する際の、エラーハンドリングからテスト、CI までのナレッジを紹介します。

Publié dans : Technologie
  • Soyez le premier à commenter

AWS Lambda x Python - Error Handling から Test, CI まで

  1. 1. AWS Labmda x Python - Error Handling から Test, CI まで - JAWS UG YOKOHAMA 2017-02-10 Takahiro Ikeuchi eurie Inc.
  2. 2. Agenda Serveless Architecture と AWS Lambda 活用事例 AWS Lambda と Error Handling AWS Lambda と テスト・CI 2
  3. 3. 今日のゴール AWS Lambda における Error Handling の勘どころを掴む AWS Lambda のローカル開発やテスト、継続的インテグレーション の事例について学ぶ 3
  4. 4. 自己紹介 池内 孝啓 @iktakahiro Company / Community eurie Inc. Founder & CEO SQUEEZE Inc. Tech Adviser PyData.Tokyo Organizer Specialties (or just a dabbler :-D Go lang, Python, React.js, TypeScript Cloud Infrastructure, UI Design etc... 4
  5. 5. 最近好きなAWS サービス Amazon Aurora 5
  6. 6. eurie Inc. B2B 向け SaaS 事業 (https://eurie.io/ja/) Launched : カスタマーサポート支援クラウド "eurie Desk" Go言語 4割, TypeScript (React) 4割, Python 2割 くらい AWS フル活用(もちろん!) 6
  7. 7. https://eurie.io/ja/ 7
  8. 8. AWS Lambda 活用事例 8
  9. 9. Architecture 9
  10. 10. 10
  11. 11. 11
  12. 12. AWS Lambda Use Case "非同期処理でよい処理系" の Hub として利用 Elasticsearch への登録 Amazon SES, SendGrid への SMTP 処理 Slack など外部システムへの通知 REST API レスポンスは、Amazon SNS をCall した時点で返却 12
  13. 13. AWS Lambda とError Handling 13
  14. 14. SNS 経路の処理が失敗していてもクライアント側からはわからない 成功していて欲しい 成功していて欲しい(祈) REST API レスポンスは、Amazon SNS をCall した時点で返却“ “ 14
  15. 15. 祈っても仕方ないので Error Handling, Retry を考えよう 15
  16. 16. AWS Lambda と例外発生の基本- 1 (非同期呼び出しの場合) 処理が Failure すると 2回まで自動でリトライする Python 的には Exception をraise すれば Failure 扱い def always_failed_handler(event, context): raise Exception('I failed!') http://docs.aws.amazon.com/lambda/latest/dg/python- exceptions.html 16
  17. 17. AWS Lambda と例外発生の基本- 2 Lambda Function 全体のリトライになるため、冪統性のある 処理にしておくと安全 1. ユーザーデータの登録 => Success 2. メール送信 => Failure メール送信に失敗しただけでもユーザーデータ登録もリトライの 対象になる 処理対象が異なる場合は別の Function に切り出すことを検討 17
  18. 18. AWS Lambda 任せにせず リトライ実装をして可用性を高めよう 18
  19. 19. みんな大好き Exponential backoff 19
  20. 20. Exponential backoff とは 指数関数的にリトライ間隔を増加させるアプローチ 実装の差違はあるが、各種言語用ライブラリがあり利用が容易 AWSユーザーは必ず覚えておきたいExponential Backoffアルゴリズム とは何か - yoshidashingo 可用性の高い自社/他社サービスの REST API や SMTP Server の利用時 に仕込んでおくとよい 20
  21. 21. Python x Exponential backoff https://github.com/rholder/retrying decorator を書くだけで、関数, Method 内での例外発生時にリトライ @retry(wait_exponential_multiplier=1000, stop_max_delay=12000, wait_exponential_max=10 def my_functoin(): try: res = requests.post(URL, data=payload, timeout=5) except Exception: raise 21
  22. 22. Exponential backoff 利用時の注意 一時的な障害や System Busy に対して強い (いわゆる 500系 エラー) Bad Request など 400系エラーにいくら対してリトライしてもダメ AWS Lambda の実行制限時間 (最大5分) があるため 無限にはリトライできない 22
  23. 23. 今日話せなかったこと リトライ中に正常復帰しなかった場合どうするの? Queue などを利用して Lambda Function 自体の再実行を行える 設計にしておく Dead Letter Queue の活用 http://docs.aws.amazon.com/lambda/latest/dg/dlq.html 23
  24. 24. AWS Lambda とテスト・CI 24
  25. 25. AWS Lambda と テスト - 1 通常のサーバー環境と違うためローカルでのデバッグ・テストが 行い難い とはいえ、動作としては通常の Python 関数が呼び出されるだけ def lambda_handler(event, context): # main process 25
  26. 26. ユニットテストを書こう 26
  27. 27. AWS Lambda と テスト - 2 テスト用の event と context (使う場合) を用意して test_event = {"Records": [ { "EventVersion": "1.0", "EventSubscriptionArn": "arn:aws:sns:EXAMPLE", "EventSource": "aws:sns", "Sns": { "TopicArn": "arn:aws:sns:EXAMPLE", "Subject": "TestInvoke" } } ] } 27
  28. 28. AWS Lambda と テスト - 3 各関数や Method のテストの他に、エントリーポイントへの テストを書いておこう class TestLambdaFunction(object): resp = lambda_function.lambda_handler(event, context) assert resp is True 必要に応じて mock を利用する 28
  29. 29. AWS Lambda と テスト - 4 AWS Lambda の Emulator を活用するのもよい https://github.com/fugue/emulambda 特に Time Out 制約は再現し難いので、Emulator を活用しよう 29
  30. 30. AWS Lambda と CI - 1 3rd Party パッケージを利用する場合、パッケージごと ZIP & Deploy pip install -U -r requirements.txt -t ./vendor Vendoring しておくと便利 ├── lambda_function.py ├── requirements.txt └── vendor ├── requests └── slackpy 参考: Python で パッケージを vendoring しつつ AWS Lambda へデプ ロイ 30
  31. 31. AWS Lambda と CI - 2 これまでの継続的インテグレーションが適応できる 1. GitHub へ PUSH 2. CIツール (Codeship) で CI プロセスを実行 1. ビルド 2. テスト 3. デプロイ (aws cli 利用) aws lambda update-function-code --function-name my_func --zip-file src.zip 31
  32. 32. Conclusioin eurie では Serverless Architecture を実現するため AWS Lambda や AWS サービスを活用しています! ユニットテストや CI のナレッジは AWS Lambda にも活用可能 エラーに気付き難いのでむしろ重点的にテストを書こう デプロイプロセスは CI ツールに組み込むと精神衛生上よろし 32
  33. 33. 33

×