AWS SDK のクライアントにリトライ処理を実装(設定)する
この記事の目的
- AWS SDK を使用した DynamoDB、S3 へのリトライ処理を簡単に実装する方法を紹介すること
背景
TypeScript で書かれた Web サービスのバックエンドのデータソースとして DynamoDB、S3 を使用しており、AWS SDK for JavaScript v3 を使用してアクセスしています。
AWS側の一時的な障害やNW不良等により、DynamoDB、S3 へのアクセスが失敗することがあるため、リトライ処理を実装し、その回数や間隔を調整したいケースがあります。
結論
AWS SDK の Client のインスタンス生成時に、リトライ回数やバックオフ処理を定義することができます。
リトライ回数とバックオフ処理を独自に定義したい場合
import { S3Client } from "@aws-sdk/client-s3";
import { ConfiguredRetryStrategy } from "@smithy/util-retry";
const client = new S3Client({
retryStrategy: new ConfiguredRetryStrategy(
4, // ここにリトライ回数を定義
(attempt: number) => 100 + attempt * 1000 // バックオフ処理を定義
),
});
リトライ回数だけ定義したい場合
import { S3Client } from "@aws-sdk/client-s3";
const client = new S3Client({ maxAttempts: 4 });
参考: https://github.com/awslabs/smithy-typescript/blob/main/packages/util-retry/README.md
DynamoDB や S3 以外のデータソース(RDBMS, 外部API等)へのアクセスをラップするようなクラスを作成し、そのクラス内でリトライ処理を実装することもできますが、ライトなケースであれば、この設定だけで十分かと思います。
この記事を書いた経緯
DynamoDB, S3 のクライアントのインターフェースには maxAttempts
や retryStrategy
の定義が存在しますが、その使い方についてのドキュメントが見つけらませんでした。
最終的にこちらの Issue から、こちらにたどり着きました。
Smithy って?
Smithy is a language for defining services and SDKs.
Smithy はAWS製のインターフェース定義言語(IDL)です。
IDLとは言語やフレームワークに依存せずにインターフェース仕様を定義するための言語で、OpenAPI や gRPC 等も IDL に含まれます。
今回参考としたコードは、 Smithy で定義されたインターフェースを元にした TypeScript のコードの一部、の理解です。
API Gateway とのインターフェースを Smithy で定義し、それを元に TypeScript の Handler のコードを生成することもできるようなので、今後試してみたいと思います。
Discussion