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

Letzte Aktualisierung: 3.5.2022

Wenn ich eine Anwendung an einen Amazon-EMR-Cluster sende, schlägt die Anwendung mit einer HTTP-403-AmazonS3Exception „Zugriff verweigert“ fehl:

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=

Auflösung

Wenn die Berechtigungen nicht richtig konfiguriert sind, erhalten Sie möglicherweise einen „Zugriff verweigert“-Fehler bei Amazon EMR oder Amazon Simple Storage Service (Amazon S3).

Die Anmeldeinformationen oder Rolle, die in Ihrem Anwendungscode angegeben sind/ist

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 erfolgreich ist, verursachen die in Ihrem Anwendungscode angegebenen Anmeldeinformationen oder die Rolle den Fehler „Zugriff verweigert“. Vergewissern Sie sich, dass Ihre Anwendung die erwarteten Anmeldeinformationen verwendet oder die erwartete Rolle übernimmt 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 der AWS-CLI die Rolle „AWS Identity and Access Management (IAM)“ übernehmen. Führen Sie dann eine Beispielanforderung an den S3-Pfad durch.

Wenn dieser Befehl fehlschlägt, vergewissern Sie sich, 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 Instance-Profil von Amazon Elastic Compute Cloud (Amazon EC2) nicht über die erforderlichen Lese- und Schreibberechtigungen für die S3-Buckets verfügt, wird möglicherweise der Fehler „Zugriff verweigert“ angezeigt.

    Hinweis: Standardmäßig erben Anwendungen den Amazon-S3-Zugriff von der IAM-Rolle für das Amazon-EC2-Instance-Profil. Stellen Sie sicher, dass die an diese Rolle angehängten IAM-Richtlinien die erforderlichen S3-Vorgänge auf den Quell- und Ziel-Buckets zulassen.

    Um dieses Problem zu beheben, überprüfen Sie, ob Sie über die erforderlichen Leseberechtigungen 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 den 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 erbt die S3-Berechtigungen von der IAM-Rolle basierend auf der Rollenzuordnungskonfiguration.

    Die an diese Rollen angehängte IAM-Richtlinie muss über die erforderlichen S3-Berechtigungen für die Quell- und Ziel-Buckets verfügen. Informationen zum Angeben 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-Routentabelle des EMR-Clusters eine Route zu einem Amazon-S3-VPC-Endpunkt enthält, bestätigen Sie, dass die Endpunktrichtlinie die erforderlichen Amazon-S3-Vorgänge zulässt.

    So überprüfen und ändern Sie die Endpunktrichtlinie mithilfe der 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 Endpunkte im Navigationsbereich aus.
    3. Wählen Sie den Amazon-S3-Endpunkt aus (denjenigen, der sich in der Subnetz-Routentabelle des EMR-Clusters befindet). Wählen Sie dann die Registerkarte Richtlinie aus, um die Endpunktrichtlinie zu überprüfen.
    4. Um die erforderlichen Amazon-S3-Aktionen hinzuzufügen, wählen Sie Richtlinie bearbeiten.

    Überprüfen der Amazon-S3-Quellen- und Ziel-Bucket-Richtlinien

    Bucket-Richtlinien geben die Aktionen an, die für Prinzipale zugelassen oder verweigert werden. Die Richtlinien für die Quell- und Ziel-Buckets müssen es der EC2-Instance-Profilrolle oder der zugeordneten IAM-Rolle erlauben, die erforderlichen Amazon-S3-Vorgänge auszuführen.

    So überprüfen und ändern Sie die Bucket-Richtlinien mithilfe der 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.
    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.

    Beispielsweise gewährt die folgende Bucket-Richtlinie allen IAM-Rollen und Benutzern im 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*"
          ]
        }
      ]
    }