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

Jan*_*ram 5 amazon-web-services python-3.x 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)
Run Code Online (Sandbox Code Playgroud)

IAM 角色的策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::my-bucket/*"
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

在本地启动 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)'))
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏!

Jan*_*ram 0

对于遇到此问题的任何人,在创建模型时,“启用网络隔离”属性默认为 True。来自 AWS 文档:

如果您启用网络隔离,容器将无法进行任何出站网络调用,甚至无法调用其他 AWS 服务(例如 Amazon S3)。此外,没有 AWS 凭证可供容器运行时环境使用。

因此,需要将此属性设置为 False 才能连接到任何其他 AWS 服务。

AWS Sagemaker UI 网络隔离设置为 False