Amazon S3 コンソールを使ってファイルをアップロードするときに HTTP 403 Forbidden のエラーが発生するのはなぜですか?

最終更新日: 2020 年 10 月 20 日

Amazon S3 コンソールを使用して Amazon Simple Storage Service (Amazon S3) バケットにファイルをアップロードしようとしています。けれども、HTTP 403 Forbidden エラーが発生します。この問題を解決するには、どうすれば良いですか?

簡単な説明

Amazon S3 コンソールの HTTP 403 Forbidden エラーをトラブルシューティングする方法については、以下をご覧ください。

  • s3:PutObject または s3:PutObjectAcl に対するアクセス許可がない
  • AWS Key Management Service (AWS KMS) キーを使用するためのアクセス許可がない
  • バケットポリシーに明示的な拒否ステートメントがある 
  • バケットアクセスコントロールリスト (ACL) によって、AWS アカウントルートユーザーによるオブジェクトの書き込みが許可されない
  • AWS Organizations のサービスコントロールポリシーが Amazon S3 へのアクセスを許可していない

解決方法

s3:PutObject または s3:PutObjectAcl に対するアクセス許可がない

使用している AWS Identity and Access Management (IAM) ユーザーまたはロールに、バケットに対する s3:PutObject アクションのアクセス許可があることを確認します。許可されていない場合、HTTP 403 Forbidden のエラーが発生します。 

アップロード中にオブジェクトの ACL を変更する場合、IAM ユーザーまたはロールには s3:PutObjectAcl アクションに対するアクセス許可も必要です。 

AWS KMS キーを使用するためのアクセス許可がない

カスタム AWS KMS キーを使用してデフォルトの暗号化を使用する S3 バケットにアクセスするには、キーを使用するためのアクセス許可が必要です。 

キーを使用するためのアクセス許可を取得するには、キー管理者がキーポリシーに対するアクセス許可を付与する必要があります。暗号化されたバケットにオブジェクトをアップロードするには、IAM ユーザーまたはロールが少なくとも kms:Encrypt および kms:GenerateDataKey のアクセス許可を持っている必要があります。 

バケットポリシーに明示的な拒否ステートメントがある

バケットポリシーを調べ、特定の条件が満たされていない限り s3:PutObject に対するアクセス許可を明示的に拒否する ("Effect": "Deny") ステートメントがないか確認します。アップロードが s3:PutObject アクションにアクセスするためのバケットポリシーの要件を満たしていることを確認します。 

たとえば、リクエストに AWS KMS または Amazon S3 で管理された暗号化キーを使用したサーバー側暗号化が含まれていない限りバケットポリシーで s3:PutObject が明示的に拒否される場合は、オブジェクトをアップロードする際に使用する暗号化ヘッダーが正しいことを確認します。

バケットポリシーにおける次のステートメント例では、アップロードリクエストに AWS KMS キー arn:aws:kms:us-east-1:111122223333:key による暗号化が含まれていない限り、バケット awsdoc-example-bucket における s3:PutObject へのアクセスは明示的に拒否されます。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ExampleStmt",
      "Action": [
        "s3:PutObject"
      ],
      "Effect": "Deny",
      "Resource": "arn:aws:s3:::awsdoc-example-bucket/*",
      "Condition": {
        "StringNotLikeIfExists": {
          "s3:x-amz-server-side-encryption-aws-kms-key-id": "arn:aws:kms:us-east-1:111122223333:key/*"
        }
      },
      "Principal": "*"
    }
  ]
}

警告: 明示的な拒否ステートメントのあるバケットポリシーを保存する前に、明示的なアクセス拒否のパラメータを慎重に確認する必要があります。誤ってロックアウトされた場合は、「誤って全ユーザーの Amazon S3 バケットへのアクセスを拒否してしまいました。アクセスを再取得するにはどうすればよいですか?」を参照してください。

バケットの ACL がルートユーザーにオブジェクトの書き込みを許可していない

ルートユーザーアカウントを使用して S3 バケットにオブジェクトをアップロードする場合は、バケットの ACL からルートユーザーにオブジェクトを書き込むためのアクセス許可が付与されていることを確認します。詳細は、ACL バケットのアクセス許可を設定する方法を参照してください。 

AWS Organizations のサービスコントロールポリシーが Amazon S3 へのアクセスを許可していない

AWS Organizations を使用している場合は、サービスコントロールポリシーをチェックして、Amazon S3 へのアクセスが許可されていることを確認します。

たとえば、ポリシーが以下である場合に Amazon S3 にアクセスしようとするとアクセスが明示的に拒否されるため、HTTP 403 Forbidden エラーが発生します。

{
  "Version": "2012-10-17",
  "Statement": [{
    "Effect": "Deny",
    "Action": "S3:*",
    "Resource": "*"
  }]
}

AWS Organizations の機能の詳細については、組織内のすべての機能の有効化を参照してください。