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

2 分钟阅读
0

即使已将 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:GetObjects3:PutObjects3:ListObject。有关每个 API 所需权限的更多信息,请参阅 SageMaker 角色

解决方法

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

已加密的输入存储桶

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

  • 请确保附加到执行角色的 IAM policy 允许 kms:encryptkms:decrypt 操作。有关更多信息,请参阅 SageMaker 角色
  • 请确保 AWS KMS 密钥策略授予 IAM 角色访问权限。有关更多信息,请参阅使用 AWS KMS 中的密钥策略
  • 如果在作业的资源配置中为机器学习(ML)存储卷使用 AWS KMS 密钥,则 IAM policy 必须允许 kms:CreateGrant 操作。有关更多信息,请参阅使用授权。有关加密 ML 存储卷的更多信息,请参阅使用加密保护静态数据
  • 在使用 Python SDK 并实现 estimator.EstimatorBase 类的抽象时,必须通过 kwargs 关键字参数传递 output_kms_keyvolume_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 访问被拒绝错误执行故障排查?

AWS 官方
AWS 官方已更新 2 年前