如何解决 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": [
        {
            "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 客户主密钥 (CMK)。如果您没有为训练作业指定 CMK,则 SageMaker 将默认使用 Amazon S3 服务器端加密密钥。默认的 Amazon S3 服务器端加密密钥无法与其他 AWS 账户共享或由其他 AWS 账户使用。
  • 请确保 SageMaker 执行角色的 IAM 策略和 S3 存储桶策略均具有跨账户权限。

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


这篇文章对您有帮助吗?


您是否需要账单或技术支持?