

# 将 Amazon S3 访问权限管控与 Amazon Glue 结合使用
<a name="security-s3-access-grants"></a>

在 Glue 5.0 版中，Amazon S3 访问权限管控提供了一种可扩展的访问控制解决方案，您可以使用该解决方案来增强对 Amazon Glue 中 Amazon S3 数据的访问。如果您的 S3 数据有复杂或大规模的权限配置，则可以使用 S3 访问权限管控来扩展用户和角色的 S3 数据权限。

使用 S3 访问权限管控可增强对 Amazon S3 数据的访问权限，其超出运行时角色或 IAM 角色授予的权限，这些权限附加到具有对 Amazon Glue 作业的访问权限的身份。有关更多信息，请参阅《Amazon S3 用户指南》**中的[使用 S3 Access Grants 管理访问权限](https://docs.amazonaws.cn/AmazonS3/latest/userguide/access-grants.html)。

## Amazon Glue 如何与 S3 访问权限管控结合使用
<a name="security-s3-access-grants-how-it-works"></a>

Amazon Glue 版本 5.0 及更高版本提供与 S3 访问权限管控的本机集成。您可以在 Amazon Glue 上启用 S3 访问权限管控并运行 Spark 作业。当您的 Spark 作业请求获取 S3 数据时，Amazon S3 会提供限定于特定存储桶、前缀或对象的临时凭证。

下面是 Amazon Glue 如何访问 S3 访问权限管控管理访问权限的数据的高级概述。

![\[该图显示 Amazon Glue 如何访问 S3 访问权限管控管理访问权限的数据的高级概述。\]](http://docs.amazonaws.cn/glue/latest/dg/images/glue50-s3-access-grants.png)


1. 用户提交使用 Amazon S3 中存储的数据的 Amazon Glue Spark 作业。

1. Amazon Glue 请求 S3 访问权限管控为允许访问存储桶、前缀或对象的用户提供临时凭证。

1. Amazon Glue 以 Amazon Security Token Service (STS) 令牌的形式为用户返回临时凭证。令牌限定为访问 S3 存储桶、前缀或对象。

1. Amazon Glue 使用 STS 令牌从 S3 中检索数据。

1. Amazon Glue 从 S3 接收数据并将结果返回给用户。

## Amazon Glue 的 S3 访问权限管控注意事项
<a name="security-s3-access-grant-consideration"></a>

将 S3 访问权限管控与 Amazon Glue 结合使用时，请注意以下行为和限制。

**功能支持**
+ Amazon Glue 版本 5.0 及更高版本支持 S3 访问权限管控。
+ 当您将 S3 访问权限管控与 Amazon Glue 结合使用时，Spark 是唯一支持的作业类型。
+ 将 S3 访问权限管控与 Amazon Glue 结合使用时，Delta Lake 和 Hudi 是唯一支持的开放表格式。
+ 以下功能不支持与 S3 访问权限管控结合使用：
  + Apache Iceberg 表
  + 向使用 IAM 角色的 Amazon S3 发送 Amazon CLI 请求
  + 通过开源 S3A 协议访问 S3

**行为注意事项**
+ Amazon Glue 提供凭证缓存来确保用户无需在 Spark 作业中重复请求相同的凭证。因此，Amazon Glue 在请求凭证时总是会请求默认级别的权限。有关更多信息，请参阅《Amazon S3 用户指南》**中的[请求对 S3 数据的访问](https://docs.amazonaws.cn/AmazonS3/latest/userguide/access-grants-credentials.html)。

## 使用 Amazon Glue 设置 S3 访问权限管控
<a name="security-s3-access-grant-setup"></a>

**先决条件**  
调用者或管理员创建了 S3 访问权限管控实例。

**设置 Amazon Glue 策略和作业配置**  
要使用 Amazon Glue 设置 S3 访问权限管控，您必须配置信任和 IAM 策略，并通过作业参数传递配置。

1. 对用于授权的角色（运行会话或作业的 Amazon Glue 角色）配置以下最低信任和 IAM 策略。

   信任策略：

   ```
   {
               "Sid": "Stmt1234567891011",
               "Action": [
                   "sts:AssumeRole",
                   "sts:SetSourceIdentity",
                   "sts:SetContext"
               ],
               "Effect": "Allow",
               "Principal": {
                   "Service": "access-grants.s3.amazonaws.com"
               },
               "Condition": {
                   "StringEquals": {
                       "aws:SourceAccount": "123456789012",
                       "aws:SourceArn": "arn:aws:s3:<region>:123456789012:access-grants/default"
                   }
               }
           }
   ```

   IAM 策略：

   ```
   {
               "Sid": "S3Grants",
               "Effect": "Allow",
               "Action": [
                   "s3:GetDataAccess",
                   "s3:GetAccessGrantsInstanceForPrefix"
               ],
               "Resource": "arn:aws:s3:<region>:123456789012:access-grants/default"
           },
           {
               "Sid": "BucketLevelReadPermissions",
               "Effect": "Allow",
               "Action": [
                   "s3:ListBucket"
               ],
               "Resource": [
                   "arn:aws:s3:::*"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceAccount": "123456789012"
                   },
                   "ArnEquals": {
                       "s3:AccessGrantsInstanceArn": [
                           "arn:aws:s3:<region>:123456789012:access-grants/default"
                       ]
                   }
               }
           },
           {
               "Sid": "ObjectLevelReadPermissions",
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject",
                   "s3:GetObjectVersion",
                   "s3:GetObjectAcl",
                   "s3:GetObjectVersionAcl",
                   "s3:ListMultipartUploadParts"
               ],
               "Resource": [
                   "arn:aws:s3:::*"
               ],
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceAccount": "123456789012"
                   },
                   "ArnEquals": {
                       "s3:AccessGrantsInstanceArn": [
                           "arn:aws:s3:<region>:123456789012:access-grants/default"
                       ]
                   }
               }
           }
   ```

1. 在您的 Amazon Glue 作业中，通过 Amazon Glue 作业参数或 `SparkConf` 传递下面的 Spark 配置。

   ```
   --conf spark.hadoop.fs.s3.s3AccessGrants.enabled=true \
   --conf spark.hadoop.fs.s3.s3AccessGrants.fallbackToIAM=false
   ```