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 からの操作
まず 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 のセキュリティ
- see also: Amazon OpenSearch Service のきめ細かなアクセスコントロール
- see also: Amazon OpenSearch Service のセキュリティ
OpenSearch Service のセキュリティのレイヤーは以下の 3 つに大別することができる
- ネットワーク: リクエストをパブリックに受け付けるか、VPC のセキュリティグループによって許可された接続のみを受け付けるか制御できる
- ドメインアクセスポリシー: ドメインに到達したリクエストを以下の 3 種類のアクセスポリシーに照らし合わせて受け入れるか制御できる
- リソースベースのポリシー: ドメイン側のリソースポリシーに指定したプリンシパルからのアクション権限をアタッチすることにより制御できる
- アイデンティティベースのポリシー: IAM ユーザー/ロールなどに対して es:ESHttpGet などのアクション権限をアタッチすることにより制御できる
- IP アドレス: パブリックドメインを使用する場合、オリジンの IP アドレスをもとにリクエストの許可/拒否が設定できる
- きめ細かなアクセスコントロール: ネットワーク、アクセスポリシーともに通過したリクエストについて、さらにユーザー認証情報をもとに受理の可否を制御できる
ネットワークによる OpenSearch ドメインの保護
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 つが用意されている
- リソースベースのポリシー
- アイデンティティベースのポリシー
- IP ベースのポリシー
きめ細かなアクセスコントロールによる OpenSearch ドメインの保護
TODO
データ保護
前項までは主にリクエストに対してどのようなセキュリティ機構があるかをみてきたが、OpenSearch Service には「データ保管中の暗号化」および「ノード間の通信の暗号化」というデータ保護の観点がある。
データ保管中の暗号化
KMS 暗号化キーを用いて、すべてのインデックス、OpenSearch ログ、スワップファイル、アプリケーションディレクトリのその他すべてのデータ、自動スナップショットの暗号化が実施できる。なお、手動スナップショット、スロークエリログ、エラーログの暗号化には追加のステップが必要。
ノード間の通信の暗号化
OpenSearch Service ドメインはパブリックであるか VPC アクセスであるかに依存せず、専用の VPC 内に配置される。しかしデフォルトでは VPC 内のノード間のトラフィックは暗号化されない。暗号化のためにはノード感の暗号化を有効化する設定が必要で、これにより TLS 1.2 で保護される。
Pinned Articles
About
ウェブ界隈でエンジニアとして労働活動に励んでいる @gomi_ningen 個人のブログです
Tags
JavaScript
PowerShell
kibana
elasticsearch
fluentd
nginx
イベント
五十嵐裕美
村川梨衣
logrotate
IoT
Scala
Java
C言語
iputils
ICMP
WUG
mastodon
Swift
AWS
Clock
Windows
アーキテクチャ
PoEAA
iOS
DeviceFarm
プログラミング言語
OS
StepFunctions
Lambda
Serverless
terraform
ポエム
RHEL
ネットワーク
GraphQL
CloudWatch
Linux
Coreutils
network
nc
telnet
LinuxKernel
fpinscala
ELB
IAM
AppSync
EFS
Gradle
english