使用boto3创建SageMaker模型时如何指定证书颁发机构
我们需要基于私有Artifactory中存储的容器镜像,使用boto3创建SageMaker模型,目前已经参考官方文档完成了基础访问凭证配置,但始终找不到传入自定义证书颁发机构(CA)、或配置忽略SSL校验的入口。
使用的模型创建代码如下:
import boto3 client = boto3.client('sagemaker') response = client.create_model( ModelName='model-name', PrimaryContainer={ 'Image': 'local-repo.my_artifactory_endpoint/train:latest', 'ImageConfig': { 'RepositoryAccessMode': 'Vpc', }, 'Environment': { 'SAGEMAKER_PROGRAM': 'train.py', "SAGEMAKER_SUBMIT_DIRECTORY": "/opt/ml/model/code", "SAGEMAKER_CONTAINER_LOG_LEVEL": "20", "SAGEMAKER_REGION": <my-region>, "MMS_DEFAULT_RESPONSE_TIMEOUT": "500" } }, ExecutionRoleArn=<my-role>, VpcConfig={ 'SecurityGroupIds': [ ... ], 'Subnets': [ ... ] }, EnableNetworkIsolation=False )
模型创建完成后,基于该模型创建端点时触发如下报错:
Attempt to pull model image local-repo.my_artifactory_endpoint/train:latest failed due to error constructing client to call registry: constructing authentication challenge manager: Get "https://local-repo.my_artifactory_endpoint/v2/": x509: certificate signed by unknown authority.
SageMaker的create_model接口本身没有提供传入自定义CA证书、或关闭SSL证书校验的参数,不用在API配置项里浪费时间找相关字段。这个报错的本质是SageMaker托管的镜像拉取组件,默认只信任公网根证书库,你私有Artifactory使用的自签/私有CA签发的证书不在信任列表中,可通过以下两种方式解决:
方案1(生产环境推荐):替换Artifactory的服务端证书为公有可信CA签发证书
给Artifactory绑定公网信任CA签发的域名证书(比如ACM公开证书、Let's Encrypt证书均可),确保证书链完整配置在Artifactory或其前置的负载均衡监听器上。只要SageMaker部署所在VPC能正常解析Artifactory域名、网络连通,不需要修改任何现有SageMaker创建代码,即可正常拉取镜像。方案2(内网合规场景):关联ACM私有CA到部署VPC
如果合规要求必须使用私有证书,先把你内部的自定义CA证书导入到ACM私有CA服务,再将该私有CA关联到SageMaker模型部署所在的VPC。关联完成后,VPC内的AWS托管服务(包括SageMaker镜像拉取组件)会自动信任该私有CA签发的所有证书,同样不需要修改create_model的请求参数。
❌ 以下是验证过无效的方案,不用浪费时间测试:
- 把自定义CA证书打包到模型镜像内:镜像拉取动作发生在镜像文件下载到主机之前,根本无法读取镜像内部存储的证书文件
- 在VPC内的EC2实例上配置系统级CA信任:SageMaker镜像拉取逻辑运行在AWS托管的控制面组件上,和你VPC内自有的EC2实例信任存储完全隔离
- 找API参数配置跳过SSL校验:官方从未开放过这个不安全的配置项,不存在相关字段
内容的提问来源于stack exchange,提问作者isabel simon

