amazon opensearch service

2023-03-11 08:23
2023-03-11 08:23

Amazon OpenSearch Service に関する情報を集約するページ

OpenSearch の基本的な概念

see also: Introduction to OpenSearch

論理的な概念

  • JSON の ドキュメント を保存・検索できるサービス
    • ドキュメントは RDB における 1 レコードに相当する
  • 関連するドキュメント同士は同じ インデックス に格納する
    • インデックスは RDB におけるデータベースに相当する
  • それぞれのインデックスのレコード要素の型は マッピングタイプ にて指定する
    • 指定していない場合、推論される
    • RDB におけるテーブルのスキーマに相当する
  • OpenSearch は列指向であるため各インデックスのタイプ

物理的な概念

  • クラスタ: 1つまたは複数ノードの集合
  • ノード: データを保存したり検索処理を行うサーバー/プロセス
  • シャード: サイズの大きなインデックスを複数の異なるノードに分割して保持する際の単位

基本的な操作

DevTools からの操作

インデックスのリスト

GET /_cat/indices

インデックスの作成

PUT <index_name>

インデックスへのドキュメントの追加・更新

PUT voice_actor/_doc/1
{
  "name": "阿澄佳奈"
}

# 更新
POST voice_actor/_doc/1
{
  "name": "原田佳奈"
}

ドキュメントの取得

GET voice_actor/_doc/1

インデックスの削除

DELETE voice_actor

ドキュメントの検索

see also: Query DSL

GET voice_actor/_search?q=name:阿澄

GET voice_actor/_search
{
  "query":{"match_phrase":{ "name":"青山"}},
  "size": 10
}

マッピングの確認

GET voice_actor/_mapping

curl での操作

$ DOMAIN_ENDPOINT=...
$ awscurl --region ap-northeast-1 --service es ${DOMAIN_ENDPOINT}/_cat/indices
green open .kibana_1 FyeGWV3QSeCkI8LqW7jIXQ 1 0 1 0 4.9kb 4.9kb

Python からの操作

see also: Python - Amazon OpenSearch Service への HTTP リクエストの署名

まず pip install boto3 opensearch-py requests requests-aws4auth コマンドにて関連するライブラリの導入を行う。そののち以下のような実装にてドメインへリクエストを行える。

from opensearchpy import OpenSearch, RequestsHttpConnection, AWSV4SignerAuth
import boto3

host = '' # cluster endpoint, for example: my-test-domain.us-east-1.es.amazonaws.com
region = '' # e.g. us-west-1

credentials = boto3.Session().get_credentials()
auth = AWSV4SignerAuth(credentials, region)
index_name = 'movies'

client = OpenSearch(
    hosts = [{'host': host, 'port': 443}],
    http_auth = auth,
    use_ssl = True,
    verify_certs = True,
    connection_class = RequestsHttpConnection
)

q = 'miller'
query = {
  'size': 5,
  'query': {
    'multi_match': {
      'query': q,
      'fields': ['title^2', 'director']
    }
  }
}

response = client.search(
    body = query,
    index = index_name
)

print('\nSearch results:')
print(response)

OpenSearch Service のセキュリティ

OpenSearch Service のセキュリティのレイヤーは以下の 3 つに大別することができる

  • ネットワーク: リクエストをパブリックに受け付けるか、VPC のセキュリティグループによって許可された接続のみを受け付けるか制御できる
  • ドメインアクセスポリシー: ドメインに到達したリクエストを以下の 3 種類のアクセスポリシーに照らし合わせて受け入れるか制御できる
    • リソースベースのポリシー: ドメイン側のリソースポリシーに指定したプリンシパルからのアクション権限をアタッチすることにより制御できる
    • アイデンティティベースのポリシー: IAM ユーザー/ロールなどに対して es:ESHttpGet などのアクション権限をアタッチすることにより制御できる
    • IP アドレス: パブリックドメインを使用する場合、オリジンの IP アドレスをもとにリクエストの許可/拒否が設定できる
  • きめ細かなアクセスコントロール: ネットワーク、アクセスポリシーともに通過したリクエストについて、さらにユーザー認証情報をもとに受理の可否を制御できる

ネットワークによる OpenSearch ドメインの保護

see also: VPC 内で Amazon OpenSearch Service ドメインを起動する

OpenSearch ドメインを自身の AWS アカウントの VPC 内に設置できる。VPC からのリクエストをドメインが受け付けるためにはセキュリティグループに以下の 2 つのインバウンドルールを設定する必要がある。

  • Type: SSH(22), Protocol: TCP(6), Port: 22, Source: VPC CIDR
  • Type: HTTPS(443), Protocol: TCP(6), Port: 443, Source: VPC CIDR

アクセスポリシーによる OpenSearch ドメインの保護

アクセスポリシーによるドメインへのアクセス制御の方法として以下の 3 つが用意されている

  1. リソースベースのポリシー
  2. アイデンティティベースのポリシー
  3. IP ベースのポリシー

きめ細かなアクセスコントロールによる OpenSearch ドメインの保護

TODO

データ保護

前項までは主にリクエストに対してどのようなセキュリティ機構があるかをみてきたが、OpenSearch Service には「データ保管中の暗号化」および「ノード間の通信の暗号化」というデータ保護の観点がある。

データ保管中の暗号化

KMS 暗号化キーを用いて、すべてのインデックス、OpenSearch ログ、スワップファイル、アプリケーションディレクトリのその他すべてのデータ、自動スナップショットの暗号化が実施できる。なお、手動スナップショット、スロークエリログ、エラーログの暗号化には追加のステップが必要。

ノード間の通信の暗号化

OpenSearch Service ドメインはパブリックであるか VPC アクセスであるかに依存せず、専用の VPC 内に配置される。しかしデフォルトでは VPC 内のノード間のトラフィックは暗号化されない。暗号化のためにはノード感の暗号化を有効化する設定が必要で、これにより TLS 1.2 で保護される。

Copyright © 53ningen.com