背景
我在AWS中创建了一个S3桶,想在Sagemaker Notebook实例运行代码的时候,把这个S3桶作为存放数据集的地方,我确定创建S3桶的区域和Sagemaker Notebook的区域是相同的。
Newbing告诉我,可以在打开Sagemaker Notebook之后在Jupyter Notebook里运行
import boto3
s3 = boto3.client('s3')
s3.head_bucket(Bucket='XXX')
方法来检查您是否有访问指定存储桶的权限,其中 XXX 是存储桶的名称。如果您有访问存储桶的权限,您会得到一个空的响应。如果您没有访问存储桶的权限,您会得到一个异常,如 ClientError 或 AccessDenied 。
结果在根据官方文档Creating a bucket - Amazon Simple Storage Service按照默认设置创建S3桶之后,我在Sagemaker notebook中报错:
ClientError: An error occurred (403) when calling the HeadBucket operation: Forbidden
简要解决方案
在创建S3桶的时候在存储桶的名称前面加上'sagemaker' 。例如本来S3桶名称叫‘XXX’。改成'sagemaker-XXX'。
之后再运行sagemaker.list_notebook_instances('sagemaker-XXX')就不会报错ClientError,能够有权限访问了。
补充
Newbing给出的其他可能有效的解决方案(之前问的我觉得回答跑题的就不展示了):
您好,这是Bing。感谢您的提问。根据我的搜索结果,您可能需要检查以下几点:
- 您的SageMaker笔记本实例是否与您自己创建的S3桶位于同一AWS区域1。
- 您的SageMaker执行角色是否具有访问您自己创建的S3桶的权限2。您可以通过附加S3FullAccess策略或将特定S3桶的权限限制为IAM角色来实现这一点3。
- 您自己创建的S3桶是否包含sagemaker这个名称1。如果不包含,您可能需要在创建笔记本实例时指定一个默认的S3存储桶1。
- 您是否正确地指定了训练数据集和输出数据的S3 URI路径2。您可以使用sagemaker.Session类和TrainingInput类来设置S3存储桶和前缀1。
其他
我感觉我创建桶的时候看文档也挺认真的,但是确实没有注意到要加'sagemaker'这件事。
我可能有理解有误的地方,欢迎小伙伴指正。如果有任何问题,欢迎评论区留言。