

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Conectores Amazon OpenSearch Service ML para Serviços da AWS
<a name="ml-amazon-connector"></a>

Ao usar conectores de aprendizado de máquina (ML) do Amazon OpenSearch Service com outros AWS service (Serviço da AWS), você precisa configurar uma função do IAM para conectar o serviço com segurança a esse OpenSearch serviço. Serviços da AWS que você pode configurar um conector para incluir o Amazon SageMaker AI e o Amazon Bedrock. Neste tutorial, abordamos como criar um conector do OpenSearch Service ao SageMaker Runtime. Para saber mais sobre conectores, consulte [Conectores compatíveis](https://opensearch.org/docs/latest/ml-commons-plugin/remote-models/connectors/#supported-connectors).

**Topics**
+ [Pré-requisitos](#connector-sagemaker-prereq)
+ [Crie um conector OpenSearch de serviço](#connector-sagemaker-create)

## Pré-requisitos
<a name="connector-sagemaker-prereq"></a>

Para criar um conector, você deve ter um endpoint do Amazon SageMaker AI Domain e uma função do IAM que conceda acesso ao OpenSearch serviço. 

### Configurar um domínio Amazon SageMaker AI
<a name="connector-sagemaker"></a>

Consulte [Implantar um modelo na Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-deployment.html) no *Amazon SageMaker AI Developer Guide* para implantar seu modelo de aprendizado de máquina. Observe o URL do endpoint do seu modelo, que você precisa para criar um conector de IA.

### Criar um perfil do IAM
<a name="connector-sagemaker-iam"></a>

Configure uma função do IAM para delegar permissões SageMaker de tempo de execução ao OpenSearch serviço. Para criar um novo perfil, consulte [Como criar um perfil do IAM (console)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console) no *Guia do usuário do IAM*. Opcionalmente, você pode usar um perfil existente, desde que tenha o mesmo conjunto de privilégios. Se você criar uma nova função em vez de usar uma função AWS gerenciada, substitua `opensearch-sagemaker-role` neste tutorial pelo nome da sua própria função.

1. Anexe a seguinte política gerenciada de IAM à sua nova função para permitir que o OpenSearch Serviço acesse seu endpoint de SageMaker IA. Para anexar uma política ao perfil, consulte [Como adicionar permissões de identidade do IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console). 

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {   
               "Action": [
                   "sagemaker:InvokeEndpointAsync",
                   "sagemaker:InvokeEndpoint"
               ],
               "Effect": "Allow",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. Siga as instruções em [Modificação da política de confiança de um perfil](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-managingrole_edit-trust-policy) para editar a relação de confiança do perfil. Na política a seguir, {{service-principal}} substitua por um dos seguintes princípios de serviço para OpenSearch Service ou OpenSearch Serverless:  
**Para OpenSearch serviço**  
`opensearchservice.amazonaws.com`  
**Para OpenSearch servidores sem servidor**  
`ml.opensearchservice.amazonaws.com`

------
#### [ JSON ]

****  

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

------

   Recomendamos que você use as chaves de condição `aws:SourceAccount` e `aws:SourceArn` para limitar o acesso a um domínio específico. `SourceAccount`É o Conta da AWS ID que pertence ao proprietário do domínio e `SourceArn` o ARN do domínio. Por exemplo, você pode adicionar o bloco de condições a seguir na política de confiança: 

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

### Configurar permissões do
<a name="connector-sagemaker-permissions"></a>

Para criar o conector, você precisa de permissão para passar a função do IAM para o OpenSearch Serviço. Você também precisa de acesso à ação `es:ESHttpPost`. Para conceder ambas as permissões, anexe a seguinte política ao perfil do IAM cujas credenciais estão sendo usadas para assinar a solicitação:

------
#### [ 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}}/*"
        }
    ]
}
```

------

Se seu usuário ou função não tiver permissões `iam:PassRole` para passar sua função, talvez você encontre o seguinte erro de autorização ao tentar registrar um repositório na próxima etapa.

### Mapeie a função de ML em OpenSearch painéis (se estiver usando controle de acesso refinado)
<a name="connector-sagemaker-fgac"></a>

Fine-grained o controle de acesso introduz uma etapa adicional ao configurar um conector. Mesmo que você use a autenticação básica HTTP para todos os outros fins, será necessário mapear o perfil `ml_full_access` para o seu perfil do IAM que tem permissões `iam:PassRole` para passar `opensearch-sagemaker-role`.

1. Navegue até o plug-in OpenSearch Dashboards do seu domínio OpenSearch de serviço. Você pode encontrar o endpoint do Dashboards no painel do seu domínio no console de OpenSearch serviços. 

1. No menu principal, escolha **Segurança**, **Funções** e selecione a função **ml\_full\_access**.

1. Escolha **Usuários mapeados** e **Gerenciar mapeamento**. 

1. Em **Funções de backend**, adicione o ARN da função que tem permissão para aprovar `opensearch-sagemaker-role`.

   ```
   arn:aws:iam::{{account-id}}:role/{{role-name}}
   ```

1. Selecione **Mapa** e confirme se o usuário ou função aparece em **Usuários mapeados**.

## Crie um conector OpenSearch de serviço
<a name="connector-sagemaker-create"></a>

Para criar um conector, envie uma `POST` solicitação para o endpoint do domínio OpenSearch Service. Você pode usar curl, o cliente Python de amostra, o Postman ou outro método para enviar uma solicitação assinada. Você não pode usar uma solicitação `POST` no console do Kibana. A solicitação assume o seguinte formato:

```
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}\" } }"
      }
   ]
}
```

Se o domínio residir em uma nuvem privada virtual (VPC), o computador deverá estar conectado à VPC para que a solicitação crie o conector de IA com êxito. O acesso a uma VPC varia de acordo com a configuração de rede, mas geralmente requer uma conexão com VPN ou rede corporativa. Para verificar se você pode acessar seu domínio OpenSearch de serviço, navegue até `https://{{your-vpc-domain}}.{{region}}.es.amazonaws.com` em um navegador da Web e verifique se você recebeu a resposta JSON padrão.

### Exemplo de cliente do Python
<a name="connector-sagemaker-python"></a>

O cliente Python é mais simples de automatizar que uma solicitação HTTP, além de ser mais fácil reutilizá-lo. Para criar o conector AI com o cliente Python, salve o código de exemplo a seguir em um arquivo Python. O cliente requer os pacotes [AWS SDK para Python (Boto3)](https://aws.amazon.com/sdk-for-python/), [https://requests.readthedocs.io/en/latest/](https://requests.readthedocs.io/en/latest/) e [https://pypi.org/project/requests-aws4auth/](https://pypi.org/project/requests-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)
```