

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 用の Amazon OpenSearch Service ML コネクタ AWS のサービス
<a name="ml-amazon-connector"></a>

Amazon OpenSearch Service 機械学習 (ML) コネクタを別の で使用する場合は AWS のサービス、OpenSearch Service をそのサービスに安全に接続する IAM ロールを設定する必要があります。 AWS のサービス これにより、Amazon SageMaker AI と Amazon Bedrock を含めるようにコネクタを設定できます。このチュートリアルでは、OpenSearch Service から SageMaker ランタイムへのコネクタを作成する方法について説明します。コネクタの詳細については、「[Supported connectors](https://opensearch.org/docs/latest/ml-commons-plugin/remote-models/connectors/#supported-connectors)」を参照してください。

**Topics**
+ [

## 前提条件
](#connector-sagemaker-prereq)
+ [

## OpenSearch Service コネクタを作成する
](#connector-sagemaker-create)

## 前提条件
<a name="connector-sagemaker-prereq"></a>

コネクタを作成するには、Amazon SageMaker AI ドメインエンドポイント、および OpenSearch Service へのアクセスを付与する IAM ロールが必要です。

### Amazon SageMaker AI ドメインを設定する
<a name="connector-sagemaker"></a>

機械学習モデルをデプロイするには、「*Amazon SageMaker AI デベロッパーガイド*」の「[Deploy a Model in Amazon SageMaker AI](https://docs.aws.amazon.com/sagemaker/latest/dg/how-it-works-deployment.html)」を参照してください。AI コネクタを作成するために必要な、モデルのエンドポイント URL をメモしておきます。

### IAM ロールを作成する
<a name="connector-sagemaker-iam"></a>

IAM ロールを設定して、SageMaker ランタイムのアクセス許可を OpenSearch Service に委任します。新しいロールを作成するには、「*IAM ユーザーガイド*」の「[IAM ロールの作成 (コンソール)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html#roles-creatingrole-user-console)」を参照してください。なお、同じ権限セットを持っていれば、既存のロールを使用できます。 AWS マネージドロールを使用する代わりに新しいロールを作成する場合は、このチュートリアル`opensearch-sagemaker-role`の を独自のロールの名前に置き換えます。

1. 以下のマネージド IAM ポリシーを新しいロールにアタッチして、OpenSearch Service が SageMaker AI エンドポイントにアクセスできるようにします。ロールにポリシーをアタッチするには、「[Adding IAM identity permissions](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. ロールの信頼関係を編集するには、「[ロールの信頼ポリシーの変更](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-managingrole_edit-trust-policy)」の手順に従ってください。次のポリシーで、*service-principal* を OpenSearch Service または OpenSearch Serverless の次のいずれかのサービスプリンシパルに置き換えます。  
**OpenSearch Service の場合**  
`opensearchservice.amazonaws.com`  
**OpenSearch Serverless の場合**  
`ml.opensearchservice.amazonaws.com`

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

****  

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

------

   `aws:SourceAccount` および `aws:SourceArn` 条件キーを使用してアクセスを特定のドメインに制限することをおすすめします。`SourceAccount` はドメインの所有者に属する AWS アカウント ID で、 `SourceArn`はドメインの ARN です。例えば、次の条件ブロックを信頼ポリシーに追加できます。

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

### アクセス許可の設定
<a name="connector-sagemaker-permissions"></a>

コネクタを作成するには、IAM ロールを OpenSearch Service に渡すアクセス許可が必要です。さらに、`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 Dashboards に ML ロールをマッピングします (きめ細かなアクセスコントロールを使用している場合)
<a name="connector-sagemaker-fgac"></a>

きめ細かいアクセス制御では、コネクタの設定時に追加の手順が必要になります。HTTP 基本認証を他のすべての目的で使用する場合でも、`opensearch-sagemaker-role` を渡すための `iam:PassRole` 許可を持っている IAM ロールまたはユーザーに `ml_full_access` ロールをマップする必要があります。

1. OpenSearch Service ドメインの OpenSearch Dashboards プラグインに移動します。OpenSearch Service コンソールのドメインダッシュボードに Dashboards エンドポイントがあります。

1. メインメニューから [**セキュリティ**]、[**ロール**] を選択し、[**ml\$1full\$1access**] ロールを選択します。

1. **[マッピングされたユーザー]**、**[マッピングの管理]** を選択します。

1. **[バックエンドロール]** で、`opensearch-sagemaker-role` を渡すためのアクセス許可があるロールの ARN を追加します。

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

1. **[マップ]** を選択し、ユーザーまたはロールが **[マッピングされたユーザー]** の下に表示されていることを確認します。

## OpenSearch Service コネクタを作成する
<a name="connector-sagemaker-create"></a>

コネクタを作成するには、OpenSearch Service ドメインのエンドポイントに `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) に存在する場合は、リクエストが正常に AI コネクタを作成するにはコンピュータが VPC に接続されていることが必要です。VPC へのアクセスはネットワーク構成によって異なりますが、通常は VPN あるいは社内ネットワークへの接続が必要になります。OpenSearch Service ドメインにアクセスできるかを確認するには、ウェブブラウザで `https://your-vpc-domain.region.es.amazonaws.com` を開き、デフォルトの JSON 応答を受信していることを確認します。

### Python クライアントのサンプリング
<a name="connector-sagemaker-python"></a>

Python クライアントは、HTTP リクエストよりも自動化が簡単で、再利用性も高いです。Python クライアントで AI コネクタを作成するには、以下のサンプルコードを Python ファイルに保存します。このクライアントには [AWS SDK for Python (Boto3)](https://aws.amazon.com/sdk-for-python/)、[https://requests.readthedocs.io/en/latest/](https://requests.readthedocs.io/en/latest/)、[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)
```