👏

AWS SDK のクライアントにリトライ処理を実装(設定)する

2023/09/12に公開

この記事の目的

  • 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 のクライアントのインターフェースには maxAttemptsretryStrategy の定義が存在しますが、その使い方についてのドキュメントが見つけらませんでした。
最終的にこちらの Issue から、こちらにたどり着きました。

Smithy って?

Smithy is a language for defining services and SDKs.

https://smithy.io/2.0/index.html#

Smithy はAWS製のインターフェース定義言語(IDL)です。
IDLとは言語やフレームワークに依存せずにインターフェース仕様を定義するための言語で、OpenAPI や gRPC 等も IDL に含まれます。

今回参考としたコードは、 Smithy で定義されたインターフェースを元にした TypeScript のコードの一部、の理解です。

https://github.com/awslabs/smithy-typescript

API Gateway とのインターフェースを Smithy で定義し、それを元に TypeScript の Handler のコードを生成することもできるようなので、今後試してみたいと思います。

https://smithy.io/2.0/ts-ssdk/handlers.html

GitHubで編集を提案

Discussion