Warum schlägt meine Amazon-EMR-Anwendung mit der HTTP 403 AmazonS3Exception „Zugriff verweigert“ fehl?

Lesedauer: 6 Minute
0

Wenn ich eine Anwendung an einen Amazon EMR-Cluster übermittle, schlägt die Anwendung fehl und es wird eine AmazonS3Exception vom Typ HTTP 403 „Zugriff verweigert“ angezeigt.

Behebung

Wenn die Berechtigungen nicht richtig konfiguriert sind, erhalten Sie möglicherweise bei Amazon EMR oder Amazon Simple Storage Service (Amazon S3) die Fehlermeldung „Zugriff verweigert“. Der Fehler sieht ähnlich wie die folgende Meldung aus:

java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 8B28722038047BAA; S3 Extended Request ID: puwS77OKgMrvjd30/EY4CWlC/AuhOOSNsxfI8xQJXMd20c7sCq4ljjVKsX4AwS7iuo92C9m+GWY=), S3 Extended Request ID: puwS77OKgMrvjd30/EY4CWlC/AuhOOSNsxfI8xQJXMd20c7sCq4ljjVKsX4AwS7iuo92C9m+GWY=

Überprüfen Sie zunächst die in Ihrem Anwendungscode angegebenen Anmeldeinformationen oder Rollen

Führen Sie den folgenden Befehl auf dem Hauptknoten des EMR-Clusters aus. Ersetzen Sie s3://doc-example-bucket/abc/ durch Ihren Amazon-S3-Pfad.

aws s3 ls s3://doc-example-bucket/abc/

Wenn dieser Befehl funktioniert, wird der Fehler „Zugriff verweigert“ von den in Ihrem Anwendungscode angegebenen Anmeldeinformationen oder Rollen verursacht. Vergewissern Sie sich, dass Ihre Anwendung die erwarteten Anmeldeinformationen verwendet oder die erwartete Rolle annimmt und dass sie Zugriff auf den Amazon-S3-Pfad hat. Stellen Sie sicher, dass die Rolle über Berechtigungen für den Amazon-S3-Pfad verfügt, indem Sie mithilfe des AWS CLI die Rolle von AWS Identity and Access Management (IAM) übernehmen. Führen Sie dann eine Beispielanforderung an den S3-Pfad durch.

Wenn dieser Befehl fehlschlägt, stellen Sie sicher, dass Sie die neueste Version des AWS Command Line Interface (AWS CLI) verwenden. Überprüfen Sie dann Folgendes, um den Fehler „Zugriff verweigert“ zu beheben:

Überprüfen Sie die Richtlinie für die Amazon-EC2-Instance-Profilrolle

Wenn das Amazon Elastic Compute Cloud (Amazon EC2)-Instance-Profil nicht über die erforderlichen Lese- und Schreibberechtigungen für die S3-Buckets verfügt, erhalten Sie möglicherweise die Fehlermeldung „Zugriff verweigert“.

Hinweis: Standardmäßig erhalten Anwendungen den Amazon-S3-Zugriff von der IAM-Rolle für das Amazon-EC2-Instance-Profil. Stellen Sie sicher, dass die dieser Rolle zugewiesenen IAM-Richtlinien die erforderlichen S3-Operationen für die Quell- und Ziel-Buckets zulassen.

Um dieses Problem zu beheben, überprüfen Sie, ob Sie über die erforderliche Leseberechtigung verfügen, indem Sie den folgenden Befehl ausführen:

$ aws s3 ls s3://doc-example-bucket/myfolder/

Ihre Ausgabe könnte wie folgt aussehen:

An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

-oder-

Führen Sie folgenden Befehl aus:

$ hdfs dfs -ls s3://doc-example-bucket/myfolder

Ihre Ausgabe könnte wie folgt aussehen:

ls: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: RBT41F8SVAZ9F90B; S3 Extended Request ID: ih/UlagUkUxe/ty7iq508hYVfRVqo+pB6/xEVr5WHuvcIlfQnFf33zGTAaoP2i7cAb1ZPIWQ6Cc=; Proxy: null), S3 Extended Request ID: ih/UlagUkUxe/ty7iq508hYVfRVqo+pB6/xEVr5WHuvcIlfQnFf33zGTAaoP2i7cAb1ZPIWQ6Cc=

