Closed19

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

chittaichittai

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

  • EC2の作成
  • AOSSのVPCeの作成
chittaichittai

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

chittaichittai

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


chittaichittai

コマンドは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"}}}}
chittaichittai

次は、以下を確認する必要がある。

  • EC2からAOSSのCollectionに対する到達性
    • そのためのコマンド
chittaichittai

現時点で、自分がわかっていないこと

  • どうすれば、到達性が確認できるか
    • 今回、VPCeを経由してコマンドが実行できるケースを確認する。最終的にはインデックスを作成するのだが、現時点ではまずコマンドが実行できることを確認したい
    • 例として、EC2からVPCeでAOSSのコレクション一覧を確認するコマンドを実行して、結果が返ってくることを確認したい
  • コマンドについて
    • 今回、データアクセスポリシーでは、EC2に設定したロールをプリンシパルとして許可をしている。
    • どうすれば、許可されたプリンシパルからのコマンドになるのか。
chittaichittai

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

chittaichittai

以下を実行し、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
chittaichittai

以下サイトを参考に情報取得

https://atsum.in/aws/ec2-get-token/

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"])')
chittaichittai

以下と上記を参考に書き換え
https://qiita.com/docdocdoc/items/79837e33f2dd19d7038d

環境変数設定

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"
chittaichittai

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

上記で問題なく実行できた

chittaichittai

以下で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

原因を確認する。コマンドなにか間違ってる?

chittaichittai

コンソールから以下を参照

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"
        }
      }
    }
  }
}
chittaichittai

以下は可能。ただ、-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}"
chittaichittai

https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-clients.html#serverless-signing

https://github.com/abutaha/aws-es-proxy/issues/132

以下の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"}}}}'


このスクラップは2024/08/14にクローズされました