在Sagemaker Endpoint上部署的Docker容器中使用boto3下载文件

时间:2019-07-01 11:59:25

标签: python-3.x amazon-web-services boto3 amazon-sagemaker

我已经构建了自己的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)'))

感谢您的帮助!

2 个答案:

答案 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服务。

AWS Sagemaker UI Network Isolation set to False