Blog 開発ブログ

Blog

AWS Python Lambda向けのアプリケーションフレームワークJeffy1.1をリリースしました!

メジャーバージョンアップ版のv1.1をリリースしました!GAリリースしてからいくつかのフィードバックをもらった上での改善を含むバージョンになります。

https://pypi.org/project/jeffy/

Jeffyエンコーダーの仕様について

まず、仕様が少し分かりづらいとフィードバックをもらったJeffyのエンコーダーの機能について少し説明したいと思います。

この機能は主にLambda及びその他のAWSサービス間でやり取りされるメッセージの仕様を統一するためのいわゆる「型」としての働きをします。マイクロサービスの始端から終端までメッセージの型が定義されることで、開発者はより堅守で安全かつ効率的にLambdaを実装していくことが可能となります。

現在、エンコーディングには以下の2種類存在しています

エンコーダ名用途
jeffy.encoding.json.JsonEncodingJSONフォーマット用エンコーディング。S3以外は今の所デフォルトでこれを採用
jeffy.encoding.bytes.BytesEncodingバイナリデータを扱う用のエンコーディング

Jeffy内部ではboto3をラップしたAWS SDKを有していますが、LambdaからAWSサービスにメッセージをPublishする際にメッセージを自動でデフォルトのエンコーディングでエンコードします。そして、イベントソースからLambdaがメッセージをsubscribeする際にはそのイベントソースとなるAWSサービスのデフォルトエンコーディングに沿ってデコードし、そのメッセージをLambda内部で処理できるようにします。

そして以下の様にソース内で明示的にエンコーダーを開発者側で指定することもできます。各AWSサービスのデフォルトエンコーダはGitHubのREADMEを確認してみてください。

from jeffy.framework import get_app
from jeffy.encoding.bytes import BytesEncoding
from jeffy.sdk.kinesis import Kinesis

app = get_app()
bytes_encoding = BytesEncoding()

@app.handlers.kinesis_streams(encoding=bytes_encoding) # BytesEncodingの仕様に沿ってデコードする
def handler(event, context):
    kinesis = Kinesis(encoding=bytes_encoding) # BytesEncodingの仕様に沿ってエンコードする
    kinesis.put_record(
        stream_name=os.environ['STREAM_NAME'],
        data=bytes_encoding.encode('foo'.encode('utf-8)),
        partition_key='your-partition-key'
    )

この仕組みによりPub – Subの関係で構成されるイベントドリブンなアーキテクチャにおいてメッセージの仕様を統一することを簡略化します。

現状では、このエンコーディングの選択肢はほぼありませんが、今後ProtocolBuffersなど新しいエンコーディングの追加を考えています。
その他、どのようにメッセージ交換を行っているかといったユースケースや、希望などを是非お聞かせください!!

追加された機能

v1.1で追加された機能は以下のとおりです。

AWS SDKクライアントへのデフォルトエンコーダ機能

v1.0まではデコレータはデフォルトのエンコーディングで暗黙的にデコードされていましたが、Jeffyが持つAWS SDKクライアントには明示的に使用するエンコーディングでエンコードしたデータを渡す必要がありました。これを、SDKクライアントにもデフォルトのエンコーディングを持たせ、暗黙的にエンコードされたデータが送信されるように変更し、よりユーザは意識しなくても統一されたエンコーディングによるイベントの送受信が行えるようになりました。
もちろん、このエンコーディングは明示的に上書きすることもできるので、デフォルトのエンコーディングの利用を強制するものではありません。

今回のアップデートにより、ユーザは意識しなくてもPublisher側とSubscriber側でメッセージの仕様の統一が行われ、明示的に変更する場合にも、それをどのように行うべきかが分かりやすくなりました。

AWS SDKクライアント側でCorrelationIDを自動生成する機能

CorrelationIDとは、Jeffy内部でメッセージをトレースするための乱数を生成して引き継ぐための仕組みです。

これまではCorrelationIDが存在しない場合にはSubscriberとなるデコレータ内で自動生成を行なっていましたが、今回からはAWS SDKクライアントで生成するようになりました。これにより内部で使っているboto3のDEBUGログを有効にすると一番最初にJeffyの外部からメッセージを送るときもJeffyのSDKを使っておけばそこからトレースできるようになりました。
今後、boto3のDEBUGログを有効化せずに統一されたログフォーマットで出力するオプションも追加予定です。

修正されたバグ

以下のバグを修正しました。

  • S3のデコレータでオブジェクトキーがマルチバイトの際に落ちるエラーを修正(#21, #22) ※これは厳密には1.1.1で修正されています
  • JsonSchemaValidator のclass名をTypoしていた問題を修正
  • DynamoDB Streamsのデコレータのメッセージが来た際のKeyErrorの発生を修正
  • 一部のデコレータでeventおよびその処理結果のログ出力が漏れてた問題を修正

1.2も近日リリース予定

バージョン1.2の開発もすでに着手しており、大きなものとしては以下のアップデートを予定しています。

  • ログの出力先を変更しやすくする仕組み、およびそれを利用したKinesis Firehoseへの出力変更オプション
  • SQSやStream系のサービスで、より細やかな制御を行うためにMessageIDやReceiptHandleといったメタデータを含めた形のイベントデータを扱うハンドラを実装するための新しいデコレータ

今回のリリースを助けてくれた素晴らしいコントリビューター

今回のリリースにおいてissueによる提案やバグ報告、プルリクエストを送ってくれたKeisuke69youyoにとても感謝しています!

フィードバックや実際に手を動かしてくれるコントリビュータの皆さんのおかげでJeffyは少しづつ良くなり、サーバーレスなデベロッパーにとって便利なものに成長していくでしょう。

改めて感謝します!

ありがとうございましたーーーー!!!
👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏👏

Our Partners

サーバーレスで
クラウドの価値を最大限にMaximize the cloud value with serverless

Serverless Operationsはこれまでグローバルの第一線で培ってきたクラウド技術(AWS − アマゾンウェブサービス)の豊富な実績と知見を活かし、お客さまのサーバーレスに関するさまざまな課題を解決します。