emahiro/b.log

Drastically Repeat Yourself !!!!

AWS の API Call に Retry option を設定する

サマリ

AWS のリソースを API 経由で Call するときに Retry option を使うと便利、というお話です。
メッセージを trigger にして Lambda を起動させるなど、イベント駆動でプロセスを開始するようなサービスを使うケースでは、失敗しても Retry してくれる機構が予め用意されていたりしますが、直接 AWS のリソースを API で呼び出すケースでは Retry を指定することができます。
普段自分は Go を使っているので AWS-Go-SDK を使う前提の話をしますが、以下のドキュメントに詳しく書いてあります。

aws.github.io

実装方法

sqs を例に取ります。

例えば backoff retry を明示的に指定するのは以下です。

var opt []func(*sqs.Options)
opt = append(opt, func(o *sqs.Options) {
    std := retry.NewStandard()
    o.Retryer = retry.AddWithMaxBackoffDelay(std, time.Second*5) // 5秒間 backoff 期間を設ける
})

リトライの試行回数を指定することもできます。

var opt []func(*sqs.Options)
opt = append(opt, func(o *sqs.Options) {
    std := retry.NewStandard()
    o.Retryer = retry.AddWithMaxAttempts(std, 5)
})

AWS Go SDK V2 ではこうした APIOption が多数用意されているので用途に応じて設定するとよしなに対応してくれます。

ちなみにあとから気づきましたが、AWS の各リソースをインスタンス化する NewFromConfig メソッドを Call するタイミングで、デフォルトで backoff が指定されるので、使うときはよほどのことがない限りは明示的な指定は不要でした。
SQS クライアントをインスタンス化する https://github.com/aws/aws-sdk-go-v2/blob/service/sqs/v1.16.0/service/sqs/api_client.go#L37-L61 で Call されている resolveRetryer(&options) がそれです。この内部で retry.NewStandard() を Call しているので、デフォルトで backoff が 20 sec に設定されます。

まとめ

AWS SDK Go V2  には色々なオプションがあるので、深掘りしてると楽しいですね。