

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 讓即時推論容器使用私有 Docker 登錄檔
<a name="your-algorithms-containers-inference-private"></a>

Amazon SageMaker AI 託管可讓您使用儲存在 Amazon ECR 中的映像，依預設值建置即時推論容器。或者，您可以從私有 Docker 登錄檔中的映像建立即時推論容器。私有登錄檔必須可以從您帳戶中的 Amazon VPC 存取。您基於私有 Docker 登錄檔中儲存的映像建立的模型須設定為連線至可存取私有 Docker 登錄檔的相同 VPC。如需將您的模型連線至 VPC 的資訊，請參閱[讓 SageMaker AI 託管的端點可以存取 Amazon VPC 中的資源](host-vpc.md)。

Docker 登錄檔須使用來自已知公有憑證授權單位 (CA) 的 TLS 憑證來保護。

**注意**  
您的私有 Docker 登錄檔須允許來自您在 VPC 組態中為模型指定的安全群組的傳入流量，以便 SageMaker AI 託管能夠從登錄檔中提取模型映像。  
如果您的 VPC 內有通往開放網際網路的路徑，SageMaker AI 可以從 DockerHub 提取模型映像。

**Topics**
+ [將映像儲存在 Amazon Elastic Container Registry 以外的私有 Docker 登錄檔中](#your-algorithms-containers-inference-private-registry)
+ [使用來自私有 Docker 登錄檔的映像進行即時推論](#your-algorithms-containers-inference-private-use)
+ [允許 SageMaker AI 向私有 Docker 登錄檔進行驗證](#inference-private-docker-authenticate)
+ [建立 Lambda 函式](#inference-private-docker-lambda)
+ [將您的執行角色許可給予 Lambda](#inference-private-docker-perms)
+ [為 Lambda 建立介面 VPC 端點](#inference-private-docker-vpc-interface)

## 將映像儲存在 Amazon Elastic Container Registry 以外的私有 Docker 登錄檔中
<a name="your-algorithms-containers-inference-private-registry"></a>

若要使用私有 Docker 登錄檔儲存您的映像以供 SageMaker AI 即時推論使用，請建立可從 Amazon VPC 存取的私有登錄檔。如需建立 Docker 登錄檔的相關資訊，請參閱 Docker 文件中的[部署登錄伺服器](https://docs.docker.com/registry/deploying/)。Docker 登錄檔須符合下列規定：
+ 登錄檔須為 [Docker 登錄檔 HTTP API V2](https://docs.docker.com/registry/spec/api/) 登錄檔。
+ Docker 登錄檔須可從您在建立模型時指定的 `VpcConfig` 參數中指定的相同 VPC 存取。

## 使用來自私有 Docker 登錄檔的映像進行即時推論
<a name="your-algorithms-containers-inference-private-use"></a>

建立模型並將其部署到 SageMaker AI 託管時，您可以指定該模型使用私有 Docker 登錄檔中的映像來建置推論容器。在傳遞給 [create\$1model](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.create_model) 函式呼叫的 `PrimaryContainer` 參數中的 `ImageConfig` 物件中指定此值。

**若要將儲存在私有 Docker 登錄檔中的映像用於推論容器**

1. 建立映像組態物件，並為 `RepositoryAccessMode` 欄位指定 `Vpc` 的值。

   ```
   image_config = {
                       'RepositoryAccessMode': 'Vpc'
                  }
   ```

1. 如果您的私有 Docker 登錄檔需要驗證，請將 `RepositoryAuthConfig` 物件新增至映像組態物件。針對 `RepositoryAuthConfig` 物件的 `RepositoryCredentialsProviderArn` 欄位，指定 函數的 Amazon Resource Name (ARN)，該 AWS Lambda 函數提供登入資料，允許 SageMaker AI 驗證您的私有 Docker 登錄檔。如需如何建立 Lambda 函式以提供驗證的相關資訊，請參閱[允許 SageMaker AI 向私有 Docker 登錄檔進行驗證](#inference-private-docker-authenticate)。

   ```
   image_config = {
                       'RepositoryAccessMode': 'Vpc',
                       'RepositoryAuthConfig': {
                          'RepositoryCredentialsProviderArn': 'arn:aws:lambda:Region:Acct:function:FunctionName'
                        }
                  }
   ```

1. 使用您在上一步建立的映像組態物件，建立要傳遞至 `create_model` 的主要容器物件。

   以[摘要](https://docs.docker.com/engine/reference/commandline/pull/#pull-an-image-by-digest-immutable-identifier)形式提供您的映像。如果您使用 `:latest` 標籤提供映像，則 SageMaker AI 可能會提取比預期更新的映像版本。使用摘要表單，確保 SageMaker AI 提取預期的映像版本。

   ```
   primary_container = {
       'ContainerHostname': 'ModelContainer',
       'Image': 'myteam.myorg.com/docker-local/my-inference-image:<IMAGE-TAG>',
       'ImageConfig': image_config
   }
   ```

1. 指定模型名稱與您要傳遞至 `create_model` 的執行角色。

   ```
   model_name = 'vpc-model'
   execution_role_arn = 'arn:aws:iam::123456789012:role/SageMakerExecutionRole'
   ```

1. 為您的模型的 VPC 組態指定一個或多個安全群組和子網路。私有 Docker 登錄檔須允許來自您指定的安全性群組的傳入流量。您指定的子網路須與私有 Docker 登錄檔位於同一 VPC 中。

   ```
   vpc_config = {
       'SecurityGroupIds': ['sg-0123456789abcdef0'],
       'Subnets': ['subnet-0123456789abcdef0','subnet-0123456789abcdef1']
   }
   ```

1. 取得 Boto3 SageMaker AI 用戶端。

   ```
   import boto3
   sm = boto3.client('sagemaker')
   ```

1. 呼叫 `create_model` 來建立模型，使用您在上一步為 `PrimaryContainer` 和 `VpcConfig` 參數指定的值。

   ```
   try:
       resp = sm.create_model(
           ModelName=model_name,
           PrimaryContainer=primary_container,
           ExecutionRoleArn=execution_role_arn,
           VpcConfig=vpc_config,
       )
   except Exception as e:
       print(f'error calling CreateModel operation: {e}')
   else:
       print(resp)
   ```

1. 最後，使用您在上一步建立的模型，呼叫 [create\$1endpoint\$1config](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.create_endpoint_config) 和 [create\$1endpoint](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.create_endpoint) 來建立託管端點。

   ```
   endpoint_config_name = 'my-endpoint-config'
   sm.create_endpoint_config(
       EndpointConfigName=endpoint_config_name,
       ProductionVariants=[
           {
               'VariantName': 'MyVariant',
               'ModelName': model_name,
               'InitialInstanceCount': 1,
               'InstanceType': 'ml.t2.medium'
           },
       ],
   )
   
   endpoint_name = 'my-endpoint'
   sm.create_endpoint(
       EndpointName=endpoint_name,
       EndpointConfigName=endpoint_config_name,
   )
   
   sm.describe_endpoint(EndpointName=endpoint_name)
   ```

## 允許 SageMaker AI 向私有 Docker 登錄檔進行驗證
<a name="inference-private-docker-authenticate"></a>

若要從需要身分驗證的私有 Docker 登錄檔提取推論映像，請建立提供登入資料的 AWS Lambda 函數，並在您呼叫 [create\$1model](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.create_model) 時提供 Lambda 函數的 Amazon Resource Name (ARN)。SageMaker AI 執行 `create_model` 時，會呼叫您指定的 Lambda 函式，以取得憑證向您的 Docker 登錄檔驗證。

## 建立 Lambda 函式
<a name="inference-private-docker-lambda"></a>

建立 AWS Lambda 函數，以傳回具有下列格式的回應：

```
def handler(event, context):
   response = {
      "Credentials": {"Username": "username", "Password": "password"}
   }
   return response
```

視您為私有 Docker 登錄檔設定驗證的方式而定，Lambda 函式傳回的憑證可能表示下列其中一項：
+ 如果您將私有 Docker 登錄檔設置為使用基本驗證，請提供登入的憑據以向登錄檔進行驗證。
+ 如果您將私有 Docker 登錄檔設置為使用承載權杖驗證，則登入憑證將傳送至您的授權伺服器，該伺服器傳回可用於驗證私有 Docker 登錄檔的承載權杖。

## 將您的執行角色許可給予 Lambda
<a name="inference-private-docker-perms"></a>

您用來呼叫 的執行角色`create_model`必須具有呼叫 AWS Lambda 函數的許可。將以下內容新增到執行角色的許可政策中。

```
{
    "Effect": "Allow",
    "Action": [
        "lambda:InvokeFunction"
    ],
    "Resource": [
        "arn:aws:lambda:*:*:function:*myLambdaFunction*"
    ]
}
```

當 *myLambdaFunction *是您的 Lambda 函式的名稱。如需編輯角色許可政策的資訊，請參閱 *AWS Identity and Access Management 使用者指南*中的[修改角色許可政策 (主控台)](https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-managingrole-editing-console.html#roles-modify_permissions-policy)。

**注意**  
連接 `AmazonSageMakerFullAccess` 受管政策的執行角色有許可能夠呼叫任何在名稱中含有 **SageMaker** 的 Lambda 函式。

## 為 Lambda 建立介面 VPC 端點
<a name="inference-private-docker-vpc-interface"></a>

建立介面端點，以便 Amazon VPC 可以與您的 AWS Lambda 函式通訊，而不必透過網際網路傳送流量。如需此使用方法的資訊，請參閱 *AWS Lambda 開發人員指南*中的[設定 Lambda 的介面 VPC 端點](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc-endpoints.html)。

SageMaker AI 託管會透過您的 VPC 傳送請求至 `lambda.region.amazonaws.com`，以呼叫您的 Lambda 函式。如果您在建立介面端點時選擇私有 DNS 名稱，Amazon Route 53 會將呼叫路由至 Lambda 介面端點。如果您使用不同的 DNS 提供者，請務必將 `lambda.region.amazonaws.com` 對應到您的 Lambda 介面端點。