HTTP クライアントをカスタマイズする - AWS SDK for Go v2

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

HTTP クライアントをカスタマイズする

AWS SDK for Go は、デフォルトの設定値を持つ標準の HTTP クライアントを使用します。一部の設定値は変更できますが、高スループットかつ低レイテンシーを要件とする環境で AWS SDK for Go を使用する顧客にとって、標準の HTTP クライアントとトランスポート設定では十分でありません。設定の推奨事項はワークロードによって異なるため、詳細については「よくある質問」を参照してください。このセクションでは、カスタム HTTP クライアントを設定し、そのクライアントを使用して AWS SDK for Go 呼び出しを作成する方法について説明します。

カスタム HTTP クライアントの作成に役立つように、このセクションでは NewBuildableClient を使用してカスタム設定を行い、そのクライアントを AWS SDK for Go サービスクライアントで使用する方法について説明します。

カスタマイズする内容を定義しましょう。

設定ロード時のオーバーライド

カスタム HTTP クライアントは、LoadDefaultConfig を呼び出す際に、WithHTTPClient でラップして LoadDefaultConfig に渡すことで提供できます。例えば、customClient をクライアントとして渡すには次のようにします。

cfg, err := config.LoadDefaultConfig(context.TODO(), config.WithHTTPClient(customClient))

タイムアウト

BuildableHTTPClient には、リクエストのタイムアウト制限を設定できます。このタイムアウトには、接続時間、リダイレクトの処理時間、レスポンス本文全体の読み取り時間が含まれます。例えば、クライアントのタイムアウトを変更するには次のようにします。

import "github.com/aws/aws-sdk-go-v2/aws/transport/http" // ... httpClient := http.NewBuildableClient().WithTimeout(time.Second*5)

Dialer

BuildableHTTPClient では、Dialer オプションを変更してクライアントを作成するためのビルダー構造が提供されています。次の例では、クライアントの Dialer 設定を行う方法を示しています。

import awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" import "net" // ... httpClient := awshttp.NewBuildableClient().WithDialerOptions(func(d *net.Dialer) { d.KeepAlive = -1 d.Timeout = time.Millisecond*500 })

設定

Dialer.KeepAlive

この設定は、アクティブなネットワーク接続のキープアライブ期間を表します。

キープアライブを無効にするには、負の値に設定します。

プロトコルとオペレーティングシステムがサポートしている場合、キープアライブを有効にするには、0 に設定します。

キープアライブをサポートしていないネットワークプロトコルやオペレーティングシステムでは、このフィールドは無視されます。TCP では、デフォルトでキープアライブが有効になっています。

https://golang.org/pkg/net/#Dialer.KeepAlive を参照してください。

KeepAlivetime.Duration 型で設定してください。

Dialer.Timeout

この設定は、ダイヤルが接続を確立するまでの最大待機時間を表します。

デフォルトは 30 秒です。

https://golang.org/pkg/net/#Dialer.Timeout を参照してください。

Timeouttime.Duration 型で設定してください。

トランスポート

BuildableHTTPClient では、Transport オプションを変更してクライアントを作成するためのビルダー構造が提供されています。

プロキシの設定

インターネットに直接接続できない場合は、Go がサポートする環境変数 (HTTP_PROXY/HTTPS_PROXY) を使用するか、カスタム HTTP クライアントを作成してプロキシを設定できます。次の例では、クライアントがプロキシエンドポイントとして PROXY_URL を使用するように設定しています。

import awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" import "net/http" // ... httpClient := awshttp.NewBuildableClient().WithTransportOptions(func(tr *http.Transport) { proxyURL, err := url.Parse("PROXY_URL") if err != nil { log.Fatal(err) } tr.Proxy = http.ProxyURL(proxyURL) })

その他の設定

次に示しているのは、HTTP クライアントのチューニングに使用できるその他の Transport 設定です。ここで説明されていない追加の設定については、Transport 型に関するドキュメントを参照してください。これらの設定は次の例に示すように適用できます。

import awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" import "net/http" // ... httpClient := awshttp.NewBuildableClient().WithTransportOptions(func(tr *http.Transport) { tr.ExpectContinueTimeout = 0 tr.MaxIdleConns = 10 })

Transport.ExpectContinueTimeout

リクエストに [Expect: 100-continue] ヘッダーが含まれている場合、この設定はリクエストヘッダーの送信完了後にサーバーから最初のレスポンスヘッダーを受信するまでの最大待機時間を表します。この時間にはリクエストヘッダーの送信時間は含まれません。このタイムアウトが経過すると、HTTP クライアントはペイロードの送信を開始します。

デフォルトは 1 秒です。

0 に設定するとタイムアウトは無効になり、待機せずにペイロードが送信されます。この設定のユースケースの 1 つは、Amazon S3 を使用する関数のように (後述)、プロキシやサードパーティのサービスでセッション処理に関する問題が発生する場合です。

https://golang.org/pkg/net/http/#Transport.ExpectContinueTimeout を参照してください。

ExpectContinuetime.Duration 型で設定してください。

Transport.IdleConnTimeout

この設定は、HTTP リクエスト間でアイドル状態のネットワーク接続を維持する最大時間を表します。

制限なしにするには 0 に設定します。

https://golang.org/pkg/net/http/#Transport.IdleConnTimeout を参照してください。

IdleConnTimeouttime.Duration 型で設定してください。

Transport.MaxIdleConns

この設定は、すべてのホストにわたって保持されるアイドル (キープアライブ) 接続の最大数を表します。この値を増やすユースケースの 1 つは、同じクライアントから短期間に多数の接続が行われる場合です。

0 に設定すると無制限になります。

https://golang.org/pkg/net/http/#Transport.MaxIdleConns を参照してください。

MaxIdleConnsint 型で設定してください。

Transport.MaxIdleConnsPerHost

この設定は、ホストごとに保持するアイドル (キープアライブ) 接続の最大数を表します。この値を増やすユースケースの 1 つは、同じクライアントから短期間に多数の接続が行われる場合です。

デフォルトでは、ホストごとに 2 つのアイドル接続が保持されます。

0 に設定すると、DefaultMaxIdleConnsPerHost (2) が使用されます。

https://golang.org/pkg/net/http/#Transport.MaxIdleConnsPerHost を参照してください。

MaxIdleConnsPerHostint 型で設定してください。

Transport.ResponseHeaderTimeout

この設定は、クライアントがレスポンスヘッダーを読み取るまでに待機する最大時間を表します。

クライアントがこの時間内にレスポンスヘッダーを読み取れない場合、リクエストはタイムアウトエラーで失敗します。

長時間実行される Lambda 関数を使用する場合、この値の設定には注意が必要です。Lambda 関数が終了するかタイムアウトするまで、レスポンスヘッダーが返されないためです。ただし、**InvokeAsync** API オペレーションではこのオプションを使用できます。

デフォルトではタイムアウトはなく、無期限に待機します。

https://golang.org/pkg/net/http/#Transport.ResponseHeaderTimeout を参照してください。

ResponseHeaderTimeouttime.Duration 型で設定してください。

Transport.TLSHandshakeTimeout

この設定は、TLS ハンドシェイクが完了するまでの最大待機時間を表します。

デフォルトは 10 秒です。

0 に設定すると、タイムアウトは無効になります。

https://golang.org/pkg/net/http/#Transport.TLSHandshakeTimeout を参照してください。

TLSHandshakeTimeouttime.Duration 型で設定してください。