首页 > 解决方案 > AWS SageMaker S3 os.listdir() 访问被拒绝

问题描述

我被难住了。

我将我的 TensorFlow 模型移到 SageMaker 中进行试用。我将自己的数据放入 s3 存储桶中,设置所有 IAM 角色/访问权限(或者我认为如此)。我可以从 s3 读取文件。我可以将新文件推送到 s3。我可以从我的 SageMaker 本地目录中读取本地目录。

我无法遍历我的 s3 存储桶目录。 我打开了日志记录,每当我尝试访问这种格式's3://my_bucketName_here/Directory_of_my_data/'的 URI 时,都会收到 AccessDenied 消息。

这是我所做的: 我已经确认我的笔记本使用了 AmazonSageMaker-ExecutionRole-*** 我已将 AmazonSageMakerFullAccess 策略添加到该默认角色我随后也添加了 AmazonS3FullAccess 策略

然后,我创建了一个存储桶策略,专门将特定存储桶上的 s3:* 访问权限授予该特定角色。

哎呀,我最终使用 ListObjects = Yes 公开了存储桶。

os.listdir() 只是因为找不到文件或目录而失败,并且使用 AccessDenied 创建了很多消息。(TensorFlow 库只是不起作用,所以我使用 os.listdir() 来简化事情。

最后,我从策略模拟器测试我的访问 - 我选择了上面提到的角色,选择了测试 s3 并选择了所有 69 个项目,它们都通过了。

但是我继续记录 AccessDenied 并且实际上无法从我的 SageMaker jupyter 笔记本中列出目录的内容。

我不知所措。想法?

编辑:根据下面的建议,我有以下内容:存储桶名称包含 sagemaker:'[redacted]-test-sagemaker' 公共访问已关闭,唯一的帐户是我的根帐户。 { "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:ListBucket" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::[redacted]-test-sagemaker" ] }, { "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Effect": "Allow", "Resource": [ "arn:aws:s3:::[redacted]-test-sagemaker/*" ] } ] } 和 arn:aws:iam::aws:policy/AmazonSageMakerFullAccess

最后上面失败后的桶策略: { "Id": "Policy1534116031672", "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1534116026409", "Action": "s3:*", "Effect": "Allow", "Resource": "arn:aws:s3:::[redacted]-test-sagemaker", "Principal": { "AWS": [ "arn:aws:iam::[id]:role/service-role/AmazonSageMaker-ExecutionRole-***" ] } } ] }

标签: amazon-web-servicesamazon-s3jupyter-notebookamazon-sagemaker

解决方案


所以你需要排除故障。这里有几件事要检查:

0) 确保存储桶位于 SageMaker 区域。

1) 在您的存储桶名称中包含字符串“sagemaker”(例如,my_bucketName_here-sagemaker,SageMaker 可以开箱即用地访问以这种方式命名的存储桶。

2) 尝试使用 SageMaker S3 default_bucket()

import sagemaker
s = sagemaker.Session()
s.upload_data(path='somefile.csv', bucket=s.default_bucket(), key_prefix='data/train')

3) 在笔记本实例上打开终端,尝试在 bash 中使用 AWS CLI 列出您的存储桶:

aws iam get-user
aws s3 ls my_bucketName_here

最后,在您的问题中粘贴存储桶的访问和资源策略可以帮助其他人回答您。


推荐阅读