[レポート]実用的なサーバーレス Python 開発者 #AWSreInvent #OPN305

2023.12.05

re:Invent 2023 で行われた BreakOut セッションThe pragmatic serverless Python developer(OPN305)のセッションレポートです。

概要

Are you developing AWS Lambda functions with Python? Always looking for tools to make you more productive? What if you could hear directly from practitioners? This session covers an opinionated approach to Python project setup, testing, profiling, deployments, and operations. Learn about many open source tools, including Powertools for AWS Lambda—a toolkit that can help you implement serverless best practices and increase developer velocity. Join to discover tools and patterns for effective serverless development with Python. To maximize your learning experience, the session includes a sample application that implements what’s described.

(日本語訳)PythonでAWS Lambda関数を開発していますか?生産性を上げるツールをいつも探していますか?実践者から直接話が聞けるとしたらどうでしょう?このセッションでは、Pythonプロジェクトのセットアップ、テスト、プロファイリング、デプロイ、運用に関する意見を取り上げます。サーバーレスのベストプラクティスを実装し、開発者のベロシティを向上させるツールキットである Powertools for AWS Lambda を含む、多くのオープンソースツールについて学びます。Pythonを使った効果的なサーバーレス開発のためのツールとパターンを発見してください。このセッションには、説明されている内容を実装したサンプルアプリケーションが含まれています。

動画

セッションの概要

本セッションでは、サーバーレス開発における特定のユースケースを例に、利用するツールや設計の意思決定についてを解説しています。 サーバーレス開発の中でも主に以下のようなトピックが取り上げられていました。

  • 開発者が迅速に取り組めるようなプロジェクトの構造とロジック
  • テスト戦略
  • 非同期 API の設計

一般的な API として以下を例に説明します。

DynamoDB テーブルに対する操作 API として、Lambda や API Gateway のリソースを用意するようなケースです。プロジェクトのフォルダ構成や IaC、これらのユニットテストや結合テストなどをどう行なっていくのかなどを順番に説明されています。

プロジェクト構成

ここで説明されていたのはフォルダ構成として、まずはビジネスロジックが含まれるコードとテストに関連するものを作成していました。その後 IaC 用のフォルダの作成も行なっています。

また、実際の Lambda の実装についても handler に全ての処理を書いていくと、コード量が多くなり可読性も悪くなるためビジネスロジックを分けることが説明されています。

テスト戦略

テストについては以下のようなピラミットを用いてユニットテストから結合、E2E テストまでの解説がありました。

ユニットテストはローカルで実行、結合テストはプロジェクト内のテストの大部分を占めており、必要なリソースをデプロイし実行します。

ここではテスト用の py ファイルで API Gateway で API を実行した時のテストデータを作成し、そのデータをlambda_handlerに渡すことでアサーションを実行していました。

E2E テストでは、テストデータをの作成は同じですが、API Gateway は実際にデプロイされている API を実行します。この時呼び出された Lambda からの応答に対してアサーションを実行します。

非同期APIの設計

非同期処理を行う場合は、クライアントがリクエストをすぐに受け取ることができないため結果を別の方法で確認する必要があります。

以下の例では EventBridge で受信したイベントを確認できなくなった時の対応です。EventBridge から Step Functions を呼び出し、イベントを DyanmoDB へ保存することで、イベントを保持しています。

こうすることで、イベントが発行されたことを確認できるようになりました。この仕組みは非常にコストが安く処理も早いです。

オープンソースの紹介

Powertools for AWS Lambda を始め、いくつかのオープンソースツールが紹介されていたので載せておきます。

Tuna

Tunaは import にかかる時間を可視化してくれるツールです。可視化すると、以下のようなインポートしているライブラリごとの時間をグラフとして表示してくれます。

py-spy

py-spyは、Python プログラムがどこで時間を使っているかを可視化するツールです。どこがボトルネックになっているのかの調査に活用できます。

pyinstrument

pyinstrumentも処理の中で時間を使っているコードを可視化してくれるオープンソースです。

これらのオープンソースは処理時間の調査などに便利そうですね。性能を意識すべきアプリケーションでは積極的に活用したいです。

おわりに

The pragmatic serverless Python developer(OPN305)のセッションレポートでした。

Python におけるサーバーレス開発のベストプラクティスを学ぶことができ、改めて結合テストや E2E テストの線引きや実装方法については特に再認識しておく必要があるなと感じました。

実際のセッションではコード等を含めて解説されていましたので、より深く学びたい方は是非動画を視聴してみてください。