尽管我将 AmazonSageMakerFullAccess 策略附加到执行角色中,但我的 Amazon SageMaker AI 训练作业失败并出现 AccessDenied 错误。我想对此问题进行故障排除。
简短描述
如果您的 AWS Identity and Access Management (IAM) 策略不允许以下 Amazon Simple Storage Service (Amazon S3) 操作,则可能会出现 AccessDenied 错误:
- s3:ListBucket
- s3:GetObject
- s3:PutObject
您的 SageMaker AI API 调用决定了所需的权限。例如,CreateModel API 仅需要 s3:GetObject,但是 CreateTrainingJob API 需要 s3:GetObject、s3:PutObject 和 s3:ListObject。
解决方法
要解决 AccessDenied 错误,请根据您的情况执行以下操作。
加密的输入存储桶
如果您使用 AWS Key Management Service (AWS KMS) 对 S3 存储桶中的数据进行了加密,请检查权限。附加到执行角色的 IAM 策略必须允许 kms:encrypt 和 kms:decrypt 操作。检查 AWS KMS 密钥策略是否授予对执行角色的访问权限。
您可以在作业的资源配置中将 AWS KMS 密钥用于机器学习 (ML) 存储卷。如果您使用 AWS KMS 密钥,则 IAM 策略必须允许 kms:CreateGrant 操作。有关详细信息,请参阅 AWS KMS 中的授权。
**注意:**最佳做法是加密 ML 存储卷。
当您使用 Python SDK 并实现 estimator.EstimatorBase 类的抽象时,通过 kwargs 关键字参数传递 output_kms_key 和 volume_kms_key 参数。无论继承类中是否有记录的 output_kms_key 和 volume_kms_key 参数,都要执行此操作。有关详细信息,请参阅 Amazon SageMaker Python SDK 网站上的估算器。
权限边界
如果您为执行角色定义权限边界,则 SageMaker AI 仅运行 IAM 策略和权限边界都允许的操作。确保 IAM 策略和权限边界允许执行所需的 Amazon S3 操作。
存储桶策略
如果输入存储桶使用存储桶策略,则存储桶策略必须允许执行角色执行所需的 Amazon S3 操作。
以下是拒绝访问 SageMaker AI 执行角色并导致 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"
]
}
]
}
**注意:**要允许访问执行角色,请将效果值的 Deny 替换为 Allow。
跨 AWS 账户访问
如果另一个 AWS 账户拥有 Amazon S3 数据,请检查两个账户是否都可以访问 AWS KMS 密钥。如果您没有为训练作业指定 AWS KMS 密钥,则 SageMaker AI 默认为 Amazon S3 服务器端加密密钥。其他账户无法共享或使用默认的 Amazon S3 服务器端加密密钥。
确保 SageMaker AI 执行角色的 IAM 策略和 S3 存储桶策略具有跨账户的权限。
有关详细信息,请参阅如何将 Amazon SageMaker AI 模型部署到不同的 AWS 账户?
相关信息
如何对来自 Amazon S3 的“403 访问被拒绝”错误进行故障排除?
如何使用 SageMaker AI 执行角色