emahiro/b.log

日々の勉強の記録とか育児の記録とか。

AWS SDK for Go V2 で Endpoint Resolver の実装方法が変わった話

Overview

タイトルのとおりです。
AWS SDK for Go V2 を使ってるケースで従来の Endpoint Resolver の実装方法が非推奨になり、新しい実装方法が公開されていました。

aws.github.io

Endpoint Resolver とは?

文字通り AWS SDK 経由で AWS のサービスにアクセスするときの Endpoint の向き先を解決するための設定(config) です。

例えば Local 環境で AWS に依存したサービスを立ち上げたり、テストを回したりするときに、Local で起動してる AWSエミュレーターや Fake サービスのコンテナにアクセス先を切り替えるときなどに利用します。

実装方法

ドキュメントでは S3 の実装方法について記載してますが以下では SQS を使ったときの Endpoint Resolver の実装方法を記載します。

type resolverV2 struct{}

func (*resolverV2) ResolveEndpoint(ctx context.Context, params sqs.EndpointParameters) (smithyendpoints.Endpoint, error) {    
    if IsLocal() {
        // local 環境では local で立ち上がっている sqs のコンテナ、ないしエミュレーターへルーティングする
        u, err := url.Parse("$localSqsEndpoint")
        if err != nil {
            return smithyendpoints.Endpoint{}, err
        }
        return smithyendpoints.Endpoint{URI: *u}, nil
    }
    return sqs.NewDefaultEndpointResolverV2().ResolveEndpoint(ctx, params)
}

func main(){
    opt := []func(*sqs.Options){
        func(o *sqs.Options) {
            o.EndpointResolverV2 = &resolverV2{}
        },
    }
    client := sqs.NewFromConfig(cfg, append(opt, optFns...)...)
    // use sqs client
}

上記のような実装になります。

  1. resolver の型を定義し、サービスごとに ResolveEndpoint interface を実装する。
  2. AWS サービスのクライアントをインスタンス化するときに、interface を実装した resolver を option で指定する。このとき EndpointResolverV2 に、実装した resolver を渡す。