

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

# Amazon OpenSearch Service での HTTP リクエストの圧縮
<a name="gzip"></a>

gzip 圧縮を使用して、Amazon OpenSearch Service ドメインで HTTP リクエストとレスポンスを圧縮できます。gzip 圧縮を使用すると、ドキュメントのサイズを縮小し、帯域幅の使用率とレイテンシーを低減できるため、転送速度が向上します。

gzip 圧縮は、OpenSearch または Elasticsearch 6.0 以降を実行しているすべてのドメインでサポートされています。OpenSearch クライアントの中には、gzip 圧縮のサポートが組み込まれているものもあり、また、多くのプログラミング言語には、プロセスを簡素化するライブラリがあります。

## gzip 圧縮を有効にする
<a name="gzip-enable"></a>

OpenSearch の類似の設定と混同しないように注意してください。`http_compression.enabled` は OpenSearch Service に固有であり、ドメインで gzip 圧縮を有効または無効にします。OpenSearch または Elasticsearch 7.*x* を実行しているドメインではデフォルトで gzip 圧縮が有効になっていますが、Elasticsearch 6.*x* を実行しているドメインではデフォルトで無効になっています。

gzip 圧縮を有効にするには、次のリクエストを送信します。

```
PUT _cluster/settings
{
  "persistent" : {
    "http_compression.enabled": true
  }
}
```

`_cluster/settings` へのリクエストは圧縮解除する必要があるので、クラスター設定を更新するために別のクライアントまたは標準の HTTP 要求を使用する必要がある場合があります。

gzip 圧縮が正常に有効になったことを確認するには、次のリクエストを送信します。

```
GET _cluster/settings?include_defaults=true
```

レスポンスに次の設定が表示されていることを確認します。

```
...
"http_compression": {
  "enabled": "true"
}
...
```

## 必要なヘッダー
<a name="gzip-headers"></a>

gzip 圧縮されたリクエストボディを含める場合は、標準の `Content-Type: application/json` ヘッダーを保持し、`Content-Encoding: gzip` ヘッダーを追加します。gzip 圧縮レスポンスを受け入れるには、`Accept-Encoding: gzip` ヘッダーも同様に追加します。OpenSearch クライアントが gzip 圧縮をサポートしている場合、これらのヘッダーが自動的に含まれている可能性があります。

## サンプルコード (Python 3)
<a name="gzip-code"></a>

次のサンプルでは、[opensearch-py](https://pypi.org/project/opensearch-py/) を使用して圧縮を実行し、リクエストを送信します。このコードは、IAM 認証情報を使用してリクエストに署名します。

```
from opensearchpy import OpenSearch, RequestsHttpConnection
from requests_aws4auth import AWS4Auth
import boto3

host = '' # e.g. my-test-domain.us-east-1.es.amazonaws.com
region = '' # e.g. us-west-1
service = 'es'
credentials = boto3.Session().get_credentials()
awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token)

# Create the client.
search = OpenSearch(
    hosts = [{'host': host, 'port': 443}],
    http_auth = awsauth,
    use_ssl = True,
    verify_certs = True,
    http_compress = True, # enables gzip compression for request bodies
    connection_class = RequestsHttpConnection
)

document = {
  "title": "Moneyball",
  "director": "Bennett Miller",
  "year": "2011"
}

# Send the request.
print(search.index(index='movies', id='1', body=document, refresh=True))

# print(search.index(index='movies', doc_type='_doc', id='1', body=document, refresh=True))
```

あるいは、適切なヘッダーを指定し、リクエストボディを自身で圧縮し、[リクエスト](https://2.python-requests.org)のような標準 HTTP ライブラリを使用します。このコードは、HTTP 基本認証情報を使用してリクエストに署名します。これは、[きめ細かなアクセスコントロール](fgac.md)使用する場合に、ドメインがサポートする場合があります。

```
import requests
import gzip
import json

base_url = '' # The domain with https:// and a trailing slash. For example, https://my-test-domain.us-east-1.es.amazonaws.com/
auth = ('master-user', 'master-user-password') # For testing only. Don't store credentials in code.

headers = {'Accept-Encoding': 'gzip', 'Content-Type': 'application/json',
           'Content-Encoding': 'gzip'}

document = {
  "title": "Moneyball",
  "director": "Bennett Miller",
  "year": "2011"
}

# Compress the document.
compressed_document = gzip.compress(json.dumps(document).encode())

# Send the request.
path = 'movies/_doc?refresh=true'
url = base_url + path
response = requests.post(url, auth=auth, headers=headers, data=compressed_document)
print(response.status_code)
print(response.text)
```