Amazon SageMakerFullAccess ポリシーが実行ロールにアタッチされているにもかかわらず、Amazon SageMaker トレーニングジョブが AccessDenied エラーで失敗します。
簡単な説明
AccessDenied エラーの発生は、次に示す Amazon Simple Storage Service (Amazon S3) アクションの内で 1 つ以上を、AWS Identity and Access Management (IAM) ポリシーが許可していないことを示します。
- s3:ListBucket
- s3:GetObject
- s3:PutObject
必要な権限は、呼び出す SageMaker API によって異なります。たとえば、CreateModel API で必要な Amazon S3 アクションは s3:GetObject のみです。一方、CreateTrainingJob API の場合には、s3:GetObject、s3:PutObject、および s3:ListObject が必要になります。各 API で必要な権限の詳細については、「Amazon SageMaker ロール」をご参照ください。
解決方法
AccessDenied エラーは、通常、次のシナリオで発生します。
暗号化された入力バケット
S3 バケット内のデータが、AWS Key Management Service (AWS KMS) で暗号化されている場合には次に注意します。
- 実行ロールにアタッチされている IAM ポリシーで、kms:encrypt および kms:decrypt アクションが許可されていることを確認します。詳細については、Amazon SageMaker ロールをご参照ください。
- AWS KMS キーポリシーが IAM ロールへのアクセスを許可していることを確認します。詳細については、「AWS KMS でのキーポリシーの使用」を参照してください。
- ジョブのリソース設定で、機械学習 (ML) ストレージボリュームに AWS KMS キーを使用する場合は、kms:CreateGrant アクションを IAM ポリシーで許可しておく必要があります。詳細については、「Using grants」を参照してください。ML ストレージボリューム暗号化の詳細については、「暗号化を使用して保管時のデータを保護する」をご参照ください。
- Python SDK を使用して estimator.EstimatorBase クラスの抽象化を実装する場合、output_kms_key パラメータと volume_kms_key パラメータを kwargs キーワード引数で渡す必要があります。これは、継承するクラスに存在することが文書化されているかどうかに関係なく行わなければなりません。詳細については、推定器を参照してください。
許可の境界
実行ロールで許可の境界を定義すると、SageMaker では、IAM ポリシーと許可の境界で同時に許可されているアクションのみを実行します。必要な Amazon S3 アクションが、IAM ポリシーとアクセス権限の境界において許可されていることを確認します。
バケットポリシー
入力バケットでバケットポリシーを使用する場合には、そのバケットポリシーが実行ロールに対し、必要な 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 バケットポリシーに、クロスアカウントのアクセス権限があることを確認します。
詳細については、「How can I deploy an Amazon SageMaker model to a different AWS account?(Amazon SageMaker モデルを別の AWS アカウントにデプロイするにはどうすればよいですか?」をご参照ください。
関連情報
Amazon S3 からの 403 Access Denied エラーをトラブルシューティングするにはどうすればよいですか?