2024-09-28 –, 20F Track1
WEBアプリケーションでは、大量のメール配信や画像生成など、実行時間がかかる処理は非同期で実行するのが一般的です。弊社のあるDjangoプロジェクトでは、非同期処理にCeleryを使用していましたが、性能面の課題を解決するために、一部をAWS Lambdaに移行しました。Lambdaの実装にもPythonを使用しています。本番稼働中のWEBアプリケーションでLambdaを使って大量の非同期処理を処理するには、様々な知見が必要でした。SQS、S3、DynamoDBといった他のAWSサービスと連携する必要もありました。また、PythonでLambda関数を実装する際には、amazon-sqs-python-extended-client-libやpowertools-lambda-pythonなどのライブラリを使用することで、ビジネスロジックに関係のない処理はライブラリに任せて生産性を高めることができます。本セッションでは、移行プロジェクトで得られたこれらの知見を共有します。具体的なメール配信処理の事例を基に話しますが、Lambdaを用いた非同期処理を検討している方にとっても参考になる内容です。
導入
まずは一般論として、WEBアプリケーションにおいて大量のメール配信や画像生成など、実行時間がかかる処理は非同期で実行するのがよい理由を簡単に確認します。次にPythonで非同期処理を実装する場合に最初に候補に上がるライブラリであるCeleryを紹介します。そして題材とするWEBアプリケーションにおいて、一部をAWS Lambdaに移行する前のCeleryを使用したアーキテクチャとその課題を説明します。
メイン
AWS Lambdaに移行後のアーキテクチャを説明します。その後に、具体的にAWS Lambdaを用いてどのように実装したかや、以下のような本番のアプリケーションでAWS Lambdaを使用する上での課題とその解決策を説明します。その際に、amazon-sqs-python-extended-client-libやpowertools-lambda-pythonといったPythonライブラリを使用することで実装量を削減することができ、開発者はビジネスロジックの実装に集中できるようになることを合わせて説明します。
- SQSの256KB上限問題
- amazon-sqs-python-extended-client-libとS3の使用
- Lambdaの処理のエラーハンドリング
- リトライ
- デッドレターキュー
- batchItemFailures
- Powertools for AWS LambdaのSQSサポート機能
- 各種AWSサービスのタイムアウト系のパラメータ
- 冪等性の担保
- DynamoDB
- Powertools for AWS Lambdaのidempotency機能
おまけ
時間があったらテストやデプロイなどのトピックにも軽くふれます。
話さないこと
- 各種AWSサービスの基本的な説明
- アーキテクチャの選定理由
自分が実際に仕事でAWS Lambdaを使ってみて、AWS Lambdaの情報自体はインターネット上にたくさんあるものの、本番運用に耐えるような設計や生産性を上げてくれるPythonライブラリの存在に関する知見はまだまだ少ないなと感じたため、実際のプロジェクトで得た知見を共有することで役に立てたらいいなと思いました。
Knowledges and know-how the audience can get from your talk –- 本番のアプリケーションでAWS Lambdaを使った非同期処理を実装する際の保守性を高めるための設計の知見
- amazon-sqs-python-extended-client-libやpowertools-lambda-pythonなどのAWS Lambda開発の生産性を上げてくれるPythonライブラリの存在
- 基本的なWEBアプリケーションの知識
- 以下のAWSサービスがどのようなものかというざっくりとした理解
- SQS
- S3
- Lambda
- DynamoDB
- SES
Intermediate
Language of presentation –日本語
Language of presentation material –日本語
株式会社ビープラウドでバックエンドエンジニアをしています。Python x Djangoを使うことが多いです。