Stellen Sie sicher, dass die Instance-Profilrolle über die erforderlichen Lese- und Schreibberechtigungen für die S3-Buckets verfügt. Beispielsweise bieten die S3-Aktionen in der folgenden IAM-Richtlinie den erforderlichen Lese- und Schreibzugriff auf den S3-Bucket doc-example-bucket:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ListObjectsInBucket",
      "Effect": "Allow",
      "Action": [
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ]
    },
    {
      "Sid": "AllObjectActions",
      "Effect": "Allow",
      "Action": "s3:*Object*",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket/*"
      ]
    }
  ]
}

Überprüfen Sie die IAM-Rolle für die EMRFS-Rollenzuordnung

Wenn Sie eine Sicherheitskonfiguration verwenden, um IAM-Rollen für EMRFS anzugeben, verwenden Sie die Rollenzuordnung. Ihre Anwendung erhält die S3-Berechtigungen von der IAM-Rolle auf der Grundlage der Rollenzuordnungskonfiguration.

Die diesen Rollen zugeordnete IAM-Richtlinie muss über die erforderlichen S3-Berechtigungen für die Quell- und Ziel-Buckets verfügen. Informationen zur Angabe von IAM-Rollen für EMRFS-Anfragen an Amazon S3 finden Sie unter Einrichten einer Sicherheitskonfiguration mit IAM-Rollen für EMRFS.

Überprüfen Sie die Amazon-S3-VPC-Endpunktrichtlinie

Wenn die Subnetz-Routing-Tabelle des EMR-Clusters eine Route zu einem Amazon-S3-VPC-Endpunkt enthält, stellen Sie sicher, dass die Endpunktrichtlinie die erforderlichen Amazon-S3-Operationen zulässt.

So überprüfen und ändern Sie die Endpunktrichtlinie mit dem CLI:

Führen Sie den folgenden Befehl aus, um die Endpunktrichtlinie zu überprüfen. Ersetzen Sie vpce-xxxxxxxx durch Ihre VPC ID.

aws ec2 describe-vpc-endpoints --vpc-endpoint-ids "vpce-xxxxxxxx"

Führen Sie bei Bedarf den folgenden Befehl aus, um eine geänderte Endpunktrichtlinie hochzuladen. Ersetzen Sie die VPC ID und den JSON-Dateipfad.

aws ec2 modify-vpc-endpoint --vpc-endpoint-id "vpce-xxxxxxxx" --policy-document file://policy.json

So überprüfen und ändern Sie die Endpunktrichtlinie mithilfe der Amazon-VPC-Konsole:

  1. Öffnen Sie die Amazon-VPC-Konsole.
  2. Wählen Sie im Navigationsbereich Endpunkte aus.
  3. Wählen Sie den Amazon-S3-Endpunkt aus (denjenigen, der sich in der Subnetz-Routing-Tabelle des EMR-Clusters befindet). Wählen Sie dann die Registerkarte Richtlinie, um die Endpunktrichtlinie zu überprüfen.
  4. Um die erforderlichen Amazon-S3-Aktionen hinzuzufügen, wählen Sie Richtlinie bearbeiten.

Überprüfen Sie die S3-Quell- und Ziel-Bucket-Richtlinien

Bucket-Richtlinien spezifizieren die Aktionen, die für Prinzipale zulässig sind oder verweigert werden. Die Quell- und Ziel-Bucket-Richtlinien müssen es der EC2-Instance-Profilrolle oder der zugewiesenen IAM-Rolle ermöglichen, die erforderlichen Amazon-S3-Operationen auszuführen.

So überprüfen und ändern Sie die Bucket-Richtlinien mithilfe des CLI:

Führen Sie den folgenden Befehl aus, um eine Bucket-Richtlinie zu überprüfen. Ersetzen Sie doc-example-bucket durch den Namen des Quell- oder Ziel-Buckets.

aws s3api get-bucket-policy --bucket doc-example-bucket

Führen Sie bei Bedarf den folgenden Befehl aus, um eine geänderte Bucket-Richtlinie hochzuladen. Ersetzen Sie den Bucket-Namen und den JSON-Dateipfad.

aws s3api put-bucket-policy --bucket doc-example-bucket --policy file://policy.json

So überprüfen und ändern Sie die Bucket-Richtlinien mithilfe der Amazon-S3-Konsole:

  1. Öffnen Sie die Amazon-S3-Konsole.
  2. Wählen Sie den Bucket.
  3. Wählen Sie die Registerkarte Berechtigungen aus.
  4. Wählen Sie Bucket-Richtlinie aus, um die Bucket-Richtlinie zu überprüfen und zu ändern.

Zugriff auf S3-Buckets in einem anderen Konto

Wichtig: Wenn Ihre Anwendung auf einen S3-Bucket zugreift, der zu einem anderen AWS-Konto gehört, muss der Kontoinhaber Ihre IAM-Rolle in der Bucket-Richtlinie zulassen.

Die folgende Bucket-Richtlinie gewährt beispielsweise allen IAM-Rollen und Benutzern in emr-account vollen Zugriff auf s3://doc-example-bucket/myfolder/.

{
  "Id": "MyCustomPolicy",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowRootAndHomeListingOfCompanyBucket",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ],
      "Condition": {
        "StringEquals": {
          "s3:prefix": [
            "",
            "myfolder/"
          ],
          "s3:delimiter": [
            "/"
          ]
        }
      }
    },
    {
      "Sid": "AllowListingOfUserFolder",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Action": [
        "s3:ListBucket"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::doc-example-bucket"
      ],
      "Condition": {
        "StringLike": {
          "s3:prefix": [
            "myfolder/*"
          ]
        }
      }
    },
    {
      "Sid": "AllowAllS3ActionsInUserFolder",
      "Principal": {
        "AWS": [
          "arn:aws:iam::emr-account:root"
        ]
      },
      "Effect": "Allow",
      "Action": [
        "s3:*"
      ],
      "Resource": [
        "arn:aws:s3:::doc-example-bucket/myfolder/*",
        "arn:aws:s3:::doc-example-bucket/myfolder*"
      ]
    }
  ]
}

Ähnliche Informationen

Warum schlägt mein Spark- oder Hive-Job auf Amazon EMR mit einer AmazonS3Exception mit HTTP 503 „Slow Down“ fehl?

Warum schlägt meine Amazon-EMR-Anwendung mit einer HTTP 404 „Not Found“-AmazonS3Exception fehl?

Antworten auf Fehler

Wie behebe ich Fehler 403 „Zugriff verweigert“ von Amazon S3?

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren