View a markdown version of this page

亚马逊 OpenSearch 服务 ML 连接器适用于 AWS 服务 - 亚马逊 OpenSearch 服务

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

亚马逊 OpenSearch 服务 ML 连接器适用于 AWS 服务

当您将亚马逊 OpenSearch 服务机器学习 (ML) 连接器与其他连接器一起使用时 AWS 服务,您需要设置 IAM 角色以安全地将 OpenSearch 服务连接到该服务。 AWS 服务 你可以设置一个连接器来包括亚马逊 SageMaker AI 和亚马逊 Bedrock。在本教程中,我们将介绍如何创建从 OpenSearch 服务到 SageMaker 运行时的连接器。有关连接器的更多信息,请参阅受支持的连接器

先决条件

要创建连接器,您必须拥有一个 SageMaker Amazon AI 域终端节点和一个授予 OpenSearch 服务访问权限的 IAM 角色。

设置亚马逊 A SageMaker I 域

请参阅《亚马逊 SageMaker AI 开发者指南》中的 “在亚马逊 SageMaker AI 中部署模型” 以部署您的机器学习模型。记下模型的端点 URL,这是创建 AI 连接器所必需的。

创建一个 IAM 角色

设置 IAM 角色以向 OpenSearch 服务委派 SageMaker 运行时权限。要创建新角色,请参阅 IAM 用户指南中的创建 IAM 角色(控制台)。或者,您可以使用现有角色,前提是该角色具有相同的权限集。如果您创建了新角色而不是使用 AWS 托管角色,请在本教程opensearch-sagemaker-role中用您自己的角色名称替换。

  1. 将以下托管 IAM 策略附加到您的新角色,以允许 S OpenSearch ervice 访问您的 SageMaker AI 终端节点。要将策略附加到角色,请参阅添加 IAM 身份权限

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Action": [ "sagemaker:InvokeEndpointAsync", "sagemaker:InvokeEndpoint" ], "Effect": "Allow", "Resource": "*" } ] }
  2. 按照修改角色信任策略中的说明编辑角色的信任关系。在以下策略中,将服务或 OpenSearch 无服务器的服务主体替换service-principal为以下 OpenSearch 服务主体之一:

    用于 OpenSearch 服务

    opensearchservice.amazonaws.com.rproxy.goskope.comes.amazonaws.com

    适用于 OpenSearch 无服务器

    ml.opensearchservice.amazonaws.com

    JSON
    { "Version":"2012-10-17", "Statement": [ { "Action": [ "sts:AssumeRole" ], "Effect": "Allow", "Principal": { "Service": [ "ml.opensearchservice.amazonaws.com" ] } } ] }

    建议您使用aws:SourceAccountaws:SourceArn条件密钥来限制对某个具体域的访问。SourceAccount是属于域名所有者的 AWS 账户 ID,SourceArn是域名的 ARN。例如,您可以将以下条件块添加到信任策略:

    "Condition": { "StringEquals": { "aws:SourceAccount": "account-id" }, "ArnLike": { "aws:SourceArn": "arn:aws:es:region:account-id:domain/domain-name" } }

配置 权限

要创建连接器,您需要权限才能将 IAM 角色传递给 OpenSearch 服务。还需要对 es:ESHttpPost 操作的访问权限。要授予这两个权限,请将以下策略附加到 IAM 角色,该角色的凭据用于签署请求:

JSON
{ "Version":"2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::111122223333:role/opensearch-sagemaker-role" }, { "Effect": "Allow", "Action": "es:ESHttpPost", "Resource": "arn:aws:es:us-east-1:111122223333:domain/domain-name/*" } ] }

如果您的用户或角色没有 iam:PassRole 权限传递您的角色,则在下一步骤中尝试注册存储库时,您可能会遇到授权错误:

在 OpenSearch 仪表板中映射 ML 角色(如果使用精细的访问控制)

