即使已将 AmazonSageMakerFullAccess 策略附加到执行角色,我的 Amazon SageMaker 训练作业失败且显示 AccessDenied 错误。
简短描述
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 policy 允许 kms:encrypt 和 kms:decrypt 操作。有关更多信息,请参阅 SageMaker 角色。
- 请确保 AWS KMS 密钥策略授予 IAM 角色访问权限。有关更多信息,请参阅使用 AWS KMS 中的密钥策略。
- 如果在作业的资源配置中为机器学习(ML)存储卷使用 AWS KMS 密钥,则 IAM policy 必须允许 kms:CreateGrant 操作。有关更多信息,请参阅使用授权。有关加密 ML 存储卷的更多信息,请参阅使用加密保护静态数据。
- 在使用 Python SDK 并实现 estimator.EstimatorBase 类的抽象时,必须通过 kwargs 关键字参数传递 output_kms_key 和 volume_kms_key 参数。无论它们是否存在于继承类中,都必须这样做。有关更多信息,请参阅估算程序。
权限边界
如果您为执行角色定义权限边界,则 SageMaker 仅可执行 IAM policy 和权限边界都允许的操作。请确保 IAM policy 和权限边界均允许所需的 Amazon S3 操作。
存储桶策略
如果输入存储桶使用存储桶策略,请确保存储桶策略允许执行角色执行所需的 Amazon S3 操作。有关存储桶策略的更多信息,请参阅 Amazon S3 中的策略和权限。
以下示例中的存储桶策略拒绝访问 SageMaker 执行角色,导致出现 AccessDenied 错误:
{
"Version": "2012-10-17",
"Id": "ExamplePolicy01",
"Statement": [
{
"Sid": "ExampleStatement01",
"Effect": "Deny",
"Principal": {
"AWS": "arn:aws:iam::Account-ID:role/SageMakerExecutionRole"
},
"Action": [
"s3:GetObject",
"s3:GetBucketLocation",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::awsdoc-example-bucket/*",
"arn:aws:s3:::awsdoc-example-bucket"
]
}
]
}
跨账户 Amazon S3 访问
如果不同的 AWS 账户拥有 Amazon S3 数据:
- 请确保两个账户均可访问 AWS KMS 密钥。如果您没有为训练作业指定 AWS KMS 密钥,则 SageMaker 默认将使用 Amazon S3 服务器端加密密钥。默认的 Amazon S3 服务器端加密密钥无法与其他 AWS 账户共享或由其他 AWS 账户使用。
- 请确保 SageMaker 执行角色的 IAM 策略和 S3 存储桶策略均具有跨账户权限。
有关更多信息,请参阅如何将 Amazon SageMaker 模型部署到不同的 AWS 账户?
相关信息
如何对来自 Amazon S3 的 403 访问被拒绝错误执行故障排查?