Amazon Web Services ブログ

Amazon Elasticsearch Service の使用開始: AWS SigV4 による署名付きリクエストを簡単に送信する方法

Elasticsearch および Amazon Elasticsearch Service (Amazon ES) に関するこの導入シリーズへようこそ。今回および今後のブログ記事では、AWS で Elasticsearch の使用を開始するために必要な基本情報を紹介します。

概要

IAM ポリシーまたは Amazon Resource Name (ARN) のポリシーを使用して、ユーザーまたはロールを指定し、Amazon Elasticsearch Service ドメインへのアクセスをコントロールしている場合は、ドメインへのすべてのリクエストに対し AWS Signature Version 4 (AWS SigV4) を使用して署名する必要があります。ドメイン保護に関するさらに詳しい分析については、こちらのブログ記事もご参照ください。ポリシーの考察およびその問題解決に関する詳細は、こちらのブログ記事をご参照ください。

リクエストへの署名に関する AWS ドキュメントを読んでいただければ、非常に複雑に見えるプロセスが理解できるようになります。難しく見えますが、3 つのオープンソースライブラリを使用して、コードをいくつか書き、署名して Amazon ES にリクエストを送信するのはとても簡単です。ここでは Boto3、Python Requests ライブラリ、Requests AWS4Auth ライブラリを使用します。

コードスニペット

次のコードスニペットには、HTTP メソッド、呼び出す URL、呼び出すサービス、AWS リージョン、オプションのリクエストボディがあります。このコードでは、Boto3 の Session クラスを使用して認証情報を取得しています。Boto3 が認証情報を決定する方法の詳細については、Boto3 のドキュメントを参照してください。AWS4Auth クラスが認証情報を使用してリクエストに署名します。最後に、Requests ライブラリが Amazon ES にリクエストを送信します。

注意: Boto3 は AWS の Python SDK です。Requests および Requests_aws4authライブラリは、AWS ではなくサードパーティー製です。AWS は外部コンテンツの機能または適合性について責任を負いません。

import boto3
import requests
from requests_aws4auth import AWS4Auth

def send_signed(method, url, service='es', region='us-west-2', body=None):
    credentials = boto3.Session().get_credentials()
    auth = AWS4Auth(credentials.access_key, credentials.secret_key,
                  region, service, session_token=credentials.token)

    fn = getattr(requests, method)
    if body and not body.endswith("\n"):
        body += "\n"
    fn(url, auth=auth, data=body,
       headers={"Content-Type":"application/json"})

独自のコードを使用するには、エラー処理と結果の解析を追加し、少なくとも HTTP ステータスコードを返す必要があります。

ボディが改行文字で終わらない場合には、コードに追加します。これは、最後の改行が必要な呼び出し (たとえば _bulk API アクションの呼び出し) に必要なためです。

また、コードにすべてのリクエストへのコンテンツヘッダーを追加することにも注意してください。Elasticsearch 6.0 のスクリプトタイプチェックの時点で、このヘッダーは必要になります。以前のバージョンの Elasticsearch では必要ありませんが、互換性はあります。

使用方法

簡単な例として、次のコードでは Elasticsearch に単一のドキュメントを送信します。

    url = 'http://<Amazon ES Endpoint>/blogs/blog'
    doc = '''{
                 "author": "Jon",
                 "title": "signing is easy!"
             }'''
    send_signed('post', url, body=doc)

ドメインの実際のエンドポイントを必ず置換してください。es: HttpPost を許可するポリシーでロールが割り当てられている Amazon EC2 インスタンスでこのコードを実行すると、IAM はリクエストの署名に基づいて POST を認証し、Elasticsearch はドキュメントをインデキシングします。

結論

AWS SigV4 による署名付きリクエストの送信は難しいというご懸念をお持ちだった思います。そこで引き返す必要はありません。 ご覧のとおり、リクエスト署名の運用はシンプルなのです。


著者について

Jon Handler (@_searchgeek) は、検索テクノロジーが専門の AWS ソリューションアーキテクトです。 AWS を使用する際にソリューションの価値を向上させる手助けとなるために、当社の顧客と協力してデータベースプロジェクト上の指導や技術支援を行っています。