我已经构建了自己的Docker容器,该容器提供推理代码以将其部署为Amazon Sagemaker上的端点。但是,此容器需要访问s3中的某些文件。使用过的IAM角色可以访问我尝试访问的所有s3存储桶。
使用boto3客户端下载文件的代码:
import boto3
model_bucket = 'my-bucket'
def download_file_from_s3(s3_path, local_path):
client = boto3.client('s3')
client.download_file(model_bucket, s3_path, local_path)
IAM角色的政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::my-bucket/*"
]
}
]
}
本地启动docker容器使我能够像预期的那样从s3下载文件。
在Sagemaker上部署为端点时,请求超时:
botocore.vendored.requests.exceptions.ConnectTimeout: HTTPSConnectionPool(host='my-bucket.s3.eu-central-1.amazonaws.com', port=443): Max retries exceeded with url: /path/to/my-file (Caused by ConnectTimeoutError(<botocore.awsrequest.AWSHTTPSConnection object at 0x7f66244e69b0>, 'Connection to my-bucket.s3.eu-central-1.amazonaws.com timed out. (connect timeout=60)'))
感谢您的帮助!
答案 0 :(得分:0)
出于安全原因,他们不允许它本地访问s3,因此需要将其连接到VPC https://docs.aws.amazon.com/sagemaker/latest/dg/host-vpc.html
答案 1 :(得分:0)
对于遇到此问题的任何人,在创建模型时,“启用网络隔离”属性默认为True。 来自AWS文档:
如果启用网络隔离,则容器将无法进行任何出站网络调用,即使是对其他AWS服务(如Amazon S3)也是如此。此外,没有AWS凭证可用于容器运行时环境。
因此,此属性需要设置为False才能连接到任何其他AWS服务。