

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 EKS 上使用 Amazon EMR 和 L AWS ake Formation 进行精细的访问控制
<a name="security_iam_fgac-lf"></a>

在 Amazon EMR 7.7 及更高版本中，您可以利用 AWS Lake Formation 对由 Amazon S3 存储桶支持的 Gl AWS ue 数据目录表应用精细的访问控制。此功能允许您为 Amazon EMR on EKS Spark Jobs 中的读取查询配置表、行、列和单元格级访问控制。

**Topics**
+ [EKS 上的亚马逊 EMR 如何与 Lake Formation 配合使用 AWS](security_iam_fgac-lf-works.md)
+ [使用 Amazon EMR on EKS 启用 Lake Formation](security_iam_fgac-lf-enable.md)
+ [注意事项和限制](security_iam_fgac-considerations.md)
+ [问题排查](security_iam_fgac-troubleshooting.md)

# EKS 上的亚马逊 EMR 如何与 Lake Formation 配合使用 AWS
<a name="security_iam_fgac-lf-works"></a>

将 Amazon EMR on EKS 与 Lake Formation 结合使用，您可以对每个 Spark 作业强制执行一层权限，以便在 Amazon EMR on EKS 执行作业时应用 Lake Formation 权限控制。Amazon EMR on EKS 使用 [Spark 资源配置文件](https://spark.apache.org/docs/latest/api/java/org/apache/spark/resource/ResourceProfile.html)创建两个配置文件来有效执行作业。用户配置文件执行用户提供的代码，而系统配置文件强制执行 Lake Formation 策略。每个启用 Lake Formation 的作业都使用两个 Spark 驱动程序，一个用于用户配置文件，一个用于系统配置文件。有关更多信息，请参阅[什么是AWS Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html)。

以下是 Amazon EMR on EKS 如何访问受 Lake Formation 安全策略保护的数据的高级概览。

![\[通过 Lake Formation 设置作业安全性\]](http://docs.aws.amazon.com/zh_cn/emr/latest/EMR-on-EKS-DevelopmentGuide/images/fgac_diagram_eks_spark.png)


以下步骤介绍了此过程：

1. 用户在 EKS 虚拟集群上向支持 AWS Lake Formation 的 Amazon EMR 提交 Spark Job。

1. Amazon EMR on EKS 服务设置用户驱动程序并在用户配置文件中运行作业。用户驱动程序运行精简版 Spark，该版本无法启动任务、请求执行程序或者访问 Amazon S3 或 Glue Data Catalog。它仅构建作业计划。

1. Amazon EMR on EKS 服务设置第二个驱动程序（称为系统驱动程序），并在系统配置文件中运行它（使用特权身份）。Amazon EKS 在两个驱动程序之间设置加密的 TLS 通道来进行通信。用户驱动程序使用该通道将作业计划发送到系统驱动程序。系统驱动程序不会运行用户提交的代码。它运行完整的 Spark，并与 Amazon S3 和 Data Catalog 进行通信以访问数据。它请求执行程序并将作业计划编译成一系列执行阶段。

1. 然后，Amazon EMR on EKS 服务在执行程序上运行这些阶段。任何阶段的用户代码都只能在用户配置文件执行程序上运行。

1. 从受 Lake Formation 保护的 Data Catalog 表读取数据的阶段或者应用安全筛选条件的阶段委派给系统执行程序。

# 使用 Amazon EMR on EKS 启用 Lake Formation
<a name="security_iam_fgac-lf-enable"></a>

在 Amazon EMR 7.7 及更高版本中，您可以利用 AWS Lake Formation 对由 Amazon S3 支持的数据目录表应用精细的访问控制。此功能允许您为 Amazon EMR on EKS Spark Jobs 中的读取查询配置表、行、列和单元格级访问控制。

本节介绍如何创建安全配置和设置 Lake Formation 以与 Amazon EMR 结合使用。它还介绍了如何使用为 Lake Formation 创建的安全配置来创建虚拟集群。这些章节应按顺序完成。

## 步骤 1：设置基于 Lake Formation 的列、行或单元格级权限
<a name="security_iam_fgac-lf-enable-permissions"></a>

首先，要对 Lake Formation 应用行和列级权限，Lake Formation 的数据湖管理员必须设置**LakeFormationAuthorizedCaller**会话标签。Lake Formation 使用该会话标签来授权调用者并提供对数据湖的访问权限。

导航到 AWS Lake Formation 控制台，然后从侧栏的 “**管理**” 部分中选择 “**应用程序集成设置**” 选项。然后，选中**允许外部引擎筛选在 Lake Formation 中注册的 Amazon S3 位置处的数据**复选框。添加要运行 Spark 任务的**AWS 账户 IDs **和会**话标签值**。

![\[应用程序集成设置\]](http://docs.aws.amazon.com/zh_cn/emr/latest/EMR-on-EKS-DevelopmentGuide/images/application_integration_settings_fgac.png)


请注意，此处传递的**LakeFormationAuthorizedCaller**会话标签**SecurityConfiguration**将在稍后设置 IAM 角色时在第 3 节中传递。

## 步骤 2：设置 EKS RBAC 权限
<a name="security_iam_fgac-lf-enable-rbac"></a>

第二，设置基于角色的访问控制权限。

### 向 Amazon EMR on EKS 服务提供 EKS 集群权限
<a name="security_iam_fgac-lf-enable-rbac-cluster"></a>

Amazon EMR on EKS 服务必须具有 EKS 集群角色权限，才能为系统驱动程序创建跨命名空间权限，以分拆用户命名空间中的用户执行程序。

**创建集群角色**

此示例定义了一组资源的权限。

```
vim emr-containers-cluster-role.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: emr-containers
rules:
  - apiGroups: [""]
    resources: ["namespaces"]
    verbs: ["get"]
  - apiGroups: [""]
    resources: ["serviceaccounts", "services", "configmaps", "events", "pods", "pods/log"]
    verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"]
  - apiGroups: [""]
    resources: ["secrets"]
    verbs: ["create", "patch", "delete", "watch"]
  - apiGroups: ["apps"]
    resources: ["statefulsets", "deployments"]
    verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"]
  - apiGroups: ["batch"]
    resources: ["jobs"]
    verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"]
  - apiGroups: ["extensions", "networking.k8s.io"]
    resources: ["ingresses"]
    verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "annotate", "patch", "label"]
  - apiGroups: ["rbac.authorization.k8s.io"]
    resources: ["clusterroles","clusterrolebindings","roles", "rolebindings"]
    verbs: ["get", "list", "watch", "describe", "create", "edit", "delete", "deletecollection", "annotate", "patch", "label"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "describe", "create", "edit", "delete",  "deletecollection", "annotate", "patch", "label"]
  - apiGroups: ["kyverno.io"]
    resources: ["clusterpolicies"]
    verbs: ["create", "delete"]
---
```

```
kubectl apply -f emr-containers-cluster-role.yaml
```

**创建集群角色绑定**

```
vim emr-containers-cluster-role-binding.yaml
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: emr-containers
subjects:
- kind: User
  name: emr-containers
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: emr-containers
  apiGroup: rbac.authorization.k8s.io
---
```

```
kubectl apply -f emr-containers-cluster-role-binding.yaml
```

### 提供对 Amazon EMR on EKS 服务的命名空间访问权限
<a name="security_iam_fgac-lf-enable-rbac-cluster"></a>

创建两个 Kubernetes 命名空间（一个用于用户驱动程序和执行程序，另一个用于系统驱动程序和执行程序），并启用 Amazon EMR on EKS 服务访问权限，以便在用户和系统命名空间中提交作业。按照现有指南为每个命名空间提供访问权限，该指南可在[使用 `aws-auth` 启用集群访问](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-cluster-access.html#setting-up-cluster-access-aws-auth)中找到。

## 步骤 3：为用户和系统配置文件组件设置 IAM 角色
<a name="security_iam_fgac-lf-system-profile-configure"></a>

第三，为特定组件设置角色。启用 Lake Formation 的 Spark 作业包含两个组件：用户和系统。用户驱动程序和执行器在 User 命名空间中运行，并与 StartJobRun API 中传递的 JobExecutionRole 命名空间相关联。系统驱动程序和执行器在 System 命名空间中运行，并与**QueryEngine**角色相关联。

### 配置查询引擎角色
<a name="security_iam_fgac-lf-system-profile-configure-query"></a>

该 QueryEngine 角色与系统空间组件相关联，并且有权担任 with Sess **JobExecutionRole**i **LakeFormationAuthorizedCaller**on 标签。查询引擎角色的 IAM 权限策略如下：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AssumeJobRoleWithSessionTagAccessForSystemDriver",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ],
      "Resource": [
        "arn:aws:iam::*:role/JobExecutionRole"
      ],
      "Condition": {
        "StringLike": {
          "aws:RequestTag/LakeFormationAuthorizedCaller": "EMR on EKS Engine"
        }
      }
    },
    {
      "Sid": "AssumeJobRoleWithSessionTagAccessForSystemExecutor",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole"
      ],
      "Resource": [
        "arn:aws:iam::*:role/JobExecutionRole"
      ]
    },
    {
      "Sid": "CreateCertificateAccessForTLS",
      "Effect": "Allow",
      "Action": [
        "emr-containers:CreateCertificate"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------

将查询引擎角色的信任策略配置为信任 Kubernetes 系统命名空间。

```
aws emr-containers update-role-trust-policy \ 
    --cluster-name eks cluster \ 
    --namespace eks system namespace \ 
    --role-name query_engine_iam_role_name
```

有关更多信息，请参阅[更新角色信任策略](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-trust-policy.html)。

### 配置作业执行角色
<a name="security_iam_fgac-lf-system-profile-job"></a>

Lake For AWS mation 权限控制对 Glue 数据目录资源、Amazon S3 位置以及这些位置的基础数据的访问权限。IAM 权限控制对 Lake Formation 和 AWS Glue APIs 以及资源的访问。虽然您可能拥有 Lake Formation 权限来访问 Data Catalog (SELECT) 中的表，但如果没有对 `glue:Get*` API 操作的 IAM 权限，操作就会失败。

IAM 权限策略**JobExecutionRole**为：**JobExecution**角色的权限策略中应包含策略声明。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "GlueCatalogAccess",
      "Effect": "Allow",
      "Action": [
        "glue:Get*",
        "glue:Create*",
        "glue:Update*"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "LakeFormationAccess",
      "Effect": "Allow",
      "Action": [
        "lakeformation:GetDataAccess"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "CreateCertificateAccessForTLS",
      "Effect": "Allow",
      "Action": [
        "emr-containers:CreateCertificate"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------

适用于以下内容的 IAM 信任政策 **JobExecutionRole**：

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "TrustQueryEngineRoleForSystemDriver",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ],
      "Resource": [
        "arn:aws:iam::*:role/QueryExecutionRole"
      ],
      "Condition": {
        "StringLike": {
          "aws:RequestTag/LakeFormationAuthorizedCaller": "EMR on EKS Engine"
        }
      }
    },
    {
      "Sid": "TrustQueryEngineRoleForSystemExecutor",
      "Effect": "Allow",
      "Action": [
        "sts:AssumeRole"
      ],
      "Resource": [
        "arn:aws:iam::*:role/QueryEngineRole"
      ]
    }
  ]
}
```

------

将角色执行角色的信任策略配置为信任 Kubernetes 用户命名空间：

```
aws emr-containers update-role-trust-policy \ 
    --cluster-name eks cluster \ 
    --namespace eks User namespace \ 
    --role-name job_execution_role_name
```

有关更多信息，请参阅[更新作业执行角色的信任策略](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-trust-policy.html)。

## 步骤 4：设置安全配置
<a name="security_iam_fgac-lf-security-config"></a>

要运行启用 Lake Formation 的作业，您必须创建一个安全配置。

```
aws emr-containers create-security-configuration \
    --name 'security-configuration-name' \
    --security-configuration '{
        "authorizationConfiguration": {
            "lakeFormationConfiguration": {
                "authorizedSessionTagValue": "SessionTag configured in LakeFormation",
                "secureNamespaceInfo": {
                    "clusterId": "eks-cluster-name",
                    "namespace": "system-namespace-name"
                },
                "queryEngineRoleArn": "query-engine-IAM-role-ARN"
            }
        }
    }'
```

确保在 “**authorizedSessionTag值**” 字段中传递的会话标签可以授权 Lake Formation。将值设置为在 Lake Formation 中配置的值，请参阅[步骤 1：设置基于 Lake Formation 的列、行或单元格级权限](#security_iam_fgac-lf-enable-permissions)。

## 步骤 5：创建虚拟集群
<a name="security_iam_fgac-lf-virtual-cluster"></a>

创建具有安全配置的 Amazon EMR on EKS 虚拟集群。

```
aws emr-containers create-virtual-cluster \
--name my-lf-enabled-vc \
--container-provider '{
    "id": "eks-cluster",
    "type": "EKS",
    "info": {
        "eksInfo": {
            "namespace": "user-namespace"
        }
    }
}' \
--security-configuration-id SecurityConfiguraionId
```

确保通过上一步中的 **SecurityConfiguration**ID，以便将 Lake Formation 授权配置应用于虚拟集群上运行的所有作业。有关更多信息，请参阅[通过 Amazon EMR 注册 Amazon EKS 集群]()。

## 步骤 6：在 FGAC 中提交 Job 已启用 VirtualCluster
<a name="security_iam_fgac-enabled-cluster"></a>

非 Lake Formation 作业和 Lake Formation 作业的作业提交流程相同。有关更多信息，请参阅[使用 `StartJobRun` 提交作业运行](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/emr-eks-jobs-submit.html)。

系统驱动程序的 Spark 驱动程序、执行器和事件日志存储在 AWS 服务帐户的 S3 存储桶中以进行调试。我们建议在 Job Run 中配置客户管理的 KMS 密钥，以加密存储在 AWS 服务存储桶中的所有日志。有关启用日志加密的更多信息，请参阅[加密 Amazon EMR on EKS 日志](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/security_iam_fgac-logging-kms.html)。

# 注意事项和限制
<a name="security_iam_fgac-considerations"></a>

将 Lake Formation 与 Amazon EMR on EKS 结合使用时，请注意以下注意事项和限制：
+ Amazon EMR on EKS 仅支持通过 Lake Formation 对 Apache Hive、Apache Iceberg、Apache Hudi 和 Delta 表格式进行精细访问控制。Apache Hive 格式包括 Parquet、ORC 和 xSV。
+ `DynamicResourceAllocation` 默认启用，并且您无法为 Lake Formation 作业关闭 `DynamicResourceAllocation`。由于 DRA `spark.dynamicAllocation.maxExecutors` 配置的默认值为无穷大，请根据您的工作负载配置合适的值。
+ 启用 Lake Formation 的作业不支持在系统驱动程序和系统执行程序中使用自定义 EMR on EKS 映像。
+ 您只能将 Lake Formation 与 Spark 作业结合使用。
+ 具有 Lake Formation 的 EMR on EKS 在整个作业中仅支持单个 Spark 会话。
+ 具有 Lake Formation 的 EMR on EKS 仅支持通过资源链接共享的跨账户表查询。
+ 不支持以下项：
  + 弹性分布式数据集（RDD）
  + Spark 流
  + 使用 Lake Formation 授予的权限写入
  + 嵌套列的访问控制
+ EMR on EKS 阻止可能破坏系统驱动程序完全隔离的功能，包括：
  + UDTs、Hive UDFs 以及任何涉及自定义类的用户定义函数
  + 自定义数据来源
  + 为 Spark 扩展、连接器或元存储 `ANALYZE TABLE` 命令提供额外 jar
+ 为了强制执行访问控制，`EXPLAIN PLAN` 和 DDL 操作（如 `DESCRIBE TABLE`）不会公开受限信息。
+ Amazon EMR on EKS 限制访问启用 Lake Formation 的作业上的系统驱动程序 Spark 日志。由于系统驱动程序的运行权限更大，因此系统驱动程序生成的事件和日志可能包含敏感信息。为防止未经授权的用户或代码访问此敏感数据，EMR on EKS 禁止访问系统驱动程序日志。要进行故障排除，请联系 AWS 支持人员。
+ 如果您在 Lake Formation 中注册了表位置，则无论 EMR on EKS 作业执行角色的 IAM 权限如何，数据访问路径都会经过 Lake Formation 存储的凭证。如果错误配置了在表位置注册的角色，则使用具有 S3 IAM 权限的角色提交到表位置的作业会失败。
+ 写入 Lake Formation 表使用的是 IAM 权限，而不是 Lake Formation 授予的权限。如果作业执行角色拥有必要的 S3 权限，则可以使用该权限来运行写入操作。

以下是使用 Apache Iceberg 时的注意事项和限制：
+ 您只能在会话目录中使用 Apache Iceberg，而不能使用任意命名的目录。
+ 在 Lake Formation 中注册的 Iceberg 表仅支持元数据表 `history`、`metadata_log_entries`、`snapshots`、`files`、`manifests` 和 `refs`。Amazon EMR 会隐藏可能包含敏感数据的列，例如 `partitions`、`path` 和 `summaries`。此限制不适用于未在 Lake Formation 中注册的 Iceberg 表。
+ 未在 Lake Formation 中注册的表支持所有 Iceberg 存储过程。任何表都不支持 `register_table` 和 `migrate` 程序。
+ 我们建议你使用 Iceberg DataFrameWriter V2 而不是 V1。

有关更多信息，请参阅[了解 Amazon EMR on EKS 概念和术语](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/emr-eks-concepts.html)和[启用 Amazon EMR on EKS 的集群访问](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/setting-up-cluster-access.html)。

## 数据管理员免责声明
<a name="security_iam_fgac-considerations-data-admin"></a>

**注意**  
当您向 EMR on EKS 的 IAM 角色授予对 Lake Formation 资源的访问权限时，必须确保 EMR 集群管理员或操作员是受信任的管理员。这对于在多个组织和 AWS 账户之间共享的 Lake Formation 资源尤其重要。

## EKS 管理员的职责
<a name="security_iam_fgac-considerations-responsibilities"></a>
+ `System` 命名空间应受到保护。不允许任何用户、资源、实体或工具对 `System` 命名空间中的 Kubernetes 资源拥有任何 Kubernetes RBAC 权限。
+ 除了 EMR on EKS 服务之外，任何用户、资源或实体都不应该对 `User` 命名空间中的 POD、CONFIG\$1MAP 和 SECRET 具有 `CREATE` 权限。
+ `System` 驱动程序和 `System` 执行程序包含敏感数据。因此，不应将 `System` 命名空间中的 Spark 事件、Spark 驱动程序日志和 Spark 执行程序日志转发到外部日志存储系统。

# 问题排查
<a name="security_iam_fgac-troubleshooting"></a>

## 日志记录
<a name="security_iam_fgac-troubleshooting-logging"></a>

EMR on EKS 使用 Spark 资源配置文件来拆分作业执行。Amazon EMR on EKS 使用用户配置文件来运行您提供的代码，而系统配置文件强制执行 Lake Formation 策略。您可以通过配置 StartJobRun 请求来访问作为用户配置文件运行的容器的日志[MonitoringConfiguration](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/emr-eks-jobs-s3.html)。

## Spark 历史记录服务器
<a name="security_iam_fgac-troubleshooting-spark-history"></a>

Spark History Server 包含从用户配置文件生成的所有 Spark 事件以及从系统驱动程序生成的编辑事件。您可以在**执行程序**选项卡中查看用户和系统驱动程序中的所有容器。但日志链接仅适用于用户配置文件。

## 由于 Lake Formation 权限不足，作业失败
<a name="security_iam_fgac-troubleshooting-job-failed"></a>

确保您的作业执行角色有权在您要访问的表上运行 `SELECT` 和 `DESCRIBE`。

## RDD 作业执行失败
<a name="security_iam_fgac-troubleshooting-RDD"></a>

EMR on EKS 目前不支持在启用了 Lake Formation 的作业上进行弹性分布式数据集 (RDD) 操作。

## 无法访问 Amazon S3 中的数据文件
<a name="security_iam_fgac-troubleshooting-unable-access"></a>

确保您已在 Lake Formation 中注册数据湖的位置。

## 安全验证异常
<a name="security_iam_fgac-troubleshooting-validation"></a>

EMR on EKS 检测到安全验证错误。请联系 AWS 支持人员寻求帮助。

## 跨账户 AWS 共享 Glue 数据目录和表格
<a name="security_iam_fgac-troubleshooting-across"></a>

您可以跨账户共享数据库和表，且仍可使用 Lake Formation。有关更多信息，请参阅 Lake Formati [on 中的跨账户数据共享和如何使用 AWS Lake](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-permissions.html) [Formation 跨账户共享 AWS Glue 数据目录和表格](https://repost.aws/knowledge-center/glue-lake-formation-cross-account)？ 。

## Iceberg Job 在未设置区域时抛出初始化错误 AWS
<a name="security_iam_fgac-troubleshooting-init-error"></a>

消息如下：

```
25/02/25 13:33:19 ERROR SparkFGACExceptionSanitizer: Client received error with id = b921f9e6-f655-491f-b8bd-b2842cdc20c7, 
reason = IllegalArgumentException, message = Cannot initialize 
LakeFormationAwsClientFactory, please set client.region to a valid aws region
```

确保 Spark 配置 `spark.sql.catalog.catalog_name.client.region` 设置为有效的区域。

## 投掷 Iceberg Job SparkUnsupportedOperationException
<a name="security_iam_fgac-troubleshooting-unsupported-error"></a>

消息如下：

```
25/02/25 13:53:15 ERROR SparkFGACExceptionSanitizer: Client received error with id = 921fef42-0800-448b-bef5-d283d1278ce0, 
reason = SparkUnsupportedOperationException, message = Either glue.id or glue.account-id is set with non-default account. 
Cross account access with fine-grained access control is only supported with AWS Resource Access Manager.
```

确保 Spark 配置 `spark.sql.catalog.catalog_name.glue.account-id` 设置为有效的账户 ID。

## 在 MERGE 操作期间，Iceberg 作业失败并显示“403 访问被拒绝”
<a name="security_iam_fgac-troubleshooting-merge-s3fileio-error"></a>

消息如下：

```
software.amazon.awssdk.services.s3.model.S3Exception: Access Denied (Service: S3, Status Code: 403, 
...
	at software.amazon.awssdk.services.s3.DefaultS3Client.deleteObject(DefaultS3Client.java:3365)
	at org.apache.iceberg.aws.s3.S3FileIO.deleteFile(S3FileIO.java:162)
	at org.apache.iceberg.io.FileIO.deleteFile(FileIO.java:86)
	at org.apache.iceberg.io.RollingFileWriter.closeCurrentWriter(RollingFileWriter.java:129)
```

通过添加以下属性在 Spark 中禁用 S3 删除操作。`--conf spark.sql.catalog.s3-table-name.s3.delete-enabled=false`。