aws lambda x python - error handling から test, ci まで

33
AWS Labmda x Python - Error Handling Test, CI - JAWS UG YOKOHAMA 2017-02-10 Takahiro Ikeuchi eurie Inc.

Upload: takahiro-ikeuchi

Post on 13-Apr-2017

446 views

Category:

Technology


1 download

TRANSCRIPT

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

JAWS UG YOKOHAMA

2017-02-10

Takahiro Ikeuchieurie Inc.

AgendaServeless 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

Specialties (or just a dabbler :-D

Go lang, Python, React.js, TypeScript

Cloud Infrastructure, UI Design etc...4

最近 好きな AWS サービス

Amazon Aurora

5

eurie Inc.B2B 向け SaaS 事業 (https://eurie.io/ja/)

Launched : カスタマーサポート支援クラウド "eurie Desk"

Go言語 4割, TypeScript (React) 4割, Python 2割 くらい

AWS フル活用(もちろん!)

6

https://eurie.io/ja/

7

AWS Lambda 活用事例

8

Architecture

9

10

11

AWS Lambda Use Case"非同期処理でよい処理系" の Hub として利用

Elasticsearch への登録

Amazon SES, SendGrid への SMTP 処理

Slack など外部システムへの通知

REST API レスポンスは、Amazon SNS をCall した時点で返却

12

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_failed_handler(event, context): raise Exception('I failed!')

http://docs.aws.amazon.com/lambda/latest/dg/python-exceptions.html

16

AWS Lambda と例外発生の基本 - 2Lambda Function 全体のリトライになるため、冪統性のある処理にしておくと安全

1. ユーザーデータの登録 => Success

2. メール送信 => Failure

メール送信に失敗しただけでもユーザーデータ登録もリトライの対象になる

処理対象が異なる場合は別の Function に切り出すことを検討

17

AWS Lambda 任せにせず

リトライ実装をして可用性を高めよう

18

みんな大好き Exponential backoff

19

Exponential backoff とは指数関数的にリトライ間隔を増加させるアプローチ

実装の差違はあるが、各種言語用ライブラリがあり利用が容易

AWSユーザーは必ず覚えておきたいExponential Backoffアルゴリズムとは何か - yoshidashingo

可用性の高い自社/他社サービスの REST API や SMTP Server の利用時に仕込んでおくとよい

20

Python x Exponential backoffhttps://github.com/rholder/retrying

decorator を書くだけで、関数, Method 内での例外発生時にリトライ

@retry(wait_exponential_multiplier=1000, stop_max_delay=12000, wait_exponential_max=1000)def my_functoin(): try: res = requests.post(URL, data=payload, timeout=5) except Exception: raise

21

Exponential backoff 利用時の注意一時的な障害や System Busy に対して強い (いわゆる 500系 エラー)

Bad Request など 400系エラーにいくら対してリトライしてもダメ

AWS Lambda の実行制限時間 (最大5分) があるため無限にはリトライできない

22

今日話せなかったこと

リトライ中に正常復帰しなかった場合どうするの?

Queue などを利用して Lambda Function 自体の再実行を行える設計にしておく

Dead Letter Queue の活用http://docs.aws.amazon.com/lambda/latest/dg/dlq.html

23

AWS Lambda とテスト・CI

24

AWS Lambda と テスト - 1通常のサーバー環境と違うためローカルでのデバッグ・テストが行い難い

とはいえ、動作としては通常の Python 関数が呼び出されるだけ

def lambda_handler(event, context): # main process

25

ユニットテストを書こう

26

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

AWS Lambda と テスト - 3各関数や Method のテストの他に、エントリーポイントへのテストを書いておこう

class TestLambdaFunction(object):

resp = lambda_function.lambda_handler(event, context) assert resp is True

必要に応じて mock を利用する

28

AWS Lambda と テスト - 4AWS Lambda の Emulator を活用するのもよい

https://github.com/fugue/emulambda

特に Time Out 制約は再現し難いので、Emulator を活用しよう

29

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

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

Conclusioineurie では Serverless Architecture を実現するためAWS Lambda や AWS サービスを活用しています!

ユニットテストや CI のナレッジは AWS Lambda にも活用可能

エラーに気付き難いのでむしろ重点的にテストを書こう

デプロイプロセスは CI ツールに組み込むと精神衛生上よろし

32

33