Closed19
OpenSearchServerlessでKnowledgeBase用のインデックスを作成する

OpenSearchServerless(AOSS)へ操作をするために、以下の対応を行う
- EC2の作成
- AOSSのVPCeの作成

Collectionを作成するのはコンソールに従えば問題なし。データアクセスポリシーのプリンシパルをどのように設定すれば良いのか確認が必要。今回は、EC2から操作をしたいため、EC2に付与されているロールになる?

まず、リソースの作成が完了。indexの作成に必要なコマンドを確認。コンソールが画面から生成することができる。

コマンドはCurlを使用して実行することが記載されている。
{"settings":{"index":{"knn":true,"knn.algo_param.ef_search":512}},"mappings":{"properties":{"test-index":{"type":"knn_vector","dimension":1536,"method":{"name":"hnsw","engine":"faiss","parameters":{"m":16,"ef_construction":512},"space_type":"l2"}},"AMAZON_BEDROCK_METADATA":{"type":"text","index":"false"},"AMAZON_BEDROCK_TEXT_CHUNK":{"type":"text","index":"true"}}}}

次は、以下を確認する必要がある。
- EC2からAOSSのCollectionに対する到達性
- そのためのコマンド

コマンド確認として、以下をメモ。
curl コマンドでリクエストの署名ができる --aws-sigv4 オプション
pipインストール
sudo yum -y install python-pip
awscurl インストール
pip install awscurl

現時点で、自分がわかっていないこと
- どうすれば、到達性が確認できるか
- 今回、VPCeを経由してコマンドが実行できるケースを確認する。最終的にはインデックスを作成するのだが、現時点ではまずコマンドが実行できることを確認したい
- 例として、EC2からVPCeでAOSSのコレクション一覧を確認するコマンドを実行して、結果が返ってくることを確認したい
- コマンドについて
- 今回、データアクセスポリシーでは、EC2に設定したロールをプリンシパルとして許可をしている。
- どうすれば、許可されたプリンシパルからのコマンドになるのか。
- たとえば、EC2のコマンドを実行してみて、CloudTrailから確認してみる?
- "一時的セキュリティ認証情報を使用する" にあるように、principalは設定したRoleのArnになるはず。これは想定通り。

”EC2に設定したRoleを使用して、AOSSのCollectionにコマンドを実行する”がやりたいこと

以下を実行し、403の結果を得る。
curl -f -i -XPUT https://elsr0ctq1iahzudeevjk.ap-northeast-1.aoss.amazonaws.com/test-index
[ec2-user@ip-10-1-134-29 ~]$ curl -f -i -XPUT https://<endpoint>.ap-northeast-1.aoss.amazonaws.com/test-index
HTTP/1.1 403 Forbidden
x-request-id: 2abe03b4-b0a0-9435-aaa2-876d3f7e06c8
content-length: 121
x-aoss-response-hint: X01:gw-helper-deny
content-type: application/json
date: Mon, 12 Aug 2024 08:05:53 GMT
server: aoss-amazon

curlで署名するときの参考

サポートされている OpenSearch API オペレーション

以下サイトを参考に情報取得
IMDSv2のトークンを取得する
token=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 300")
ロール名を取得する
role=$(curl -s -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/iam/security-credentials/)
ロール名を指定してcrednetialを取得する
credential=$(curl -s -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/iam/security-credentials/${role})
トークンを取得して環境変数に設定する
AWS_SESSION_TOKEN=$(echo $credential | python3 -c 'import json; print(json.loads(input())["Token"])')

