如何解决 Amazon SageMaker 训练作业中的 Amazon S3 AccessDenied 错误?

上次更新时间:2020 年 9 月 3 日

我的 Amazon SageMaker 训练作业失败且显示 AccessDenied 错误,即便已将 AmazonSageMakerFullAccess 策略附加到执行规则。

简短描述

AccessDenied 错误表示您的 AWS Identity and Access Management (IAM) 策略不允许以下一项或多项 Amazon Simple Storage Service (Amazon S3) 操作:

s3:ListBucket s3:GetObject s3:PutObject

您需要的权限取决于您调用的 SageMaker API。例如,CreateModel API 需要的唯一 Amazon S3 操作为 s3:GetObject。但是,CreateTrainingJob API 需要 s3:GetObject、s3:PutObject 和 s3:ListObject。有关每个 API 所需权限的更多信息,请参阅 SageMaker 规则。

解决方法

AccessDenied 错误通常在以下情况下发生。

已加密的输入存储桶

如果 S3 存储桶中的数据已使用 AWS Key Management Service (AWS KMS) 加密:

请确保附加到执行规则的 IAM 策略允许 kms:encrypt and kms:decrypt 操作。有关更多信息,请参阅 SageMaker 规则。 请确保 AWS KMS 密钥策略授予 IAM 角色访问权限。有关更多信息,请参阅使用 AWS KMS 中的密钥策略。 如果您在作业的资源配置中为机器学习 (ML) 存储卷指定 KMS 密钥,则 IAM 策略必须允许 kms:CreateGrant 操作。有关更多信息,请参阅使用授权。有关加密 ML 存储卷的更多信息,请参阅使用加密保护静态数据。

权限边界

如果您为执行角色定义权限边界,则 SageMaker 仅可执行 IAM 策略和权限边界都允许的操作。请确保 IAM 策略和权限边界均允许所需的 Amazon S3 操作。

存储桶策略

如果输入存储桶使用存储桶策略,请确保存储桶策略允许执行角色执行所需的 Amazon S3 操作。有关存储桶策略的更多信息,请参阅 Amazon S3 中的策略和权限。

以下示例中的存储桶策略拒绝访问 SageMaker 执行角色,导致出现 AccessDenied 错误:

{
    "Version": "2012-10-17",
    "Id": "ExamplePolicy01",
    "Statement": ,
            "Resource": 
        }
    ]
}

跨账户 Amazon S3 访问

如果不同的 AWS 账户拥有 Amazon S3 数据:

请确保两个账户均可访问 AWS KMS 客户主密钥 (CMK)。如果您没有为训练作业指定 CMK,则 SageMaker 将默认使用 Amazon S3 服务器端加密密钥。默认的 Amazon S3 服务器端加密密钥无法与其他 AWS 账户共享或由其他 AWS 账户使用。 请确保 SageMaker 执行角色的 IAM 策略和 S3 存储桶策略均具有跨账户权限。

有关更多信息,请参阅如何将 Amazon SageMaker 模型部署到不同的 AWS 账户?