

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

# HTTP クライアントをカスタマイズする
<a name="configure-http"></a>

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

 カスタム HTTP クライアントの作成に役立つように、このセクションでは [NewBuildableClient](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/aws/transport/http#NewBuildableClient) を使用してカスタム設定を行い、そのクライアントを AWS SDK for Go サービスクライアントで使用する方法について説明します。

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

## 設定ロード時のオーバーライド
<a name="overriding-during-configuration-loading"></a>

 カスタム HTTP クライアントは、[LoadDefaultConfig](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/config#LoadDefaultConfig) を呼び出す際に、[WithHTTPClient](https://pkg.go.dev/github.com/aws/aws-sdk-go-v2/config#WithHTTP) でラップして `LoadDefaultConfig` に渡すことで提供できます。例えば、`customClient` をクライアントとして渡すには次のようにします。

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

## タイムアウト
<a name="timeout"></a>

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

```
import "github.com/aws/aws-sdk-go-v2/aws/transport/http"

// ...

httpClient := http.NewBuildableClient().WithTimeout(time.Second*5)
```

## Dialer
<a name="dialer"></a>

 `BuildableHTTPClient` では、[Dialer](https://golang.org/pkg/net/#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
})
```

### 設定
<a name="settings"></a>

#### Dialer.KeepAlive
<a name="dialerkeepalive"></a>

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

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

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

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

 [https://golang.org/pkg/net/\$1Dialer.KeepAlive](https://golang.org/pkg/net/#Dialer.KeepAlive) を参照してください。

 `KeepAlive` は **time.Duration** 型で設定してください。

#### Dialer.Timeout
<a name="dialertimeout"></a>

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

 デフォルトは 30 秒です。

 [https://golang.org/pkg/net/\$1Dialer.Timeout](https://golang.org/pkg/net/#Dialer.Timeout) を参照してください。

 `Timeout` は **time.Duration** 型で設定してください。

## トランスポート
<a name="transport"></a>

 `BuildableHTTPClient` では、[Transport](https://golang.org/pkg/net/http#Transport) オプションを変更してクライアントを作成するためのビルダー構造が提供されています。

### プロキシの設定
<a name="configuring-a-proxy"></a>

 インターネットに直接接続できない場合は、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)
})
```

### その他の設定
<a name="other-settings"></a>

 次に示しているのは、HTTP クライアントのチューニングに使用できるその他の `Transport` 設定です。ここで説明されていない追加の設定については、[Transport](https://golang.org/pkg/net/http/#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
<a name="transportexpectcontinuetimeout"></a>

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

 デフォルトは 1 秒です。

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

 [https://golang.org/pkg/net/http/\$1Transport.ExpectContinueTimeout](https://golang.org/pkg/net/http/#Transport.ExpectContinueTimeout) を参照してください。

 `ExpectContinue` は **time.Duration** 型で設定してください。

#### Transport.IdleConnTimeout
<a name="transportidleconntimeout"></a>

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

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

 [https://golang.org/pkg/net/http/\$1Transport.IdleConnTimeout](https://golang.org/pkg/net/http/#Transport.IdleConnTimeout) を参照してください。

 `IdleConnTimeout` は **time.Duration** 型で設定してください。

#### Transport.MaxIdleConns
<a name="transportmaxidleconns"></a>

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

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

 [https://golang.org/pkg/net/http/\$1Transport.MaxIdleConns](https://golang.org/pkg/net/http/#Transport.MaxIdleConns) を参照してください。

 `MaxIdleConns` は **int** 型で設定してください。

#### Transport.MaxIdleConnsPerHost
<a name="transportmaxidleconnsperhost"></a>

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

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

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

 [https://golang.org/pkg/net/http/\$1Transport.MaxIdleConnsPerHost](https://golang.org/pkg/net/http/#Transport.MaxIdleConnsPerHost) を参照してください。

 `MaxIdleConnsPerHost` は **int** 型で設定してください。

#### Transport.ResponseHeaderTimeout
<a name="transportresponseheadertimeout"></a>

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

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

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

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

 [https://golang.org/pkg/net/http/\$1Transport.ResponseHeaderTimeout](https://golang.org/pkg/net/http/#Transport.ResponseHeaderTimeout) を参照してください。

 `ResponseHeaderTimeout` は **time.Duration** 型で設定してください。

#### Transport.TLSHandshakeTimeout
<a name="transporttlshandshaketimeout"></a>

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

 デフォルトは 10 秒です。

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

 [https://golang.org/pkg/net/http/\$1Transport.TLSHandshakeTimeout](https://golang.org/pkg/net/http/#Transport.TLSHandshakeTimeout) を参照してください。

 `TLSHandshakeTimeout` は **time.Duration** 型で設定してください。