以下と上記を参考に書き換え
環境変数設定
token=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 300")
role=$(curl -s -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/iam/security-credentials/)
credential=$(curl -s -H "X-aws-ec2-metadata-token: $token" http://169.254.169.254/latest/meta-data/iam/security-credentials/${role})
AWS_ACCESS_KEY_ID=`echo $credential | jq -r ".AccessKeyId"`
AWS_SECRET_ACCESS_KEY=`echo $credential | jq -r ".SecretAccessKey"`
AWS_SESSION_TOKEN=`echo $credential | jq -r ".Token"`
REGION="ap-northeast-1"
SERVICE="aoss"

AOSSへ実行するコマンドの作成。
Index作成
curl -k -XPUT -H "Content-Type: application/json" 'https://<endointid>.ap-northeast-1.aoss.amazonaws.com/test-index0' -H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}" \
--aws-sigv4 "aws:amz:${REGION}:${SERVICE}" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}"
{"acknowledged":true,"shards_acknowledged":true,"index":"test-index0"}
Index一覧取得
curl -k -XGET -H "Content-Type: application/json" 'https://<endpointid>.ap-northeast-1.aoss.amazonaws.com/_cat/indices' -H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}" \
--aws-sigv4 "aws:amz:${REGION}:${SERVICE}" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}"
test-index0 iDq0RZEBbdW4ZCLmWBFW 0 0 0b 0b
上記で問題なく実行できた

以下でIndexを作成する
curl -f -k -XPUT \
-H "Content-Type: application/json" \
-H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}" \
--aws-sigv4 "aws:amz:${REGION}:${SERVICE}" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
-d "{"settings":{"index":{"knn":true,"knn.algo_param.ef_search":512}},"mappings":{"properties":{"test-index":{"type":"knn_vector","dimension":1536,"method":{"name":"hnsw","engine":"faiss","parameters":{"m":16,"ef_construction":512},"space_type":"l2"}},"AMAZON_BEDROCK_METADATA":{"type":"text","index":"false"},"AMAZON_BEDROCK_TEXT_CHUNK":{"type":"text","index":"true"}}}}" \
'https://<endpointid>.ap-northeast-1.aoss.amazonaws.com/test-index'
curl: (22) The requested URL returned error: 403
原因を確認する。コマンドなにか間違ってる?

コンソールから以下を参照
curl -H "Content-Type: application/json" -X PUT https://xxx.ap-northeast-1.aoss.amazonaws.com/test-index
{
"settings": {
"index": {
"knn": true,
"knn.algo_param.ef_search": 512
}
},
"mappings": {
"properties": {
"bedrock-knowledge-base-default-index": {
"type": "knn_vector",
"dimension": 512,
"method": {
"name": "hnsw",
"engine": "faiss",
"parameters": {
"m": "16",
"ef_construction": "512"
},
"space_type": "l2"
}
}
}
}
}

以下は可能。ただ、-d をつけるとできない。エンドポイントの指定が間違っている?
- GET <index>
- PUT <index>
以下でMappingの情報が取れているので、エンドポイントの指定は間違っていない??
curl -k -XGET -H "Content-Type: application/json" 'https://<endpointID>.ap-northeast-1.aoss.amazonaws.com/test-index/_mapping' -H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}" \
--aws-sigv4 "aws:amz:${REGION}:${SERVICE}" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}"

以下のHeaderが足りなかった模様。とりあえず、コンテンツを変換して直書きして実行。
X-Amz-Content-Sha256
問題なく作成完了。
curl -v -k -X PUT 'https://<endpointID>.ap-northeast-1.aoss.amazonaws.com/test-index' \
-H "Content-Type: application/json" \
-H "X-Amz-Content-Sha256: 6dc7b8891721a27cc7c03447c696fd991d591b609152bf20b564a4fa2c6b52d6" \
-H "X-Amz-Security-Token: ${AWS_SESSION_TOKEN}" \
--aws-sigv4 "aws:amz:${REGION}:${SERVICE}" \
--user "${AWS_ACCESS_KEY_ID}:${AWS_SECRET_ACCESS_KEY}" \
-d '{"settings":{"index":{"knn":true,"knn.algo_param.ef_search":512}},"mappings":{"properties":{"test-index":{"type":"knn_vector","dimension":1536,"method":{"name":"hnsw","engine":"faiss","parameters":{"m":16,"ef_construction":512},"space_type":"l2"}},"AMAZON_BEDROCK_METADATA":{"type":"text","index":"false"},"AMAZON_BEDROCK_TEXT_CHUNK":{"type":"text","index":"true"}}}}'

BedrockのKBで作成完了。
このスクラップは2024/08/14にクローズされました