Fine-grained 设置连接器时,访问控制引入了额外的步骤。即使将 HTTP 基本身份验证用于所有其他目的,也需要将 ml_full_access 角色映射到具有传递 opensearch-sagemaker-roleiam:PassRole 权限的 IAM 角色。

  1. 导航到您的 OpenSearch 服务域的 OpenSearch 仪表板插件。您可以在 OpenSearch 服务控制台的域名仪表板上找到控制面板终端节点。

  2. 从主菜单中选择安全角色,然后选择 ml_full_access 角色。

  3. 选择映射的用户管理映射

  4. 后端角色下,添加具有传递 opensearch-sagemaker-role 权限的角色的 ARN。

    arn:aws:iam::account-id:role/role-name
  5. 选择映射并确认在映射的用户下显示的用户或角色。

创建 OpenSearch 服务连接器

要创建连接器,请向 OpenSearch 服务域端点发送POST请求。您可以使用 curl、示例 Python 客户端、Postman 或其他方法来发送已签名的请求。请注意,您无法在 Kibana 控制台中使用 POST 请求。 请求的格式如下:

POST domain-endpoint/_plugins/_ml/connectors/_create { "name": "sagemaker: embedding", "description": "Test connector for Sagemaker embedding model", "version": 1, "protocol": "aws_sigv4", "credential": { "roleArn": "arn:aws:iam::account-id:role/opensearch-sagemaker-role" }, "parameters": { "region": "region", "service_name": "sagemaker" }, "actions": [ { "action_type": "predict", "method": "POST", "headers": { "content-type": "application/json" }, "url": "https://runtime.sagemaker.region.amazonaws.com/endpoints/endpoint-id/invocations", "request_body": "{ \"inputs\": { \"question\": \"${parameters.question}\", \"context\": \"${parameters.context}\" } }" } ] }

如果域位于某个虚拟私有云 (VPC) 中,则必须将您的电脑连接到该 VPC,请求才能成功创建 AI 连接器。访问 VPC 因网络配置而异,但通常包括连接到 VPN 或企业网络。要检查您是否可以访问您的 OpenSearch 服务域,请在网络浏览器https://your-vpc-domain.region.es.amazonaws.com中导航到并验证您是否收到默认 JSON 响应。

示例 Python 客户端

Python 客户端比 HTTP 请求更容易自动化,且具有更好的可重用性。要使用 Python 客户端创建 AI 连接器,请将以下示例代码保存到 Python 文件中。客户端需要 适用于 Python (Boto3) 的 AWS SDKrequestsrequests-aws4auth 程序包。

import boto3 import requests from requests_aws4auth import AWS4Auth host = 'domain-endpoint/' region = 'region' service = 'es' credentials = boto3.Session().get_credentials() awsauth = AWS4Auth(credentials.access_key, credentials.secret_key, region, service, session_token=credentials.token) # Register repository path = '_plugins/_ml/connectors/_create' url = host + path payload = { "name": "sagemaker: embedding", "description": "Test connector for Sagemaker embedding model", "version": 1, "protocol": "aws_sigv4", "credential": { "roleArn": "arn:aws:iam::account-id:role/opensearch-sagemaker-role" }, "parameters": { "region": "region", "service_name": "sagemaker" }, "actions": [ { "action_type": "predict", "method": "POST", "headers": { "content-type": "application/json" }, "url": "https://runtime.sagemaker.region.amazonaws.com/endpoints/endpoint-id/invocations", "request_body": "{ \"inputs\": { \"question\": \"${parameters.question}\", \"context\": \"${parameters.context}\" } }" } ] } headers = {"Content-Type": "application/json"} r = requests.post(url, auth=awsauth, json=payload, headers=headers) print(r.status_code) print(r.text)

注册模型以进行语义搜索

如果您计划使用连接模型进行语义搜索,则在注册模型时必须包含该model_config参数。如果没有此参数,语义字段索引创建将失败,并显示错误 “远程模型 [model_id] 的模型配置为空”。

在您的注册模型请求中包含一个model_config对象:

POST _plugins/_ml/models/_register { "name": "Bedrock embedding model", "function_name": "remote", "connector_id": "connector_id", "model_config": { "model_type": "TEXT_EMBEDDING", "embedding_dimension": 1536, "framework_type": "SENTENCE_TRANSFORMERS", "additional_config": { "space_type": "l2" } } }

embedding_dimension替换为模型输出维度(例如,亚马逊 Titan Embeddings 为 1536)。有关支持的空间类型的信息,请参阅亚马逊 OpenSearch 服务中的 k-nn 搜索。