

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

# 为实时推理容器使用私有 Docker 注册表
<a name="your-algorithms-containers-inference-private"></a>

默认情况下， SageMaker Amazon AI 托管允许您使用存储在 Amazon ECR 中的图像来构建容器以进行实时推理。或者，您可以从私有 Docker 注册表中的映像来构建容器用于实时推理。私有注册表必须可以从您账户中的 Amazon VPC 访问。您基于存储在私有 Docker 注册表中的映像创建的模型，必须配置为连接到可以访问私有 Docker 注册表的同一个 VPC。有关连接到 VPC 中模型的更多信息，请参阅[让 SageMaker AI 托管的终端节点访问您的 Amazon VPC 中的资源](host-vpc.md)。

您的 Docker 注册表必须使用来自已知公共证书颁发机构 (CA) 的 TLS 证书进行保护。

**注意**  
您的私有 Docker 注册表必须允许来自您在模型的 VPC 配置中指定的安全组的入站流量，这样 SageMaker AI 托管才能从您的注册表中提取模型映像。  
SageMaker DockerHub 如果您的 VPC 内有通往开放互联网的路径，AI 可以从中提取模型图像。

**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 人工智能实时推断的图像，请创建一个可从您的 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`字段中，指定函数的亚马逊资源名称 (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 人工智能提取比预期更新的图像版本的风险。使用摘要表单可确保 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 人工智能客户端。

   ```
   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 时提供 Lambda 函数的亚马逊资源名称 (ARN)。](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/sagemaker.html#SageMaker.Client.create_model)当 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 接口端点。