Upload
takahiro-ikeuchi
View
447
Download
1
Embed Size (px)
Citation preview
AWS Labmda x Python- Error Handling から Test, CI まで -
JAWS UG YOKOHAMA
2017-02-10
Takahiro Ikeuchieurie Inc.
自己紹介
池内 孝啓 @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
eurie Inc.B2B 向け SaaS 事業 (https://eurie.io/ja/)
Launched : カスタマーサポート支援クラウド "eurie Desk"
Go言語 4割, TypeScript (React) 4割, Python 2割 くらい
AWS フル活用(もちろん!)
6
AWS Lambda Use Case"非同期処理でよい処理系" の Hub として利用
Elasticsearch への登録
Amazon SES, SendGrid への SMTP 処理
Slack など外部システムへの通知
REST API レスポンスは、Amazon SNS をCall した時点で返却
12
SNS 経路の処理が失敗していてもクライアント側からはわからない
成功していて欲しい
成功していて欲しい(祈)
REST API レスポンスは、Amazon SNS をCall した時点で返却“ “
14
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
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 と テスト - 1通常のサーバー環境と違うためローカルでのデバッグ・テストが行い難い
とはいえ、動作としては通常の Python 関数が呼び出されるだけ
def lambda_handler(event, context): # main process
25
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