

# Amazon Glue 中的安全性
安全性

Amazon 十分重视云安全性。作为 Amazon 客户，您将从专为满足大多数安全敏感型企业的要求而打造的数据中心和网络架构中受益。

安全性是 Amazon 和您的共同责任。[责任共担模式](https://www.amazonaws.cn/compliance/shared-responsibility-model/)将其描述为云*的*安全性和云*中*的安全性：
+ **云的安全性** – Amazon负责保护在Amazon云中运行Amazon服务的基础架构。Amazon还向您提供可安全使用的服务。作为 [Amazon 合规性计划](https://www.amazonaws.cn/compliance/programs/)的一部分，第三方审核人员将定期测试和验证安全性的有效性。要了解适用于 Amazon Glue 的合规性计划，请参阅[合规性计划范围内的 Amazon 服务](https://www.amazonaws.cn/compliance/services-in-scope/)。
+ **云中的安全性**：您的责任由您使用的 Amazon 服务决定。您还需要对其他因素负责，包括您的数据的敏感性、您公司的要求以及适用的法律法规。

此文档将帮助您了解如何在使用 Amazon Glue 时应用责任共担模型。以下主题说明如何配置 Amazon Glue 以实现您的安全性和合规性目标。您还会了解如何使用其他 Amazon 服务以帮助您监控和保护 Amazon Glue 资源。

**Topics**
+ [

# Amazon Glue 中的数据保护
](data-protection.md)
+ [

# 适用于 Amazon Glue 的 Identity and Access Management
](security-iam.md)
+ [

# Amazon Lake Formation 访问控制模式
](lake-formation-access-control-models.md)
+ [

# 将 Amazon S3 访问权限管控与 Amazon Glue 结合使用
](security-s3-access-grants.md)
+ [

# 将可信身份传播与 Amazon Glue ETL 结合使用
](security-trusted-identity-propagation.md)
+ [

# Amazon Glue 中的日志记录和监控
](logging-and-monitoring.md)
+ [

# 的合规性验证 Amazon Glue
](compliance.md)
+ [

# Amazon Glue 中的故障恢复能力
](disaster-recovery-resiliency.md)
+ [

# Amazon Glue 中的基础结构安全性
](infrastructure-security.md)

# Amazon Glue 中的数据保护
数据保护

Amazon Glue 提供多种功能，旨在帮助保护您的数据。

**Topics**
+ [

# 加密静态数据
](encryption-at-rest.md)
+ [

# 加密传输中数据
](encryption-in-transit.md)
+ [

# FIPS 合规性
](fips-compliance.md)
+ [

# 密钥管理
](key-management.md)
+ [

# Amazon Glue 对其他 Amazon 服务的依赖
](dependency-on-other-services.md)
+ [

# 开发终端节点
](dev-endpoints.md)

# 加密静态数据
加密静态数据

Amazon Glue 支持 [构建可视化 ETL 作业](author-job-glue.md) 和 [使用开发终端节点来开发脚本](dev-endpoint.md) 的静态数据加密。您可以配置提取、转换和加载（ETL）任务和开发终端节点，以使用 [Amazon Key Management Service（Amazon KMS）](https://www.amazonaws.cn/kms/)密钥写入加密的静态数据。您也可以使用您通过 Amazon KMS 管理的密钥加密存储在 [Amazon Glue Data Catalog](components-overview.md#data-catalog-intro) 中的元数据。此外，您可以使用 Amazon KMS 密钥来加密作业书签以及[爬网程序](https://docs.amazonaws.cn/glue/latest/dg/add-crawler.html)和 ETL 作业生成的日志。

您可以加密 Amazon Glue Data Catalog 中的元数据对象，以及由任务、爬网程序和开发终端节点写入 Amazon Simple Storage Service（Amazon S3）和 Amazon CloudWatch Logs 的数据。当您在 Amazon Glue 中创建任务、爬网程序和开发终端节点时，您可以通过附加安全配置来提供加密设置。安全配置包含 Amazon S3 托管的服务器端加密密钥（SSE-S3）或存储在 Amazon KMS 中的客户主密钥（CMK）（SSE-KMS）。您可以使用 Amazon Glue 控制台创建安全配置。

您也可以在账户中启用整个数据目录的加密。您可以通过指定存储在 Amazon KMS 中的 CMK 来执行此操作。

**重要**  
Amazon Glue 仅支持对称客户管理型密钥。有关更多信息，请参阅《Amazon Key Management Service 开发人员指南》中的 [Customer Managed Keys (CMKs)](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#master_keys)**。  


启用加密后，当您添加数据目录对象时，运行爬网程序、运行任务或启动开发终端节点时，SSE-S3 或 SSE-KMS 密钥用于写入静态数据。此外，您可以将 Amazon Glue 配置为仅通过受信任的传输层安全性 (TLS) 协议访问 Java 数据库连接 (JDBC) 数据存储。

在 Amazon Glue 中，您可以在以下位置控制加密设置：
+ 数据目录的设置。
+ 您创建的安全配置。
+ 作为参数传递给 Amazon Glue ETL（提取、转换和加载）任务的服务器端加密设置（SSE-S3 或 SSE-KMS）。

有关如何设置加密的更多信息，请参阅 [在 Amazon Glue 中设置加密](set-up-encryption.md)。

**Topics**
+ [

# 加密数据目录
](encrypt-glue-data-catalog.md)
+ [

# 加密连接密码
](encrypt-connection-passwords.md)
+ [

# 加密 Amazon Glue 写入的数据
](encryption-security-configuration.md)

# 加密数据目录
加密数据目录

Amazon Glue Data Catalog 加密可提高敏感数据的安全性。Amazon Glue与 Amazon Key Management Service（Amazon KMS）集成，以加密存储在数据目录中的元数据。您可以使用 Amazon Glue 控制台或 Amazon CLI，为数据目录中的资源启用或禁用加密设置。

为数据目录启用加密时，您创建的所有新对象都将被加密。禁用加密后，您创建的新对象将不会被加密，但现有的加密对象将保持加密状态。

您可以使用 Amazon 托管加密密钥或客户管理型加密密钥对整个数据目录进行加密。有关密钥类型和状态的更多信息，请参阅《Amazon Key Management Service 开发人员指南》中的 [Amazon Key Management Service 概念](https://docs.amazonaws.cn/kms/latest/developerguide/key-state.html#key-state-cmk-type)。

**注意**  
将加密的数据目录与爬网程序一起使用时，必须保持加密设置。如果在爬网程序处理完加密目录之后移除加密设置，则会导致错误。如果需要移除加密设置，请创建一个新的爬网程序而不是修改现有的爬网程序。

## Amazon 托管密钥


 Amazon 托管密钥是由与 Amazon KMS集成的 Amazon 服务代表您在账户中创建、管理和使用的 KMS 密钥。可以在 Amazon CloudTrail 日志中查看账户中的 Amazon 托管密钥，查看其密钥策略以及审计其使用情况。但是，您无法管理这些 KMS 钥或更改其权限。

静态加密自动集成 Amazon KMS，从而管理 Amazon Glue 用于加密元数据的 Amazon 托管密钥。如果启用元数据加密时 Amazon 托管密钥尚不存在，Amazon KMS 将自动为您创建新密钥。

有关更多信息，请参阅 [Amazon 托管式密钥](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#aws-managed-cmk)。

## 客户自主管理型密钥


客户托管密钥是在您的 Amazon Web Services 账户 中创建、拥有和托管的 KMS 密钥。您对 KMS 密钥拥有全部控制权。您可以：
+  建立和维护密钥政策、IAM 策略和授权 
+ 启用和禁用密钥
+  轮换加密材料 
+  添加标签 
+ 创建引用密钥的别名
+  计划密钥的删除

有关管理客户管理型密钥权限的更多信息，请参阅[客户管理型密钥](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#customer-cmk)。

**重要**  
Amazon Glue 仅支持对称客户管理型密钥。KMS 密钥列表仅显示对称密钥。但是，如果选择了**选择 KMS 密钥 ARN**，则可通过控制台输入任何密钥类型的 ARN。确保仅为对称密钥输入 ARN。  
要创建对称客户管理型密钥，请按照《Amazon Key Management Service 开发人员指南》中的 [creating symmetric customer managed keys](https://docs.amazonaws.cn/kms/latest/developerguide/create-keys.html#create-symmetric-cmk) 部分的步骤进行操作。

启用数据目录静态加密时，将使用 KMS 密钥对以下资源类型进行加密：
+ 数据库
+ 表
+ 分区
+ 表格版本
+ 列统计数据
+ 用户定义的函数
+ 数据目录视图

## Amazon Glue 加密上下文


 [加密上下文](https://docs.amazonaws.cn/kms/latest/developerguide/concepts.html#encrypt_context)是一组可选的键值对，包含有关数据的其他上下文信息。Amazon KMS 会将加密上下文用作[其他已经过验证的数据](https://docs.amazonaws.cn/crypto/latest/userguide/cryptography-concepts.html#term-aad)以支持[经过身份验证的加密](https://docs.amazonaws.cn/crypto/latest/userguide/cryptography-concepts.html#define-authenticated-encryption)。在请求中包含加密上下文以加密数据时，Amazon KMS 将加密上下文绑定到加密的数据。要解密数据，请在请求中包含相同的加密上下文。Amazon Glue 在所有 Amazon KMS 加密操作中使用相同的加密上下文，其中键为 `glue_catalog_id`，值为 `catalogId`。

```
"encryptionContext": {
    "glue_catalog_id": "111122223333"
}
```

 使用 Amazon 托管密钥或对称的户管理型密钥来加密数据目录时，还可以使用审计记录和日志中的加密上下文来识别密钥的使用情况。加密上下文还会显示在 Amazon CloudTrail 生成的日志或 Amazon CloudWatch 日志中。

## 启用加密


 您可以通过 Amazon Glue 控制台中的**数据目录设置**，或者使用 Amazon CLI 为 Amazon Glue Data Catalog 对象启用加密。

------
#### [ Console ]

**使用控制台启用加密**

1. 登录 Amazon Web Services 管理控制台，然后打开 Amazon Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.amazonaws.cn/glue/)。

1. 在导航窗格中，选择**数据目录**。

1. 在**数据目录设置**页面上，选中**元数据加密**复选框，然后选择一个 Amazon KMS 密钥。

   启用加密时，如果您未指定客户管理型密钥，则加密设置将使用 Amazon 托管 KMS 密钥。

1. （可选）如果您使用客户管理型密钥加密数据目录，Data Cat alog提供了一个用于注册 IAM 角色来加密和解密资源的选项。您需要向您的 IAM 角色授予 Amazon Glue 可以代表代入的权限。这包括加密和解密数据的 Amazon KMS 权限。

   当您在数据目录中创建新资源时，Amazon Glue 将代入所提供的 IAM 角色来加密数据。同样，当使用者访问资源时，Amazon Glue 也会代入该 IAM 角色来解密数据。如果您注册了具有所需权限的 IAM 角色，则调用主体不再需要访问密钥和解密数据的权限。
**重要**  
只有当您使用客户管理型密钥加密数据目录资源时，您才能将 KMS 操作委派给 IAM 角色。KMS 角色委派功能目前不支持使用 Amazon 托管密钥加密数据目录资源的情形。
**警告**  
当您启用 IAM 角色委派 KMS 操作的权限时，您将无法再访问以前使用 Amazon 托管密钥加密的数据目录资源。

   1. 要启用 Amazon Glue 可以代入以代表您加密和解密数据的 IAM 角色，请选择**将 KMS 操作委派给 IAM 角色**选项。

   1. 然后选择一个 IAM 角色。

      要创建 IAM 角色，请参阅 [为 Amazon Glue 创建 IAM 角色](https://docs.amazonaws.cn/glue/latest/dg/create-an-iam-role.html)。

      Amazon Glue 访问数据目录时将代入的 IAM 角色必须具有加密和解密数据目录中元数据的权限。您可以创建一个 IAM 角色并附加以下内联策略：
      + 添加以下策略以包括加密和解密数据目录的 Amazon KMS 权限。

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

****  

        ```
        {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:GenerateDataKey"
              ],
              "Resource": "arn:aws:kms:us-east-1:111122223333:key/<key-id>"
            }
          ]
        }
        ```

------
      + 然后将以下信任策略添加到该角色，以便 Amazon Glue 服务代入该 IAM 角色。

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

****  

        ```
        {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
            {
              "Sid": "",
              "Effect": "Allow",
              "Principal": {
                "Service": "glue.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
            }
          ]
        }
        ```

------
      + 然后向该 IAM 角色添加 `iam:PassRole` 权限。

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

****  

        ```
        {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "iam:PassRole"
              ],
              "Resource": [
                "arn:aws:iam::111122223333:role/<encryption-role-name>"
              ]
            }
          ]
        }
        ```

------

   启用加密后，如果您尚未指定 Amazon Glue 要代入的 IAM 角色，则访问数据目录的主体必须具有执行以下 API 操作的权限：
   + `kms:Decrypt`
   + `kms:Encrypt`
   + `kms:GenerateDataKey`

------
#### [ Amazon CLI ]

**使用开发工具包或 Amazon CLI 启用加密**
+ 使用 `PutDataCatalogEncryptionSettings` API 操作。如果未指定密钥，Amazon Glue 将使用客户账户的 Amazon 托管加密密钥对数据目录进行加密。

  ```
  aws glue put-data-catalog-encryption-settings \
    --data-catalog-encryption-settings '{
        "EncryptionAtRest": {
        "CatalogEncryptionMode": "SSE-KMS-WITH-SERVICE-ROLE",
        "SseAwsKmsKeyId": "arn:aws:kms:<region>:<account-id>:key/<key-id>",
        "CatalogEncryptionServiceRole":"arn:aws:iam::<account-id>:role/<encryption-role-name>"
      }
  
    }'
  ```

------

 启用加密后，您在数据目录对象中创建的所有对象都将被加密。如果您清除此设置，您在数据目录中创建的对象将不再加密。您可以继续使用所需的 KMS 权限访问数据目录中现有的加密对象。


|  | 
| --- |
|   对于在数据目录中使用 Amazon KMS 密钥加密的任何对象，此密钥必须在 Amazon KMS 密钥存储中保持可用。如果删除密钥，则无法再对对象进行解密。在某些情况下，您可能希望阻止访问数据目录元数据。   | 

## 监控用于 Amazon Glue 的 KMS 密钥


 当您将 KMS 密钥用于数据目录资源时，您可以使用 Amazon CloudTrail 或 Amazon CloudWatch 日志来跟踪 Amazon Glue 发送到 Amazon KMS的请求。Amazon CloudTrail 会监控并记录 Amazon Glue 为了访问使用您的 KMS 密钥加密的数据而调用的 KMS 操作。

 以下是 `Decrypt` 和 `GenerateDataKey` 操作的 Amazon CloudTrail 事件示例。

------
#### [ Decrypt ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAXPHTESTANDEXAMPLE:Sampleuser01",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/Sampleuser01",
        "accountId": "111122223333",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAXPHTESTANDEXAMPLE",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "111122223333",
                "userName": "Admin"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2024-01-10T14:33:56Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "glue.amazonaws.com"
    },
    "eventTime": "2024-01-10T15:18:11Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "Decrypt",
    "awsRegion": "eu-west-2",
    "sourceIPAddress": "glue.amazonaws.com",
    "userAgent": "glue.amazonaws.com",
    "requestParameters": {
        "encryptionContext": {
            "glue_catalog_id": "111122223333"
        },
        "encryptionAlgorithm": "SYMMETRIC_DEFAULT"
    },
    "responseElements": null,
    "requestID": "43b019aa-34b8-4798-9b98-ee968b2d63df",
    "eventID": "d7614763-d3fe-4f84-a1e1-3ca4d2a5bbd5",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:<region>:111122223333:key/<key-id>"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management",
    "sessionCredentialFromConsole": "true"
}
```

------
#### [ GenerateDataKey ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "AROAXPHTESTANDEXAMPLE:V_00_GLUE_KMS_GENERATE_DATA_KEY_111122223333",
        "arn": "arn:aws:sts::111122223333:assumed-role/Admin/V_00_GLUE_KMS_GENERATE_DATA_KEY_111122223333",
        "accountId": "111122223333",
        "accessKeyId": "AKIAIOSFODNN7EXAMPLE",
        "sessionContext": {
            "sessionIssuer": {
                "type": "Role",
                "principalId": "AROAXPHTESTANDEXAMPLE",
                "arn": "arn:aws:iam::111122223333:role/Admin",
                "accountId": "AKIAIOSFODNN7EXAMPLE",
                "userName": "Admin"
            },
            "webIdFederationData": {},
            "attributes": {
                "creationDate": "2024-01-05T21:15:47Z",
                "mfaAuthenticated": "false"
            }
        },
        "invokedBy": "glue.amazonaws.com"
    },
    "eventTime": "2024-01-05T21:15:47Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKey",
    "awsRegion": "eu-west-2",
    "sourceIPAddress": "glue.amazonaws.com",
    "userAgent": "glue.amazonaws.com",
    "requestParameters": {
        "keyId": "arn:aws:kms:eu-west-2:AKIAIOSFODNN7EXAMPLE:key/AKIAIOSFODNN7EXAMPLE",
        "encryptionContext": {
            "glue_catalog_id": "111122223333"
        },
        "keySpec": "AES_256"
    },
    "responseElements": null,
    "requestID": "64d1783a-4b62-44ba-b0ab-388b50188070",
    "eventID": "1c73689b-2ef2-443b-aed7-8c126585ca5e",
    "readOnly": true,
    "resources": [
        {
            "accountId": "111122223333",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:eu-west-2:111122223333:key/AKIAIOSFODNN7EXAMPLE"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "111122223333",
    "eventCategory": "Management"
}
```

------

```
      
```

# 加密连接密码
加密连接密码

您可以使用 `GetConnection` 和 `GetConnections` API 操作在 Amazon Glue Data Catalog 中检索连接密码。这些密码存储在数据目录连接中，并在 Amazon Glue 连接到 Java 数据库连接（JDBC）数据存储时使用。创建或更新连接时，数据目录设置中有一个选项确定密码是否已加密，如果已加密，则确定指定了哪个 Amazon Key Management Service（Amazon KMS）密钥。

在 Amazon Glue 控制台中，您可以在 **Data catalog settings (数据目录设置)** 页面上启用该选项：

**加密连接密码**

1. 登录 Amazon Web Services 管理控制台，然后打开 Amazon Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.amazonaws.cn/glue/)。

1. 在导航窗格中，选择 **Settings (设置)**。

1. 在 **Data catalog settings (数据目录设置)** 页面上，选择 **Encrypt connection passwords (加密连接密码)**，然后选择一个 Amazon KMS 密钥。
**重要**  
Amazon Glue 只支持对称客户主密钥（CMK）。**Amazon KMS key (Amazon KMS 密钥)** 列表仅显示对称密钥。但是，如果选择 **Choose a Amazon KMS key ARN (选择 Amazon KMS 密钥 ARN)**，控制台允许您为任何密钥类型输入 ARN。确保仅为对称密钥输入 ARN。

   有关更多信息，请参阅 [Data Catalog 设置](console-data-catalog-settings.md)。

# 加密 Amazon Glue 写入的数据
加密 Amazon Glue 写入的数据

*安全配置*是 Amazon Glue 可以使用的一组安全属性。您可以使用安全配置加密静态数据。以下场景显示了使用安全配置的一些方法。
+ 将安全配置附加到 Amazon Glue 爬网程序以写入加密的 Amazon CloudWatch Logs。有关将安全配置附加到爬网程序的更多信息，请参阅 [步骤 3：配置安全设置](define-crawler-configure-security-settings.md)。
+ 将安全配置附加到提取、转换和加载（ETL）任务以写入加密的 Amazon Simple Storage Service（Amazon S3）目标和加密的 CloudWatch Logs。
+ 将安全配置附加到 ETL 任务以将其任务书签作为加密 Amazon S3 数据写入。
+ 将安全配置附加到开发终端节点以写入加密的 Amazon S3 目标。

**重要**  
目前，安全配置会覆盖作为 ETL 任务参数传递的任何服务器端加密（SSE-S3）设置。因此，如果安全配置和 SSE-S3 参数都与作业关联，则忽略 SSE-S3 参数。

有关安全配置的更多信息，请参阅 [在 Amazon Glue 控制台上管理安全配置](console-security-configurations.md)。

**Topics**
+ [

## 将 Amazon Glue 设置为使用安全配置
](#encryption-setup-Glue)
+ [

## 为 VPC 作业和爬网程序创建到 Amazon KMS 的路由
](#encryption-kms-vpc-endpoint)
+ [

# 在 Amazon Glue 控制台上管理安全配置
](console-security-configurations.md)

## 将 Amazon Glue 设置为使用安全配置


请按照以下步骤设置您的 Amazon Glue 环境以使用安全配置。

1. 创建或更新您的 Amazon Key Management Service（Amazon KMS）密钥，向传递到 Amazon Glue 爬网程序和任务的 IAM 角色授予 Amazon KMS 权限以加密 CloudWatch Logs。有关更多信息，请参阅 *Amazon CloudWatch Logs 用户指南*中的[使用 Amazon KMS 更改 CloudWatch Logs 中的日志数据](https://docs.amazonaws.cn/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html)。

   在下面的示例中，*"role1"*、*"role2"* 和 *"role3"* 是传递到爬网程序和任务的 IAM 角色。

   ```
   {
          "Effect": "Allow",
          "Principal": { "Service": "logs.region.amazonaws.com",
          "AWS": [
                   "role1",
                   "role2",
                   "role3"
                ] },
                       "Action": [
                              "kms:Encrypt*",
                              "kms:Decrypt*",
                              "kms:ReEncrypt*",
                              "kms:GenerateDataKey*",
                              "kms:Describe*"
                       ],
                       "Resource": "*"
   }
   ```

   如果您使用此密钥加密 CloudWatch Logs，则需要 `Service` 语句（显示为 `"Service": "logs.region.amazonaws.com"`）。

1. 确保 Amazon KMS 密钥为 `ENABLED`，然后才可使用。

**注意**  
如果您使用 Iceberg 作为数据湖框架，则 Iceberg 表有自己的机制来启用服务器端加密。除了 Amazon Glue 的安全配置外，您还应该启用这些配置。要在 Iceberg 表上启用服务器端加密，请查看 [Iceberg 文档](https://iceberg.apache.org/docs/latest/aws/#s3-server-side-encryption)中的指南。

## 为 VPC 作业和爬网程序创建到 Amazon KMS 的路由
创建到 Amazon KMS 的路由

您可以通过 Virtual Private Cloud (VPC) 中的私有端点直接连接到 Amazon KMS，而不是通过互联网连接。当您使用 VPC 端点时，您的 VPC 和 Amazon KMS 之间的通信完全在 Amazon 网络内进行。

您可以在 VPC 中创建 Amazon KMS VPC 端点。如果没有此步骤，您的任务或爬网程序可能会失败，任务上具有 `kms timeout` 或爬网程序上具有 `internal service exception`。有关详细说明，请参阅 *Amazon Key Management Service 开发人员指南*中的[通过 VPC 终端节点连接到 Amazon KMS](https://docs.amazonaws.cn/kms/latest/developerguide/kms-vpc-endpoint.html)。

当您按照以下说明操作时，在 [VPC 控制台](https://console.amazonaws.cn//vpc)上，您必须执行以下操作：
+ 选择 **Enable Private DNS name (启用私有 DNS 名称)**。
+ 选择 **Security group (安全组)**（带自引用规则），此安全组将用于访问 Java 数据库连接 (JDBC) 的任务或爬网程序。有关 Amazon Glue 连接的更多信息，请参阅 [连接到数据](glue-connections.md)。

当您将安全配置添加到访问 JDBC 数据存储的爬网程序或任务时，Amazon Glue 必须具有到 Amazon KMS 终端节点的路由。您可以使用网络地址转换 (NAT) 网关或 Amazon KMS VPC 端点提供路由。要创建 NAT 网关，请参阅 *Amazon VPC 用户指南*中的 [NAT 网关](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-nat-gateway.html)。

# 在 Amazon Glue 控制台上管理安全配置
在 Amazon Glue 控制台上管理安全配置

**警告**  
Ray 作业目前不支持 Amazon Glue 安全配置。

Amazon Glue 中的*安全配置*包含当您写入加密数据时所需的属性。您在 Amazon Glue 控制台上创建安全配置，以提供由爬网程序、作业和开发终端节点使用的加密属性。

要查看您创建的所有安全配置的列表，请点击 [https://console.aws.amazon.com/glue/](https://console.amazonaws.cn/glue/) 打开 Amazon Glue 控制台，然后在导航窗格中选择 **Security configurations (安全配置)**。

**Security configurations (安全配置)** 列表显示有关每个配置的以下属性：

**名称**  
在创建配置时提供的唯一名称。名称可以包含字母（A-Z）、数字（0-9）、连字符（-）、或下划线（\$1），且长度最多为 255 个字符。

**启用 Amazon S3 加密**  
如果开启，对于数据目录中的元数据存储会启用 Amazon Simple Storage Service（Amazon S3）加密模式（如 `SSE-KMS` 或 `SSE-S3`）。

**启用 Amazon CloudWatch Logs 加密**  
如果启用，在向 Amazon CloudWatch 写入日志时会使用 Amazon S3 加密模式（如 `SSE-KMS`）。

**高级设置：启用作业书签加密**  
如果启用，在将作业添加到书签时会使用 Amazon S3 加密模式（如 `CSE-KMS`）。

您可以在控制台上的 **Security configurations (安全配置)** 部分中添加或删除配置。要查看配置的详细信息，请在列表中选择配置名称。详细信息包括您在创建配置时定义的信息。

## 添加安全配置
添加安全配置

 要使用 Amazon Glue 控制台添加安全配置，请在 **Security configurations (安全配置)** 页面上选择 **Add security configuration (添加安全配置)**。

![\[屏幕截图显示添加安全配置页面。\]](http://docs.amazonaws.cn/glue/latest/dg/images/add_security_configuration.png)


 **安全配置属性** 

 输入唯一的安全配置名称。名称可以包含字母（A-Z）、数字（0-9）、连字符（-）、或下划线（\$1），且长度最多为 255 个字符。

 **加密设置** 

您可以对存储在 Amazon S3 的 Data Catalog 和 Amazon CloudWatch 的日志中的元数据启用静态加密。要在 Amazon Glue 控制台上使用 Amazon Key Management Service (Amazon KMS) 密钥对数据和元数据加密，请向控制台用户添加一个策略。此策略必须将允许的资源指定为用于对 Amazon S3 数据存储进行加密的密钥 Amazon Resource Names（ARN），如以下示例所示。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": {
    "Effect": "Allow",
    "Action": [
      "kms:GenerateDataKey",
      "kms:Decrypt",
      "kms:Encrypt"
    ],
    "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id"
  }
}
```

------

**重要**  
当安全配置附加到爬网程序或任务时，传递的 IAM 角色必须具有 Amazon KMS 权限。有关更多信息，请参阅 [加密 Amazon Glue 写入的数据](encryption-security-configuration.md)。

在定义配置时，您可以为以下属性提供值：

**启用 S3 加密**  
当您写入 Amazon S3 数据时，您可以将服务器端加密与 Amazon S3 托管密钥（SSE-S3）结合使用，也可以将服务器端加密（SSE-KMS）与 Amazon KMS 托管密钥结合使用。该字段是可选的。要允许访问 Amazon S3，请选择 Amazon KMS 密钥，或选择 **Enter a key ARN (输入密钥 ARN)** 并提供密钥的 ARN。输入 `arn:aws:kms:region:account-id:key/key-id` 格式的 ARN。您也可以提供密钥别名形式的 ARN，例如 `arn:aws:kms:region:account-id:alias/alias-name`。  
如果您为作业启用 Spark 用户界面，则上传到 Amazon S3 的 Spark 用户界面日志文件将采用相同的加密方式。  
Amazon Glue 只支持对称客户主密钥（CMK）。**Amazon KMS key (Amazon KMS 密钥)** 列表仅显示对称密钥。但是，如果选择 **Choose a Amazon KMS key ARN (选择 Amazon KMS 密钥 ARN)**，控制台允许您为任何密钥类型输入 ARN。确保仅为对称密钥输入 ARN。

**启用 CloudWatch 日志加密**  
服务器端加密（SSE-KMS）用于加密 CloudWatch Logs。该字段是可选的。要启用它，请选择 Amazon KMS 密钥，或选择 **Enter a key ARN (输入密钥 ARN)** 并提供密钥的 ARN。输入 `arn:aws:kms:region:account-id:key/key-id` 格式的 ARN。您也可以提供密钥别名形式的 ARN，例如 `arn:aws:kms:region:account-id:alias/alias-name`。

**高级设置：作业书签加密**  
客户端 (CSE-KMS) 加密用于加密作业书签。该字段是可选的。书签数据先进行加密，然后再发送到 Amazon S3 进行存储。要启用它，请选择 Amazon KMS 密钥，或选择 **Enter a key ARN (输入密钥 ARN)** 并提供密钥的 ARN。输入 `arn:aws:kms:region:account-id:key/key-id` 格式的 ARN。您也可以提供密钥别名形式的 ARN，例如 `arn:aws:kms:region:account-id:alias/alias-name`。

有关更多信息，请参阅 *Amazon Simple Storage Service 用户指南*中的以下主题：
+ 有关 `SSE-S3` 的更多信息，请参阅[使用具有 Amazon S3 托管加密密钥 (SSE-S3) 的服务器端加密 (SSE-S3) 保护数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingServerSideEncryption.html)。
+ 有关 `SSE-KMS` 的更多信息，请参阅 [Protecting Data Using Server-Side Encryption with Amazon KMS keys](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingKMSEncryption.html)。
+ 有关 `CSE-KMS` 的信息，请参阅 [Using a KMS key stored in Amazon KMS](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingClientSideEncryption.html#client-side-encryption-kms-managed-master-key-intro)。

# 加密传输中数据
加密传输中数据



Amazon 为传输中数据提供传输层安全性 (TLS) 加密。您可以使用 Amazon Glue 中的[安全配置](https://docs.amazonaws.cn/glue/latest/dg/console-security-configurations.html)为爬网程序、ETL 任务和开发端点配置加密设置。您可以通过数据目录的设置启用 Amazon Glue Data Catalog 加密。

截至 2018 年 9 月 4 日，支持用于 Amazon Glue ETL 和 Amazon Glue Data Catalog 的 Amazon KMS（*自带密钥*和*服务器端加密*）。

# FIPS 合规性


如果在通过命令行界面或 API 访问 Amazon 时需要经过 FIPS 140-2 验证的加密模块，请使用 FIPS 端点。有关可用的 FIPS 端点的更多信息，请参阅[《美国联邦信息处理标准（FIPS）第 140-2 版》](https://www.amazonaws.cn/compliance/fips/)。

# 密钥管理
密钥管理

您可以使用具有 Amazon Glue 的 Amazon Identity and Access Management（IAM）来定义用户、Amazon 资源、组、角色和有关访问、拒绝等的精细策略。

您可以根据组织的需要，同时使用基于资源和基于身份的策略来定义对元数据的访问。基于资源的策略列出了允许或拒绝访问您的资源的委托人，允许您设置跨账户访问等策略。身份策略专门附加到 IAM 中的用户、组和角色。

有关分步示例，请参阅 Amazon 大数据博客中的 [Restrict access to your Amazon Glue Data Catalog with resource-level IAM permissions and resource-based policies](https://www.amazonaws.cn/blogs/big-data/restrict-access-to-your-aws-glue-data-catalog-with-resource-level-iam-permissions-and-resource-based-policies/)。

策略的精细访问部分在 `Resource` 条款中进行了定义。此部分定义了可执行此操作的 Amazon Glue Data Catalog 对象，以及该操作将返回哪些对象。

*开发终端节点* 是可用于开发和测试您的 Amazon Glue 脚本的环境。您可以添加、删除或轮换开发终端节点的 SSH 密钥。

截至 2018 年 9 月 4 日，支持用于 Amazon Glue ETL 和 Amazon Glue Data Catalog 的 Amazon KMS（*自带密钥*和*服务器端加密*）。

# Amazon Glue 对其他 Amazon 服务的依赖


某个用户要能够使用 Amazon Glue 控制台，必须拥有一组允许其使用其 Amazon 账户的 Amazon Glue 资源的最低权限。除这些 Amazon Glue 权限以外，控制台还需要来自以下服务的权限：
+ 用于显示日志的 Amazon CloudWatch Logs 权限。
+ 用于列出并传递角色的 Amazon Identity and Access Management（IAM）权限。
+ 用于处理堆栈的 Amazon CloudFormation 权限。
+ 用于列出Virtual Private Cloud（VPC）、子网、安全组、实例和其他对象（用于在运行任务、爬虫程序和创建开发终端节点时设置 Amazon EC2 项目，如 VPC）的 Amazon Elastic Compute Cloud（Amazon EC2）权限。
+ 用于列出存储桶和对象以及检索和保存脚本的 Amazon Simple Storage Service（Amazon S3）权限。
+ 用于使用集群的 Amazon Redshift 权限。
+ 用于列出实例的 Amazon Relational Database Service（Amazon RDS）权限。

# 开发终端节点


开发终端节点是可用于开发和测试您的 Amazon Glue 脚本的环境。您可以使用 Amazon Glue 创建、编辑和删除开发终端节点。您可以列出所有已创建的开发端点。您可以添加、删除或轮换开发终端节点的 SSH 密钥。您还可以创建使用开发终端节点的笔记本。

您提供配置值以预置开发环境。这些值告知 Amazon Glue 如何设置网络，以便您可以安全地访问开发终端节点，并且您的端点可以访问您的数据存储。然后，您可以创建连接到开发终端节点的笔记本。您可以使用笔记本编写和测试 ETL 脚本。

选择一个 Amazon Identity and Access Management（IAM）角色，该角色与您用于运行 Amazon Glue ETL 任务的 IAM 角色具有相似的权限。使用 Virtual Private Cloud（VPC）、子网和安全组创建可以安全地连接到您的数据资源的开发终端节点。您可以生成一个 SSH 密钥对，以使用 SSH 连接到开发环境。

您可以使用 JDBC 在用于访问数据集的 VPC 中为 Amazon S3 数据创建开发终端节点。

您可以在本地计算机上安装 Jupyter notebook，并使用它在开发端点上调试和测试 ETL 脚本。或者，您可以使用 Sagemaker 笔记本在 Amazon 上的 JupyterLab 中编写 ETL 脚本。请参阅[将 SageMaker 笔记本与您的开发端点结合使用](https://docs.amazonaws.cn/glue/latest/dg/dev-endpoint-tutorial-sage.html)。

Amazon Glue 使用前缀为 `aws-glue-dev-endpoint` 的名称标记 Amazon EC2 实例。

您可以在开发端点上设置笔记本服务器，以运行具有 Amazon Glue 扩展的 PySpark。

# 适用于 Amazon Glue 的 Identity and Access Management
Identity and access management



Amazon Identity and Access Management（IAM）是一项，Amazon Web Services 服务可以帮助管理员安全地控制对 Amazon 资源的访问。IAM 管理员控制谁可以通过*身份验证*（登录）并*授权*（具有权限）使用 Amazon Glue 资源。IAM 是一项无需额外费用即可使用的。Amazon Web Services 服务

**注意**  
您可以使用 Amazon Glue 方法或 Amazon Lake Formation 授权来授予对 Amazon Glue Data Catalog 中数据的访问权限。您可以使用 Amazon Identity and Access Management（IAM）policy 用 Amazon Glue 方法设置精细访问控制。Lake Formation 使用更简单的 `GRANT/REVOKE` 权限模型，类似于关系数据库系统中的 `GRANT/REVOKE` 命令。  
本节包括有关如何使用 Amazon Glue 方法的信息。有关使用 Lake Formation 授权的信息，请参阅 *Amazon Lake Formation 开发人员指南*中的[授予 Lake Formation 权限](https://docs.amazonaws.cn/lake-formation/latest/dg/lake-formation-permissions.html)。

**Topics**
+ [

## 受众
](#security_iam_audience)
+ [

## 使用身份进行身份验证
](#security_iam_authentication)
+ [

## 使用策略管理访问
](#security_iam_access-manage)
+ [

# Amazon Glue 如何与 IAM 协同工作
](security_iam_service-with-iam.md)
+ [

# 为 Amazon Glue 配置 IAM 权限
](configure-iam-for-glue.md)
+ [

# Amazon Glue 访问控制策略示例
](glue-policy-examples.md)
+ [

# 授予 Amazon Glue 的 Amazon 托管式策略
](security-iam-awsmanpol.md)
+ [

# 为作业执行授予动态范围限定策略
](dynamically-scoped-policies.md)
+ [

# 指定 Amazon Glue 资源 ARN
](glue-specifying-resource-arns.md)
+ [

# 授予跨账户访问权限
](cross-account-access.md)
+ [

# 对 Amazon Glue 身份和访问进行故障排除
](security_iam_troubleshoot.md)

## 受众


您使用 Amazon Identity and Access Management（IAM）的方式因您的角色而异：
+ **服务用户**：如果您无法访问功能，请从管理员处请求权限（请参阅[对 Amazon Glue 身份和访问进行故障排除](security_iam_troubleshoot.md)）
+ **服务管理员**：确定用户访问权限并提交权限请求（请参阅[Amazon Glue 如何与 IAM 协同工作](security_iam_service-with-iam.md)）
+ **IAM 管理员**：编写用于管理访问权限的策略（请参阅[适用于 Amazon Glue 的基于身份的策略示例](security_iam_id-based-policy-examples.md)）

## 使用身份进行身份验证


身份验证是您使用身份凭证登录 Amazon 的方法。您必须作为 Amazon Web Services 账户根用户、IAM 用户或通过担任 IAM 角色进行身份验证。

对于编程访问，Amazon 提供了 SDK 和 CLI 来对请求进行加密签名。有关更多信息，请参阅*《IAM 用户指南》*中的[适用于 API 请求的 Amazon 签名版本 4](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_sigv.html)。

### Amazon Web Services 账户 根用户


 当您创建 Amazon Web Services 账户 时，最初使用的是一个对所有 Amazon Web Services 服务和资源拥有完全访问权限的登录身份（称为 Amazon Web Services 账户*根用户*）。我们强烈建议不要使用根用户进行日常任务。有关需要根用户凭证的任务，请参阅《IAM 用户指南》**中的[需要根用户凭证的任务](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_root-user.html#root-user-tasks)。

### 联合身份


作为最佳实践，请要求人类用户必须使用带有身份提供者的联合身份验证才能使用临时凭证访问 Amazon Web Services 服务。

*联合身份*是来自企业目录、Web 身份提供者的用户，或 Amazon Directory Service 中的用户（这些用户使用来自身份源的凭证访问 Amazon Web Services 服务）。联合身份代入可提供临时凭证的角色。

### IAM 用户和群组


*[IAM 用户](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_users.html)*是对某个人员或应用程序具有特定权限的一个身份。建议使用临时凭证，而非具有长期凭证的 IAM 用户。有关更多信息，请参阅*《IAM 用户指南》*中的[要求人类用户使用带有身份提供商的联合身份验证才能使用临时凭证访问 Amazon](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html#bp-users-federation-idp)。

[https://docs.amazonaws.cn/IAM/latest/UserGuide/id_groups.html](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_groups.html)指定一组 IAM 用户，便于更轻松地对大量用户进行权限管理。有关更多信息，请参阅*《IAM 用户指南》*中的 [IAM 用户使用案例](https://docs.amazonaws.cn/IAM/latest/UserGuide/gs-identities-iam-users.html)。

### IAM 角色


*[IAM 角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)*是具有特定权限的身份，可提供临时凭证。您可以通过[从用户切换到 IAM 角色（控制台）](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_use_switch-role-console.html)或调用 Amazon CLI 或 Amazon API 操作来担任角色。有关更多信息，请参阅《IAM 用户指南》**中的[担任角色的方法](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_manage-assume.html)。

IAM 角色对于联合用户访问、临时 IAM 用户权限、跨账户访问、跨服务访问以及在 Amazon EC2 上运行的应用程序非常有用。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

## 使用策略管理访问


您将创建策略并将其附加到 Amazon 身份或资源，以控制 Amazon 中的访问。策略在与身份或资源关联时定义权限。当主体发出请求时，Amazon 会评估这些策略。大多数策略在 Amazon 中存储为 JSON 文档。有关 JSON 策略文档的更多信息，请参阅*《IAM 用户指南》*中的 [JSON 策略概述](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#access_policies-json)。

管理员使用策略，通过定义哪个**主体**可以在什么**条件**下对哪些**资源**执行哪些**操作**来指定谁有权访问什么。

默认情况下，用户和角色没有权限。IAM 管理员创建 IAM 策略并将其添加到角色中，然后用户可以担任这些角色。IAM 策略定义权限，与执行操作所用的方法无关。

### 基于身份的策略


基于身份的策略是您附加到身份（用户、组或角色）的 JSON 权限策略文档。这些策略控制身份可以执行什么操作、对哪些资源执行以及在什么条件下执行。要了解如何创建基于身份的策略，请参阅《IAM 用户指南》**中的[使用客户管理型策略定义自定义 IAM 权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html)。

基于身份的策略可以是*内联策略*（直接嵌入到单个身份中）或*托管策略*（附加到多个身份的独立策略）。要了解如何在托管策略和内联策略之间进行选择，请参阅*《IAM 用户指南》*中的[在托管策略与内联策略之间进行选择](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies-choosing-managed-or-inline.html)。

### 基于资源的策略


基于资源的策略是附加到资源的 JSON 策略文档。示例包括 IAM *角色信任策略*和 Amazon S3 *存储桶策略*。在支持基于资源的策略的服务中，服务管理员可以使用它们来控制对特定资源的访问。您必须在基于资源的策略中[指定主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html)。

基于资源的策略是位于该服务中的内联策略。您不能在基于资源的策略中使用来自 IAM 的 Amazon 托管策略。

### 其他策略类型


Amazon 支持额外的策略类型，这些策略类型可以设置由更常用的策略类型授予的最大权限：
+ **权限边界** – 设置基于身份的策略可以授予 IAM 实体的最大权限。有关更多信息，请参阅《 IAM 用户指南》**中的 [IAM 实体的权限边界](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_boundaries.html)。
+ **服务控制策略（SCP）**– 指定 Amazon Organizations 中组织或组织单元的最大权限。有关更多信息，请参阅《Amazon Organizations 用户指南》**中的[服务控制策略](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_scps.html)。
+ **资源控制策略（RCP）**– 设置对账户中资源的最大可用权限。有关更多信息，请参阅《Amazon Organizations 用户指南》**中的[资源控制策略（RCP）](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_manage_policies_rcps.html)。
+ **会话策略** – 在为角色或联合用户创建临时会话时，作为参数传递的高级策略。有关更多信息，请参阅《IAM 用户指南》**中的[会话策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html#policies_session)。

### 多个策略类型


当多个类型的策略应用于一个请求时，生成的权限更加复杂和难以理解。要了解 Amazon 如何确定在涉及多种策略类型时是否允许请求，请参阅 *IAM 用户指南*中的[策略评测逻辑](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)。

# Amazon Glue 如何与 IAM 协同工作


在使用 IAM 管理对 Amazon Glue 的访问之前，您应该了解哪些 IAM 功能可用于 Amazon Glue。






**您可以与 Amazon Glue 搭配使用的 IAM 功能**  

| IAM 功能 | Amazon Glue 支持 | 
| --- | --- | 
|  [基于身份的策略](#security_iam_service-with-iam-id-based-policies)  |   是  | 
|  [基于资源的策略](#security_iam_service-with-iam-resource-based-policies)  |   部分  | 
|  [策略操作](#security_iam_service-with-iam-id-based-policies-actions)  |   是  | 
|  [策略资源](#security_iam_service-with-iam-id-based-policies-resources)  |   是  | 
|  [策略条件键（特定于服务）](#security_iam_service-with-iam-id-based-policies-conditionkeys)  |   是  | 
|  [ACL](#security_iam_service-with-iam-acls)  |   否   | 
|  [ABAC（策略中的标签）](#security_iam_service-with-iam-tags)  |   部分  | 
|  [临时凭证](#security_iam_service-with-iam-roles-tempcreds)  |   是  | 
|  [主体权限](#security_iam_service-with-iam-principal-permissions)  |   否   | 
|  [服务角色](#security_iam_service-with-iam-roles-service)  |   是  | 
|  [服务关联角色](#security_iam_service-with-iam-roles-service-linked)  |   否   | 

要大致了解 Amazon Glue 和其他 Amazon 服务如何与大多数 IAM 功能一起使用，请参阅*IAM 用户指南*中的[与 IAM 一起使用的 Amazon 服务](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。

## 适用于 Amazon Glue 的基于身份的策略
基于身份的策略

**支持基于身份的策略：**是

基于身份的策略是可附加到身份（如 IAM 用户、用户组或角色）的 JSON 权限策略文档。这些策略控制用户和角色可在何种条件下对哪些资源执行哪些操作。要了解如何创建基于身份的策略，请参阅《IAM 用户指南》**中的[使用客户管理型策略定义自定义 IAM 权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create.html)。

通过使用 IAM 基于身份的策略，您可以指定允许或拒绝的操作和资源以及允许或拒绝操作的条件。要了解可在 JSON 策略中使用的所有元素，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素引用](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements.html)。

Amazon Glue 对所有 Amazon Glue 操作均支持基于身份的策略 (IAM policy)。通过附加策略，可向其授予创建、访问或修改 Amazon Glue 资源（例如 Amazon Glue Data Catalog 中的表）的权限。

### 适用于 Amazon Glue 的基于身份的策略示例




要查看 Amazon Glue 基于身份的策略的示例，请参阅 [适用于 Amazon Glue 的基于身份的策略示例](security_iam_id-based-policy-examples.md)。

## Amazon Glue 内基于资源的策略
基于资源的策略

**支持基于资源的策略：**部分支持

基于资源的策略是附加到资源的 JSON 策略文档。基于资源的策略的示例包括 IAM *角色信任策略*和 Amazon S3 *存储桶策略*。在支持基于资源的策略的服务中，服务管理员可以使用它们来控制对特定资源的访问。对于在其中附加策略的资源，策略定义指定主体可以对该资源执行哪些操作以及在什么条件下执行。您必须在基于资源的策略中[指定主体](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_principal.html)。主体可以包括账户、用户、角色、联合用户或。Amazon Web Services 服务

要启用跨账户访问，您可以将整个账户或其他账户中的 IAM 实体指定为基于资源的策略中的主体。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

**注意**  
只能使用 Amazon Glue 资源策略来管理 Data Catalog 资源的权限。不能将其附加到任何其他 Amazon Glue 资源，如任务、触发器、开发终端节点、爬网程序或分类器。  
每个目录只允许使用*一个*资源策略，大小限制为 10KB。

在 Amazon Glue 中，资源策略附加到*目录*，目录是上面提到的各种 Data Catalog 资源的虚拟容器。每个 Amazon 账户在 Amazon 区域中有单个目录，其目录 ID 与 Amazon 账户 ID 相同。您无法删除或修改目录。

将对目录的所有 API 调用评估资源策略，其中调用方委托人包含在策略文档的 `"Principal"` 块中。



要查看 Amazon Glue 基于资源的策略的示例，请参阅 [Amazon Glue 基于资源的策略示例](security_iam_resource-based-policy-examples.md)。

## 适用于 Amazon Glue 的策略操作
策略操作

**支持策略操作：**是

管理员可以使用 Amazon JSON 策略来指定谁有权访问什么内容。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

JSON 策略的 `Action` 元素描述可用于在策略中允许或拒绝访问的操作。在策略中包含操作以授予执行关联操作的权限。



要查看 Amazon Glue 操作的列表，请参阅*服务授权参考*中的 [Amazon Glue 定义的操作](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awsglue.html#awsglue-actions-as-permissions)。

Amazon Glue 中的策略操作在操作前使用以下前缀：

```
glue
```

要在单个语句中指定多项操作，请使用逗号将它们隔开。

```
"Action": [
      "glue:action1",
      "glue:action2"
         ]
```





您也可以使用通配符（\$1）指定多个操作。例如，要指定以单词 `Get` 开头的所有操作，包括以下操作：

```
"Action": "glue:Get*"
```

要查看示例策略，请参阅 [Amazon Glue 访问控制策略示例](glue-policy-examples.md)。

## Amazon Glue 的策略资源
策略资源

**支持策略资源：**是

管理员可以使用 Amazon JSON 策略来指定谁有权访问什么内容。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

`Resource` JSON 策略元素指定要向其应用操作的一个或多个对象。作为最佳实践，请使用其 [Amazon 资源名称（ARN）](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference-arns.html)指定资源。对于不支持资源级权限的操作，请使用通配符 (\$1) 指示语句应用于所有资源。

```
"Resource": "*"
```

有关如何使用 ARN 控制对 Amazon Glue 资源的访问的更多信息，请参阅 [指定 Amazon Glue 资源 ARN](glue-specifying-resource-arns.md)。

要查看 Amazon Glue 资源类型及其 ARN 的列表，请参阅*服务授权参考*中的 [Amazon Glue 定义的资源](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awsglue.html#awsglue-resources-for-iam-policies)。要了解可以对哪些操作指定每个资源的 ARN，请参阅 [Amazon Glue 定义的操作](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awsglue.html#awsglue-actions-as-permissions)。



## Amazon Glue 的策略条件键
策略条件键

**支持特定于服务的策略条件键：**是

管理员可以使用 Amazon JSON 策略来指定谁有权访问什么内容。也就是说，哪个**主体**可以对什么**资源**执行**操作**，以及在什么**条件**下执行。

`Condition` 元素根据定义的条件指定语句何时执行。您可以创建使用[条件运算符](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html)（例如，等于或小于）的条件表达式，以使策略中的条件与请求中的值相匹配。要查看所有 Amazon 全局条件键，请参阅《IAM 用户指南》**中的 [Amazon 全局条件上下文键](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html)。

要查看 Amazon Glue 条件键的列表，请参阅*服务授权参考*中的 [Amazon Glue 的条件键](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awsglue.html#awsglue-policy-keys)。要了解您可以对哪些操作和资源使用条件键，请参阅 [Amazon Glue 定义的操作](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awsglue.html#awsglue-actions-as-permissions)。

要查看示例策略，请参阅 [使用条件键或上下文键控制设置](security_iam_id-based-policy-examples.md#glue-identity-based-policy-condition-keys)。

## Amazon Glue 中的 ACL
ACL

**支持 ACL：**否 

访问控制列表（ACL）控制哪些主体（账户成员、用户或角色）有权访问资源。ACL 与基于资源的策略类似，但它们不使用 JSON 策略文档格式。

## 使用 Amazon Glue 的 ABAC
ABAC

**支持 ABAC（策略中的标签）：**部分支持

基于属性的访问权限控制（ABAC）是一种授权策略，该策略基于称为标签的属性来定义权限。您可以将标签附加到 IAM 实体和 Amazon 资源，然后设计 ABAC 策略，以支持在主体的标签与资源上的标签匹配时执行操作。

要基于标签控制访问，您需要使用 `aws:ResourceTag/key-name``aws:RequestTag/key-name` 或 `aws:TagKeys` 条件键在策略的[条件元素](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition.html)中提供标签信息。

如果某个服务对于每种资源类型都支持所有这三个条件键，则对于该服务，该值为**是**。如果某个服务仅对于部分资源类型支持所有这三个条件键，则该值为**部分**。

有关 ABAC 的更多信息，请参阅《IAM 用户指南》**中的[使用 ABAC 授权定义权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/introduction_attribute-based-access-control.html)。要查看设置 ABAC 步骤的教程，请参阅《IAM 用户指南》**中的[使用基于属性的访问权限控制（ABAC）](https://docs.amazonaws.cn/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html)。

**重要**  
条件上下文键仅应用于针对爬网程序、作业、触发器和开发端点的 Amazon Glue API 操作。有关受影响的 API 操作的更多信息，请参阅 [Amazon Glue的条件键](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awsglue.html#awsglue-policy-keys)。  
Amazon Glue Data Catalog API 操作目前不支持 `aws:referer` 和 `aws:UserAgent` 全局条件上下文键。

要查看基于身份的策略（用于根据资源上的标签来限制对该资源的访问）的示例，请参阅 [使用标签授权](security_iam_id-based-policy-examples.md#tags-control-access-example-triggers-allow)。

## 将临时凭证用于 Amazon Glue
临时凭证

**支持临时凭证：**是

临时凭证提供对 Amazon 资源的短期访问权限，并且是在您使用联合身份验证或切换角色时自动创建的。Amazon 建议您动态生成临时凭证，而不是使用长期访问密钥。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的临时安全凭证](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_temp.html)和[使用 IAM 的。Amazon Web Services 服务](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)

## Amazon Glue 的跨服务主体权限
主体权限

**支持转发访问会话（FAS）：**否 

 转发访问会话（FAS）使用调用 Amazon Web Services 服务的主体的权限，与发出请求的 Amazon Web Services 服务结合，来向下游服务发出请求。有关发出 FAS 请求时的策略详情，请参阅[转发访问会话](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_forward_access_sessions.html)。

## Amazon Glue 的服务角色
服务角色

**支持服务角色：**是

 服务角色是由一项服务担任、代表您执行操作的 [IAM 角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles.html)。IAM 管理员可以在 IAM 中创建、修改和删除服务角色。有关更多信息，请参阅《IAM 用户指南》**中的[创建向 Amazon Web Services 服务 委派权限的角色](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_create_for-service.html)。

**警告**  
更改服务角色的权限可能会破坏 Amazon Glue 的功能。仅当 Amazon Glue 提供相关指导时才编辑服务角色。

有关为 Amazon Glue 创建服务角色的详细说明，请参阅 [步骤 1：为 Amazon Glue 服务创建 IAM policy](create-service-policy.md) 和 [步骤 2：为 Amazon Glue 创建 IAM 角色](create-an-iam-role.md)。

## Amazon Glue 的服务相关角色
服务关联角色

**支持服务相关角色：**否 

 服务关联角色是一种与 Amazon Web Services 服务 关联的服务角色。服务可以代入代表您执行操作的角色。服务关联角色显示在您的 Amazon Web Services 账户 中，并由该服务拥有。IAM 管理员可以查看但不能编辑服务关联角色的权限。

有关创建或管理服务相关角色的详细信息，请参阅[能够与 IAM 搭配使用的 Amazon 服务](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html)。在表中查找**服务相关角色**列中包含 `Yes` 的表。选择**是**链接以查看该服务的服务相关角色文档。

# 为 Amazon Glue 配置 IAM 权限


您可使用 Amazon Identity and Access Management（IAM）定义访问由 Amazon Glue 使用的资源所需的策略和角色。以下步骤将引导您完成为 Amazon Glue 设置权限的各种选项。根据您的业务需求，您可能必须添加或减少对您的资源的访问权限。

**注意**  
要改为开始为 Amazon Glue 使用基本 IAM 权限，请参阅 [为 Amazon Glue 设置 IAM 权限](set-up-iam.md)。

1. [为 Amazon Glue 服务创建 IAM policy](create-service-policy.md)：创建允许访问 Amazon Glue 资源的服务策略。

1. [为 Amazon Glue 创建 IAM 角色](create-an-iam-role.md)：创建 IAM 角色并附加 Amazon Glue 服务策略和用于您的 Amazon Simple Storage Service（Amazon S3）资源的策略，这些资源供 Amazon Glue 使用。

1. [将策略附加到访问 Amazon Glue 的用户或组](attach-policy-iam-user.md)：将策略附加到登录 Amazon Glue 控制台的任何用户或组。

1. [为笔记本创建 IAM policy](create-notebook-policy.md)：创建一个笔记本服务器策略，该策略用于在开发端点上创建笔记本服务器。

1. [为笔记本创建 IAM 角色](create-an-iam-role-notebook.md)：创建 IAM 角色并附加笔记本服务器策略。

1. [创建用于 Amazon SageMaker AI 笔记本的 IAM 策略](create-sagemaker-notebook-policy.md)：创建在开发端点上创建 Amazon SageMaker AI 笔记本时使用的 IAM 策略。

1. [为 Amazon SageMaker AI 笔记本创建 IAM 角色](create-an-iam-role-sagemaker-notebook.md)：创建 IAM 角色并附加策略，以便在开发端点上创建 Amazon SageMaker AI 笔记本时授予权限。

# 步骤 1：为 Amazon Glue 服务创建 IAM policy


对于访问其他Amazon资源上的数据的任何操作（例如访问您在 Amazon S3 中的对象），Amazon Glue 需要代表您访问该资源的权限。您通过使用 Amazon Identity and Access Management（IAM）提供这些权限。

**注意**  
如果您使用了Amazon托管式策略 `AWSGlueServiceRole`，则可跳过此步骤。

在此步骤中，您将创建一个类似于 `AWSGlueServiceRole` 的策略。您可以在 IAM 控制台中找到最新版本的 `AWSGlueServiceRole`。

**为 Amazon Glue 创建 IAM policy**

此策略为某些 Amazon S3 操作授予管理您账户中某些资源的权限，这些资源是 Amazon Glue 代入使用此策略的角色时需要的资源。此策略中指定的某些资源引用了 Amazon Glue 对 Amazon S3 存储桶、Amazon S3 ETL 脚本、CloudWatch Logs 和 Amazon EC2 资源使用的默认名称。为简便起见，默认情况下，Amazon Glue 会将某些 Amazon S3 对象写入到您的账户中带有前缀 `aws-glue-*` 的存储桶。

1. 登录 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在左侧导航窗格中，选择 **Policies（策略）**。

1. 选择**创建策略**。

1. 在 **Create Policy** (创建策略) 屏幕上，导航到用于编辑 JSON 的选项卡。使用以下 JSON 语句创建策略文档，然后选择 **Review policy** (查看策略)。
**注意**  
添加 Amazon S3 资源所需的任何权限。您可能需要将您的访问策略的资源部分限定为那些需要的资源。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "glue:*",
           "s3:GetBucketLocation",
           "s3:ListBucket",
           "s3:ListAllMyBuckets",
           "s3:GetBucketAcl",
           "ec2:DescribeVpcEndpoints",
           "ec2:DescribeRouteTables",
           "ec2:CreateNetworkInterface",
           "ec2:DeleteNetworkInterface",
           "ec2:DescribeNetworkInterfaces",
           "ec2:DescribeSecurityGroups",
           "ec2:DescribeSubnets",
           "ec2:DescribeVpcAttribute",
           "iam:ListRolePolicies",
           "iam:GetRole",
           "iam:GetRolePolicy",
           "cloudwatch:PutMetricData"
         ],
         "Resource": [
           "*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:CreateBucket",
           "s3:PutBucketPublicAccessBlock"
         ],
         "Resource": [
           "arn:aws:s3:::aws-glue-*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:GetObject",
           "s3:PutObject",
           "s3:DeleteObject"
         ],
         "Resource": [
           "arn:aws:s3:::aws-glue-*/*",
           "arn:aws:s3:::*/*aws-glue-*/*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:GetObject"
         ],
         "Resource": [
           "arn:aws:s3:::crawler-public*",
           "arn:aws:s3:::aws-glue-*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "logs:CreateLogGroup",
           "logs:CreateLogStream",
           "logs:PutLogEvents",
           "logs:AssociateKmsKey"
         ],
         "Resource": [
           "arn:aws:logs:*:*:log-group:/aws-glue/*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "ec2:CreateTags",
           "ec2:DeleteTags"
         ],
         "Condition": {
           "ForAllValues:StringEquals": {
             "aws:TagKeys": [
               "aws-glue-service-resource"
             ]
           }
         },
         "Resource": [
           "arn:aws:ec2:*:*:network-interface/*",
           "arn:aws:ec2:*:*:security-group/*",
           "arn:aws:ec2:*:*:instance/*"
         ]
       }
     ]
   }
   ```

------

   下表描述了此策略授予的权限。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/glue/latest/dg/create-service-policy.html)

1. 在 **Review Policy (查看策略)** 屏幕上，输入您的 **Policy Name (策略名称)**，例如 **GlueServiceRolePolicy**。输入可选描述，然后在您对该策略满意时选择 **Create policy (创建策略)**。

# 步骤 2：为 Amazon Glue 创建 IAM 角色


您需要向您的 IAM 角色授予在 Amazon Glue 代表您调用其他服务时可使用的权限。这包括对 Amazon S3 的访问权限，针对用于 Amazon Glue 的任何源、目标、脚本和临时目录。爬网程序、任务和开发端点需要权限。

您通过使用 Amazon Identity and Access Management（IAM）提供这些权限。请向您传递到 Amazon Glue 的 IAM 角色添加一个策略。

****在任务编辑器中创建 IAM 角色****

1. 在 Amazon Glue 控制台中创建任务时，查找角色部分。

1. 选择 **Create new role**（创建新角色）。

1. 将打开内联角色创建表单，您可以：
   + 指定**角色名称**；例如 `AWSGlueServiceRoleDefault`。
   + 自动选择托管策略 `AWSGlueServiceRole`。
   + 查看信任策略，以代入该角色。
   + 为元数据添加可选标签。

1. 选择**创建角色**。

1. 自动为您的任务选择新创建的角色。

或者，您可以使用 IAM 控制台创建角色：

****使用适用于 Amazon Glue 的 IAM 控制台创建 IAM 角色****

1. 登录 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在左侧导航窗格中，选择 **Roles (角色)**。

1. 选择**创建角色**。

1.  对于可信实体类型，请选择 **Amazon 服务**。然后，对于服务或应用场景，请查找并选择 **Amazon Glue**。选择**下一步**。

1. 在**添加权限**页面上，选择包含所需权限的策略；例如，适用于一般 Amazon Glue 权限的 Amazon 托管式策略 `AWSGlueServiceRole` 和用于访问 Amazon S3 资源的 Amazon 托管式策略 **AmazonS3FullAccess**。然后选择**下一步**。
**注意**  
请确保此角色中的策略之一授予针对您的 Amazon S3 源和目标的权限。您可能想要提供您自己的策略来访问特定 Amazon S3 资源。数据源需要 `s3:ListBucket` 和 `s3:GetObject` 权限。数据目标需要`s3:ListBucket`、`s3:PutObject` 和 `s3:DeleteObject` 权限。有关为您的资源创建 Amazon S3 策略的更多信息，请参阅[在策略中指定资源](https://docs.amazonaws.cn/AmazonS3/latest/userguide/s3-arn-format.html)。有关示例 Amazon S3 策略，请参阅[编写 IAM policy：如何授予对 Amazon S3 存储桶的访问权限](https://www.amazonaws.cn/blogs/security/writing-iam-policies-how-to-grant-access-to-an-amazon-s3-bucket/)。  
如果您计划访问使用 SSE-KMS 加密的 Amazon S3 资源和目标，请附加一个允许 Amazon Glue 爬网程序、任务和开发终端节点解密数据的策略。有关更多信息，请参阅[使用具有 Amazon KMS 托管式密钥的服务器端加密（SSE-KMS）保护数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingKMSEncryption.html)。  
示例如下：  

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "kms:Decrypt"
         ],
         "Resource": [
           "arn:aws:kms:*:111122223333:key/key-id"
         ]
       }
     ]
   }
   ```

1.  为角色命名并添加描述（可选），然后检查信任策略和权限。对于 **Role name (角色名称)**，输入您角色的名称，例如 `AWSGlueServiceRoleDefault`。使用以字符串 `AWSGlueServiceRole` 为前缀的名称创建角色,以允许角色从控制台用户传递到服务。Amazon Glue 提供了要求 IAM 服务角色以 `AWSGlueServiceRole` 开头的策略。否则，您必须添加一个为您的用户授予对 IAM 角色的 `iam:PassRole` 权限的策略，以匹配您的命名约定。选择**创建角色**。
**注意**  
当您创建具有角色的笔记本时，该角色将传递至交互式会话，以便同一角色可以在两个位置使用。因此，`iam:PassRole` 权限需要成为角色策略的一部分。  
使用以下示例为您的角色创建新策略。将账号替换为您的账号，并将角色名称替换为您的角色名称。  

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": "iam:PassRole",
         "Resource": "arn:aws:iam::090000000210:role/<role_name>"
       }
     ]
   }
   ```

1.  向角色添加标签（可选）。标签是您可以添加到 Amazon 资源的键值对，用来帮助标识、组织或搜索资源。然后，选择**创建角色**。

# 步骤 3：将策略附加到访问 Amazon Glue 的用户或组


管理员必须使用 Amazon Glue 控制台或 Amazon Command Line Interface（Amazon CLI）为任何用户、组或角色分配权限。您可使用 Amazon Identity and Access Management（IAM）通过策略提供这些权限。该步骤介绍向用户或组分配权限。

完成此步骤后，您的用户或组将附加以下策略：
+ Amazon托管式策略 `AWSGlueConsoleFullAccess` 或自定义策略 **GlueConsoleAccessPolicy**
+ **`AWSGlueConsoleSageMakerNotebookFullAccess`**
+ **`CloudWatchLogsReadOnlyAccess`**
+ **`AWSCloudFormationReadOnlyAccess`**
+ **`AmazonAthenaFullAccess`**

**附加内联策略并将其嵌入到用户或组中**

您可以将 Amazon 托管式策略或内联策略附加到用户或组以便访问 Amazon Glue 控制台。在此策略中指定的某些资源引用了 Amazon Glue 对 Amazon S3 存储桶、Amazon S3 ETL 脚本、CloudWatch Logs、Amazon CloudFormation 和 Amazon EC2 资源使用的默认名称。为简便起见，默认情况下，Amazon Glue 会将某些 Amazon S3 对象写入到您的账户中带有前缀 `aws-glue-*` 的存储桶。
**注意**  
如果您使用了Amazon托管式策略 **`AWSGlueConsoleFullAccess`**，则可跳过此步骤。
**重要**  
Amazon Glue 需要代入用于代表您执行工作的角色的权限。**要达到此目的，您要将 `iam:PassRole` 权限添加到您的 Amazon Glue 用户或组。**此策略向以 `AWSGlueServiceRole` 开头的角色授予对 Amazon Glue 服务角色的权限，并向以 `AWSGlueServiceNotebookRole` 开头的角色授予对您创建笔记本服务器时所需的角色的权限。您还可以针对 `iam:PassRole` 权限创建您自己的遵循您的命名约定的策略。  
根据安全性最佳实践，建议通过收紧策略来限制访问，从而进一步限制对 Amazon S3 存储桶和 Amazon CloudWatch 日志组的访问。有关示例 Amazon S3 策略，请参阅[编写 IAM policy：如何授予对 Amazon S3 存储桶的访问权限](https://www.amazonaws.cn/blogs/security/writing-iam-policies-how-to-grant-access-to-an-amazon-s3-bucket/)。

在此步骤中，您将创建一个类似于 `AWSGlueConsoleFullAccess` 的策略。您可以在 IAM 控制台中找到最新版本的 `AWSGlueConsoleFullAccess`。

1. 登录 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择**用户**或**用户组**。

1. 在列表中，请选择要在其中嵌入策略的用户或组的名称。

1. 选择 **Permissions (权限)** 选项卡，然后展开 **Permissions policies (权限策略)** 部分（如有必要）。

1. 选择 **Add Inline policy** (添加内联策略) 链接。

1. 在 **Create Policy** (创建策略) 屏幕上，导航到用于编辑 JSON 的选项卡。使用以下 JSON 语句创建策略文档，然后选择 **Review policy** (查看策略)。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "glue:*",
           "redshift:DescribeClusters",
           "redshift:DescribeClusterSubnetGroups",
           "iam:ListRoles",
           "iam:ListUsers",
           "iam:ListGroups",
           "iam:ListRolePolicies",
           "iam:GetRole",
           "iam:GetRolePolicy",
           "iam:ListAttachedRolePolicies",
           "ec2:DescribeSecurityGroups",
           "ec2:DescribeSubnets",
           "ec2:DescribeVpcs",
           "ec2:DescribeVpcEndpoints",
           "ec2:DescribeRouteTables",
           "ec2:DescribeVpcAttribute",
           "ec2:DescribeKeyPairs",
           "ec2:DescribeInstances",
           "rds:DescribeDBInstances",
           "rds:DescribeDBClusters",
           "rds:DescribeDBSubnetGroups",
           "s3:ListAllMyBuckets",
           "s3:ListBucket",
           "s3:GetBucketAcl",
           "s3:GetBucketLocation",
           "cloudformation:DescribeStacks",
           "cloudformation:GetTemplateSummary",
           "dynamodb:ListTables",
           "kms:ListAliases",
           "kms:DescribeKey",
           "cloudwatch:GetMetricData",
           "cloudwatch:ListDashboards"
         ],
         "Resource": [
           "*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:GetObject",
           "s3:PutObject"
         ],
         "Resource": [
           "arn:aws:s3:::*/*aws-glue-*/*",
           "arn:aws:s3:::aws-glue-*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "tag:GetResources"
         ],
         "Resource": [
           "*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:CreateBucket",
           "s3:PutBucketPublicAccessBlock"
         ],
         "Resource": [
           "arn:aws:s3:::aws-glue-*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "logs:GetLogEvents"
         ],
         "Resource": [
           "arn:aws:logs:*:*:/aws-glue/*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "cloudformation:CreateStack",
           "cloudformation:DeleteStack"
         ],
         "Resource": "arn:aws:cloudformation:*:*:stack/aws-glue*/*"
       },
       {
         "Effect": "Allow",
         "Action": [
           "ec2:RunInstances"
         ],
         "Resource": [
           "arn:aws:ec2:*:*:instance/*",
           "arn:aws:ec2:*:*:key-pair/*",
           "arn:aws:ec2:*:*:image/*",
           "arn:aws:ec2:*:*:security-group/*",
           "arn:aws:ec2:*:*:network-interface/*",
           "arn:aws:ec2:*:*:subnet/*",
           "arn:aws:ec2:*:*:volume/*"
         ]
       },
       {
         "Action": [
           "iam:PassRole"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:iam::*:role/AWSGlueServiceRole*",
         "Condition": {
           "StringLike": {
             "iam:PassedToService": [
               "glue.amazonaws.com"
             ]
           }
         }
       },
       {
         "Action": [
           "iam:PassRole"
         ],
         "Effect": "Allow",
         "Resource": "arn:aws:iam::*:role/AWSGlueServiceNotebookRole*",
         "Condition": {
           "StringLike": {
             "iam:PassedToService": [
               "ec2.amazonaws.com"
             ]
           }
         }
       },
       {
         "Action": [
           "iam:PassRole"
         ],
         "Effect": "Allow",
         "Resource": [
           "arn:aws:iam::*:role/service-role/AWSGlueServiceRole*"
         ],
         "Condition": {
           "StringLike": {
             "iam:PassedToService": [
               "glue.amazonaws.com"
             ]
           }
         }
       }
     ]
   }
   ```

------

   下表描述了此策略授予的权限。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/glue/latest/dg/attach-policy-iam-user.html)

1. 在 **Review policy (查看策略)** 屏幕上，输入您的策略的名称，例如 **GlueConsoleAccessPolicy**。如果您对该策略感到满意，请选择 **Create policy (创建策略)**。确保屏幕顶部的红框中没有显示错误。更正报告的任何错误。
**注意**  
如果选择了 **Use autoformatting**，则每当您打开策略或选择 **Validate Policy** 时，都会重新设置策略的格式。

**附加 AWSGlueConsoleFullAccess 托管策略**

您可以附加 `AWSGlueConsoleFullAccess` 策略以提供 Amazon Glue 控制台用户所需的权限。
**注意**  
如果您已针对 Amazon Glue 控制台访问创建自己的策略，则可跳过此步骤。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择**策略**。

1. 在策略列表中，选中 **AWSGlueConsoleFullAccess** 旁边的复选框。您可以使用 **Filter** 菜单和搜索框来筛选策略列表。

1. 选择 **Policy actions（策略操作）**，然后选择 **Attach（附加）**。

1. 选择要将策略附加到的用户。您可以使用 **Filter**（筛选条件）菜单和搜索框来筛选委托人实体列表。在选择要将策略附加到的用户后，选择 **Attach policy** (附加策略)。

**附加 `AWSGlueConsoleSageMakerNotebookFullAccess` 托管式策略**

可将 `AWSGlueConsoleSageMakerNotebookFullAccess` 策略附加到用户，以管理在 Amazon Glue 控制台中创建的 SageMaker AI 笔记本。除了其他必需的 Amazon Glue 控制台权限外，此策略还授予管理 SageMaker AI 笔记本所需资源的访问权限。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择**策略**。

1. 在策略列表中，选中 **AWSGlueConsoleSageMakerNotebookFullAccess** 旁边的复选框。您可以使用 **Filter** 菜单和搜索框来筛选策略列表。

1. 选择 **Policy actions（策略操作）**，然后选择 **Attach（附加）**。

1. 选择要将策略附加到的用户。您可以使用 **Filter**（筛选条件）菜单和搜索框来筛选委托人实体列表。在选择要将策略附加到的用户后，选择 **Attach policy** (附加策略)。

**附加 CloudWatchLogsReadOnlyAccess 托管策略**

您可以将 **CloudWatchLogsReadOnlyAccess** 策略附加到用户以查看由 Amazon Glue 在 CloudWatch Logs 控制台上创建的日志。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择**策略**。

1. 在策略列表中，选中 **CloudWatchLogsReadOnlyAccess** 旁边的复选框。您可以使用 **Filter** 菜单和搜索框来筛选策略列表。

1. 选择 **Policy actions（策略操作）**，然后选择 **Attach（附加）**。

1. 选择要将策略附加到的用户。您可以使用 **Filter**（筛选条件）菜单和搜索框来筛选委托人实体列表。在选择要将策略附加到的用户后，选择 **Attach policy** (附加策略)。

**附加 AWSCloudFormationReadOnlyAccess 托管策略**

您可以将 **AWSCloudFormationReadOnlyAccess** 策略附加到用户以查看 Amazon Glue 在 Amazon CloudFormation 控制台上使用的 Amazon CloudFormation 堆栈。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择**策略**。

1. 在策略列表中，选中 **AWSCloudFormationReadOnlyAccess** 旁边的复选框。您可以使用 **Filter** 菜单和搜索框来筛选策略列表。

1. 选择 **Policy actions（策略操作）**，然后选择 **Attach（附加）**。

1. 选择要将策略附加到的用户。您可以使用 **Filter**（筛选条件）菜单和搜索框来筛选委托人实体列表。在选择要将策略附加到的用户后，选择 **Attach policy** (附加策略)。

**附加 AmazonAthenaFullAccess 托管策略**

您可以将 **AmazonAthenaFullAccess** 策略附加到用户，以在 Athena 控制台中查看 Amazon S3 数据。

1. 登录到 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在导航窗格中，选择**策略**。

1. 在策略列表中，选中 **AmazonAthenaFullAccess** 旁边的复选框。您可以使用 **Filter** 菜单和搜索框来筛选策略列表。

1. 选择 **Policy actions（策略操作）**，然后选择 **Attach（附加）**。

1. 选择要将策略附加到的用户。您可以使用 **Filter**（筛选条件）菜单和搜索框来筛选委托人实体列表。在选择要将策略附加到的用户后，选择 **Attach policy** (附加策略)。

# 步骤 4：创建用于笔记本服务器的 IAM policy


如果您计划将笔记本与开发终端节点结合使用，则必须在创建笔记本服务器时指定权限。您通过使用 Amazon Identity and Access Management（IAM）提供这些权限。

此策略为某些 Amazon S3 操作授予管理您账户中某些资源的权限，这些资源是 Amazon Glue 代入使用此策略的角色时需要的资源。此策略中指定的某些资源引用了 Amazon Glue 对 Amazon S3 存储桶、Amazon S3 ETL 脚本和 Amazon EC2 资源使用的默认名称。为简便起见，默认情况下，Amazon Glue 会将某些 Amazon S3 对象写入到您账户中带有前缀 `aws-glue-*` 的存储桶。

**注意**  
如果您使用了Amazon托管式策略 **`AWSGlueServiceNotebookRole`**，则可跳过此步骤。

在此步骤中，您将创建一个类似于 `AWSGlueServiceNotebookRole` 的策略。您可以在 IAM 控制台中找到最新版本的 `AWSGlueServiceNotebookRole`。

**为笔记本创建 IAM policy**

1. 登录 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在左侧导航窗格中，选择 **Policies（策略）**。

1. 选择**创建策略**。

1. 在 **Create Policy** (创建策略) 屏幕上，导航到用于编辑 JSON 的选项卡。使用以下 JSON 语句创建策略文档，然后选择 **Review policy** (查看策略)。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "glue:CreateDatabase",
           "glue:CreatePartition",
           "glue:CreateTable",
           "glue:DeleteDatabase",
           "glue:DeletePartition",
           "glue:DeleteTable",
           "glue:GetDatabase",
           "glue:GetDatabases",
           "glue:GetPartition",
           "glue:GetPartitions",
           "glue:GetTable",
           "glue:GetTableVersions",
           "glue:GetTables",
           "glue:UpdateDatabase",
           "glue:UpdatePartition",
           "glue:UpdateTable",
           "glue:GetJobBookmark",
           "glue:ResetJobBookmark",
           "glue:CreateConnection",
           "glue:CreateJob",
           "glue:DeleteConnection",
           "glue:DeleteJob",
           "glue:GetConnection",
           "glue:GetConnections",
           "glue:GetDevEndpoint",
           "glue:GetDevEndpoints",
           "glue:GetJob",
           "glue:GetJobs",
           "glue:UpdateJob",
           "glue:BatchDeleteConnection",
           "glue:UpdateConnection",
           "glue:GetUserDefinedFunction",
           "glue:UpdateUserDefinedFunction",
           "glue:GetUserDefinedFunctions",
           "glue:DeleteUserDefinedFunction",
           "glue:CreateUserDefinedFunction",
           "glue:BatchGetPartition",
           "glue:BatchDeletePartition",
           "glue:BatchCreatePartition",
           "glue:BatchDeleteTable",
           "glue:UpdateDevEndpoint",
           "s3:GetBucketLocation",
           "s3:ListBucket",
           "s3:ListAllMyBuckets",
           "s3:GetBucketAcl"
         ],
         "Resource": [
           "*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:GetObject"
         ],
         "Resource": [
           "arn:aws:s3:::crawler-public*",
           "arn:aws:s3:::aws-glue*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "s3:PutObject",
           "s3:DeleteObject"
         ],
         "Resource": [
           "arn:aws:s3:::aws-glue*"
         ]
       },
       {
         "Effect": "Allow",
         "Action": [
           "ec2:CreateTags",
           "ec2:DeleteTags"
         ],
         "Condition": {
           "ForAllValues:StringEquals": {
             "aws:TagKeys": [
               "aws-glue-service-resource"
             ]
           }
         },
         "Resource": [
           "arn:aws:ec2:*:*:network-interface/*",
           "arn:aws:ec2:*:*:security-group/*",
           "arn:aws:ec2:*:*:instance/*"
         ]
       }
     ]
   }
   ```

------

   下表描述了此策略授予的权限。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/glue/latest/dg/create-notebook-policy.html)

1. 在 **Review Policy (查看策略)** 屏幕上，输入您的 **Policy Name (策略名称)**，例如 **GlueServiceNotebookPolicyDefault**。输入可选描述，然后在您对该策略满意时选择 **Create policy (创建策略)**。

# 步骤 5：创建用于笔记本服务器的 IAM 角色


如果您计划将笔记本与开发终端节点结合使用，则需要为 IAM 角色授予权限。您可使用 Amazon Identity and Access Management（IAM）通过 IAM 角色提供这些权限。

**注意**  
使用 IAM 控制台创建 IAM 角色时，控制台自动创建实例配置文件，按相应的角色为文件命名。

**为笔记本创建 IAM 角色**

1. 登录 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在左侧导航窗格中，选择 **Roles (角色)**。

1. 选择**创建角色**。

1. 对于角色类型，选择 **Amazon Service（服务）**，找到并选择 **EC2**，然后选择 **EC2** 使用案例，再选择 **Next: Permissions（下一步：权限）**。

1. 在**附加权限策略**页面上，选择包含所需权限的策略；例如，适用于一般 Amazon Glue 权限的 **AWSGlueServiceNotebookRole** 和适用于对 Amazon S3 资源的访问权限的 Amazon 托管式策略 **AmazonS3FullAccess**。然后选择 **Next: Review**。
**注意**  
请确保此角色中的策略之一授予针对您的 Amazon S3 源和目标的权限。此外，确认您的策略支持对您在创建笔记本服务器时存储笔记本的位置的完全访问。您可能想要提供您自己的策略来访问特定 Amazon S3 资源。有关为您的资源创建 Amazon S3 策略的更多信息，请参阅[在策略中指定资源](https://docs.amazonaws.cn/AmazonS3/latest/userguide/s3-arn-format.html)。  
如果您计划访问使用 SSE-KMS 加密的 Amazon S3 源和目标，请附加一个允许笔记本解密数据的策略。有关更多信息，请参阅[使用具有 Amazon KMS 托管式密钥的服务器端加密（SSE-KMS）保护数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingKMSEncryption.html)。  
示例如下：  

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "kms:Decrypt"
         ],
         "Resource": [
           "arn:aws:kms:*:111122223333:key/key-id"
         ]
       }
     ]
   }
   ```

1. 对于**角色名称**，请为您的角色输入一个名称。使用以字符串 `AWSGlueServiceNotebookRole` 为前缀的名称创建角色，以允许角色从控制台用户传递到笔记本服务器。Amazon Glue 提供了要求 IAM 服务角色以 `AWSGlueServiceNotebookRole` 开头的策略。否则，您必须向您的用户添加一个策略以允许适用于 IAM 角色的 `iam:PassRole` 权限与您的命名约定匹配。例如，输入 `AWSGlueServiceNotebookRoleDefault`。然后选择**创建角色**。

# 步骤 6：为 SageMaker AI 笔记本创建 IAM 策略


如果计划将 SageMaker AI 笔记本与开发端点结合使用，则必须在创建笔记本时指定权限。您通过使用 Amazon Identity and Access Management（IAM）提供这些权限。

**为 SageMaker AI 笔记本创建 IAM 策略**

1. 登录 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在左侧导航窗格中，选择 **Policies（策略）**。

1. 选择**创建策略**。

1. 在 **Create Policy (创建策略)** 页面上，导航到用于编辑 JSON 的选项卡。使用以下 JSON 语句创建一个策略文档。编辑环境的 *bucket-name*、*region-code* 和 *account-id*。

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Action": [
                   "s3:ListBucket"
               ],
               "Effect": "Allow",
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket"
               ]
           },
           {
               "Action": [
                   "s3:GetObject"
               ],
               "Effect": "Allow",
               "Resource": [
                   "arn:aws:s3:::amzn-s3-demo-bucket*"
               ]
           },
           {
               "Action": [
                   "logs:CreateLogStream",
                   "logs:DescribeLogStreams",
                   "logs:PutLogEvents",
                   "logs:CreateLogGroup"
               ],
               "Effect": "Allow",
               "Resource": [
                   "arn:aws:logs:us-east-1:111122223333:log-group:/aws/sagemaker/*",
                   "arn:aws:logs:us-east-1:111122223333:log-group:/aws/sagemaker/*:log-stream:aws-glue-*"
               ]
           },
           {
               "Action": [
                   "glue:UpdateDevEndpoint",
                   "glue:GetDevEndpoint",
                   "glue:GetDevEndpoints"
               ],
               "Effect": "Allow",
               "Resource": [
                   "arn:aws:glue:us-east-1:111122223333:devEndpoint/*"
               ]
           },
           {
               "Action": [
                   "sagemaker:ListTags"
               ],
               "Effect": "Allow",
               "Resource": [
                   "arn:aws:sagemaker:us-east-1:111122223333:notebook-instance/*"
               ]
           }
       ]
   }
   ```

------

   然后，选择**查看策略**。

   下表描述了此策略授予的权限。    
[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/glue/latest/dg/create-sagemaker-notebook-policy.html)

1. 在 **Review Policy (查看策略)** 屏幕上，输入您的 **Policy Name (策略名称)**，例如 `AWSGlueSageMakerNotebook`。输入可选描述，然后在您对该策略满意时选择 **Create policy (创建策略)**。

# 步骤 7：为 SageMaker AI 笔记本创建 IAM 角色


如果计划将 SageMaker AI 笔记本与开发端点结合使用，则需要为 IAM 角色授予权限。您可使用 Amazon Identity and Access Management（IAM）通过 IAM 角色提供这些权限。

**为 SageMaker AI 笔记本创建 IAM 角色**

1. 登录 Amazon Web Services 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.amazonaws.cn/iam/)。

1. 在左侧导航窗格中，选择 **Roles (角色)**。

1. 选择**创建角色**。

1. 对于角色类型，选择 **Amazon 服务**，找到并选择 **SageMaker**，然后选择 **SageMaker - 执行**使用案例。然后选择**下一步：权限**。

1. 在 **Attach permissions policy (附加权限策略)** 页面上，选择包含所需权限的策略；例如，**AmazonSageMakerFullAccess**。选择**下一步：审核**。

   如果您计划访问使用 SSE-KMS 加密的 Amazon S3 源和目标，则附加一个允许笔记本解密数据的策略，如以下示例所示。有关更多信息，请参阅[使用具有 Amazon KMS 托管式密钥的服务器端加密（SSE-KMS）保护数据](https://docs.amazonaws.cn/AmazonS3/latest/userguide/UsingKMSEncryption.html)。

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

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "kms:Decrypt"
         ],
         "Resource": [
           "arn:aws:kms:*:111122223333:key/key-id"
         ]
       }
     ]
   }
   ```

------

1. 对于**角色名称**，请为您的角色输入一个名称。要允许角色从控制台用户传递到 SageMaker AI，请使用以字符串 `AWSGlueServiceSageMakerNotebookRole` 为前缀的名称。Amazon Glue 提供了要求 IAM 角色以 `AWSGlueServiceSageMakerNotebookRole` 开头的策略。否则，您必须向您的用户添加一个策略以允许适用于 IAM 角色的 `iam:PassRole` 权限与您的命名约定匹配。

   例如，输入 `AWSGlueServiceSageMakerNotebookRole-Default`，然后选择 **Create role (创建角色)**。

1. 创建角色之后，请附加策略以允许从 Amazon Glue 创建 SageMaker AI 笔记本所需的其他权限。

   选择您刚刚创建的角色 `AWSGlueServiceSageMakerNotebookRole-Default`，然后选择 **Attach policy (附加策略)**。将您创建的名为 `AWSGlueSageMakerNotebook` 的策略附加到角色。

# Amazon Glue 访问控制策略示例


本部分包含基于身份的（IAM）访问控制策略和 Amazon Glue 资源策略的示例。

**Contents**
+ [

# 适用于 Amazon Glue 的基于身份的策略示例
](security_iam_id-based-policy-examples.md)
  + [

## 策略最佳实践
](security_iam_id-based-policy-examples.md#security_iam_service-with-iam-policy-best-practices)
  + [

## 资源级权限仅应用于特定的 Amazon Glue 对象
](security_iam_id-based-policy-examples.md#glue-identity-based-policy-limitations)
  + [

## 使用 Amazon Glue 控制台
](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-console)
  + [

## 允许用户查看他们自己的权限
](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-view-own-permissions)
  + [

## 授予对表的只读权限
](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-read-only-table-access)
  + [

## 通过 GetTables 权限筛选表
](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-filter-tables)
  + [

## 授予对表和所有分区的完整访问权限
](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-full-access-tables-partitions)
  + [

## 通过名称前缀和显式拒绝控制访问权限
](security_iam_id-based-policy-examples.md#security_iam_id-based-policy-examples-deny-by-name-prefix)
  + [

## 使用标签授权
](security_iam_id-based-policy-examples.md#tags-control-access-example-triggers-allow)
  + [

## 使用标签拒绝访问
](security_iam_id-based-policy-examples.md#tags-control-access-example-triggers-deny)
  + [

## 将标签与 List 和 Batch API 操作结合使用
](security_iam_id-based-policy-examples.md#tags-control-access-example-triggers-list-batch)
  + [

## 使用条件键或上下文键控制设置
](security_iam_id-based-policy-examples.md#glue-identity-based-policy-condition-keys)
    + [

### 使用条件键控制设置的策略
](security_iam_id-based-policy-examples.md#glue-identity-based-policy-condition-key-vpc)
    + [

### 控制使用上下文键控制设置的策略
](security_iam_id-based-policy-examples.md#glue-identity-based-policy-context-key-glue)
  + [

## 拒绝某个身份创建数据预览会话
](security_iam_id-based-policy-examples.md#deny-data-preview-sessions-per-identity)
+ [

# Amazon Glue 基于资源的策略示例
](security_iam_resource-based-policy-examples.md)
  + [

## 将基于资源的策略用于 Amazon Glue 的注意事项
](security_iam_resource-based-policy-examples.md#security_iam_resource-based-policy-examples-considerations)
  + [

## 使用资源策略控制同一账户中的访问
](security_iam_resource-based-policy-examples.md#glue-policy-resource-policies-example-same-account)

# 适用于 Amazon Glue 的基于身份的策略示例
基于身份的策略示例

默认情况下，用户和角色没有创建或修改 Amazon Glue 资源的权限。要授予用户对所需资源执行操作的权限，IAM 管理员可以创建 IAM 策略。

要了解如何使用这些示例 JSON 策略文档创建基于 IAM 身份的策略，请参阅《IAM 用户指南》**中的[创建 IAM 策略（控制台）](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_create-console.html)。

有关 Amazon Glue 定义的操作和资源类型的详细信息，包括每种资源类型的 ARN 格式，请参阅*服务授权参考*中的 [Amazon Glue 的操作、资源和条件键](https://docs.amazonaws.cn/service-authorization/latest/reference/list_awsglue.html)。

**注意**  
本节中提供的示例均使用 `us-west-2` 区域。您可以将其替换为要使用的 Amazon 区域。

**Topics**
+ [

## 策略最佳实践
](#security_iam_service-with-iam-policy-best-practices)
+ [

## 资源级权限仅应用于特定的 Amazon Glue 对象
](#glue-identity-based-policy-limitations)
+ [

## 使用 Amazon Glue 控制台
](#security_iam_id-based-policy-examples-console)
+ [

## 允许用户查看他们自己的权限
](#security_iam_id-based-policy-examples-view-own-permissions)
+ [

## 授予对表的只读权限
](#security_iam_id-based-policy-examples-read-only-table-access)
+ [

## 通过 GetTables 权限筛选表
](#security_iam_id-based-policy-examples-filter-tables)
+ [

## 授予对表和所有分区的完整访问权限
](#security_iam_id-based-policy-examples-full-access-tables-partitions)
+ [

## 通过名称前缀和显式拒绝控制访问权限
](#security_iam_id-based-policy-examples-deny-by-name-prefix)
+ [

## 使用标签授权
](#tags-control-access-example-triggers-allow)
+ [

## 使用标签拒绝访问
](#tags-control-access-example-triggers-deny)
+ [

## 将标签与 List 和 Batch API 操作结合使用
](#tags-control-access-example-triggers-list-batch)
+ [

## 使用条件键或上下文键控制设置
](#glue-identity-based-policy-condition-keys)
+ [

## 拒绝某个身份创建数据预览会话
](#deny-data-preview-sessions-per-identity)

## 策略最佳实践


基于身份的策略确定某个人是否可以创建、访问或删除您账户中的 Amazon Glue 资源。这些操作可能会使 Amazon Web Services 账户产生成本。创建或编辑基于身份的策略时，请遵循以下指南和建议：
+ **Amazon 托管式策略及转向最低权限许可入门**：要开始向用户和工作负载授予权限，请使用 *Amazon 托管式策略*来为许多常见使用场景授予权限。您可以在 Amazon Web Services 账户 中找到这些策略。建议通过定义特定于您的使用场景的 Amazon 客户托管式策略来进一步减少权限。有关更多信息，请参阅《IAM 用户指南》**中的 [Amazon 托管策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)或[工作职能的 Amazon 托管策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_job-functions.html)。
+ **应用最低权限**：在使用 IAM 策略设置权限时，请仅授予执行任务所需的权限。为此，您可以定义在特定条件下可以对特定资源执行的操作，也称为*最低权限许可*。有关使用 IAM 应用权限的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的策略和权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies.html)。
+ **使用 IAM 策略中的条件进一步限制访问权限**：您可以向策略添加条件来限制对操作和资源的访问。例如，您可以编写策略条件来指定必须使用 SSL 发送所有请求。如果通过特定 Amazon Web Services 服务（例如 Amazon CloudFormation）使用服务操作，您还可以使用条件来授予对服务操作的访问权限。有关更多信息，请参阅《IAM 用户指南》**中的 [IAM JSON 策略元素：条件](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_elements_condition.html)。
+ **使用 IAM Access Analyzer 验证您的 IAM 策略，以确保权限的安全性和功能性**：IAM Access Analyzer 会验证新策略和现有策略，以确保策略符合 IAM 策略语言（JSON）和 IAM 最佳实践。IAM Access Analyzer 提供 100 多项策略检查和可操作的建议，以帮助您制定安全且功能性强的策略。有关更多信息，请参阅《IAM 用户指南》**中的[使用 IAM Access Analyzer 验证策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access-analyzer-policy-validation.html)。
+ **需要多重身份验证（MFA）**：如果您所处的场景要求您的 Amazon Web Services 账户 中有 IAM 用户或根用户，请启用 MFA 来提高安全性。若要在调用 API 操作时需要 MFA，请将 MFA 条件添加到您的策略中。有关更多信息，请参阅《IAM 用户指南》**中的[使用 MFA 保护 API 访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_credentials_mfa_configure-api-require.html)。

有关 IAM 中的最佳实操的更多信息，请参阅《IAM 用户指南》**中的 [IAM 中的安全最佳实践](https://docs.amazonaws.cn/IAM/latest/UserGuide/best-practices.html)。

## 资源级权限仅应用于特定的 Amazon Glue 对象
资源级授权限制

您只能定义 Amazon Glue 中特定对象的精细控制。因此，您必须编写客户端的 IAM policy，以便允许 `Resource` 语句的 Amazon Resource Name（ARN）的 API 操作与不允许使用 API 的操作不混合。

例如，以下 IAM policy 允许 `GetClassifier` 和 `GetJobRun` 的 API 操作。它将 `Resource` 定义为 `*`，因为 Amazon Glue 不允许分类符和作业运行的 ARN。由于允许将 ARN 用于 `GetDatabase` 和 `GetTable` 等特定 API 操作，因此，可以在策略的第二部分中指定 ARN。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetClassifier*",
        "glue:GetJobRun*"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "glue:Get*"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/default",
        "arn:aws:glue:us-east-1:111122223333:table/default/e*1*",
        "arn:aws:glue:us-east-1:111122223333:connection/connection2"
      ]
    }
  ]
}
```

------

有关允许 ARN 的 Amazon Glue 对象的列表，请参阅[指定 Amazon Glue 资源 ARN](glue-specifying-resource-arns.md)。

## 使用 Amazon Glue 控制台
使用控制台

要访问 Amazon Glue 控制台，您必须拥有一组最低的权限。这些权限必须允许您列出和查看有关您的 Amazon Web Services 账户 中的 Amazon Glue 资源的详细信息。如果创建比必需的最低权限更为严格的基于身份的策略，对于附加了该策略的实体（用户或角色），控制台将无法按预期正常运行。

对于只需要调用 Amazon CLI 或 Amazon API 的用户，无需为其提供最低控制台权限。相反，只允许访问与其尝试执行的 API 操作相匹配的操作。

为确保用户和角色仍可使用 Amazon Glue 控制台，请同时将 Amazon Glue `ConsoleAccess` 或 `ReadOnly` Amazon 托管策略添加到实体。有关更多信息，请参阅《IAM 用户指南》**中的[为用户添加权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)。

某个用户要能够使用 Amazon Glue 控制台，必须拥有一组允许其使用其 Amazon 账户的 Amazon Glue 资源的最低权限。除这些 Amazon Glue 权限以外，控制台还需要来自以下服务的权限：
+ 用于显示日志的 Amazon CloudWatch Logs 权限。
+ 用于列出并传递角色的 Amazon Identity and Access Management（IAM）权限。
+ 用于处理堆栈的 Amazon CloudFormation 权限。
+ 用于列出 VPC、子网、安全组、实例和其他对象的 Amazon Elastic Compute Cloud（Amazon EC2）权限。
+ 用于列出存储桶和对象以及检索和保存脚本的 Amazon Simple Storage Service（Amazon S3）权限。
+ 用于使用集群的 Amazon Redshift 权限。
+ 用于列出实例的 Amazon Relational Database Service（Amazon RDS）权限。

有关用户查看和使用 Amazon Glue 控制台所需的权限的更多信息，请参阅 [步骤 3：将策略附加到访问 Amazon Glue 的用户或组](attach-policy-iam-user.md)。

如果创建比必需的最低权限更为严格的 IAM 策略，对于附加了该 IAM 策略的用户， 控制台将无法按预期正常运行。为确保这些用户仍可使用 Amazon Glue 控制台，同时如 [适用于 Amazon Glue 的 Amazon 托管（预定义）策略](security-iam-awsmanpol.md#access-policy-examples-aws-managed) 中所述附加 `AWSGlueConsoleFullAccess` 托管策略。

## 允许用户查看他们自己的权限


该示例说明了您如何创建策略，以允许 IAM 用户查看附加到其用户身份的内联和托管式策略。此策略包括在控制台上完成此操作或者以编程方式使用 Amazon CLI 或 Amazon API 所需的权限。

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "ViewOwnUserInfo",
            "Effect": "Allow",
            "Action": [
                "iam:GetUserPolicy",
                "iam:ListGroupsForUser",
                "iam:ListAttachedUserPolicies",
                "iam:ListUserPolicies",
                "iam:GetUser"
            ],
            "Resource": ["arn:aws:iam::*:user/${aws:username}"]
        },
        {
            "Sid": "NavigateInConsole",
            "Effect": "Allow",
            "Action": [
                "iam:GetGroupPolicy",
                "iam:GetPolicyVersion",
                "iam:GetPolicy",
                "iam:ListAttachedGroupPolicies",
                "iam:ListGroupPolicies",
                "iam:ListPolicyVersions",
                "iam:ListPolicies",
                "iam:ListUsers"
            ],
            "Resource": "*"
        }
    ]
}
```

## 授予对表的只读权限
表的只读访问权限

以下策略授予对数据库 `db1` 中的 `books` 表的只读权限。有关资源的 Amazon Resource Name（ARN）的更多信息，请参阅 [数据目录 ARN](glue-specifying-resource-arns.md#data-catalog-resource-arns)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "GetTablesActionOnBooks",
      "Effect": "Allow",
      "Action": [
        "glue:GetTables",
        "glue:GetTable"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/db1",
        "arn:aws:glue:us-east-1:111122223333:table/db1/books"
      ]
    }
  ]
}
```

------

此策略授予对名为 `db1` 的数据库中的名为 `books` 的表的只读权限。要授予对表的 `Get` 权限，同时需要对目录和数据库资源授予这一权限。

以下策略授予在数据库 `db1` 中创建表 `tb1` 所需的最低权限：

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:CreateTable"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:table/db1/tbl1",
        "arn:aws:glue:us-east-1:111122223333:database/db1",
        "arn:aws:glue:us-east-1:111122223333:catalog"
      ]
    }
  ]
}
```

------

## 通过 GetTables 权限筛选表
筛选表

假设在数据库 `db1` 中有三个表，即 `customers`、`stores` 和 `store_sales`。以下策略向 `stores` 和 `store_sales` 授予 `GetTables` 权限，但不向 `customers` 授予此权限。当您使用此策略调用 `GetTables` 时，结果将只包含两个授权表（不返回 `customers` 表）。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "GetTablesExample",
      "Effect": "Allow",
      "Action": [
        "glue:GetTables"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/db1",
        "arn:aws:glue:us-east-1:111122223333:table/db1/store_sales",
        "arn:aws:glue:us-east-1:111122223333:table/db1/stores"
      ]
    }
  ]
}
```

------

通过使用 `store*` 匹配以 `store` 开头的任何表名称，可简化上面的策略。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "GetTablesExample2",
      "Effect": "Allow",
      "Action": [
        "glue:GetTables"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/db1",
        "arn:aws:glue:us-east-1:111122223333:table/db1/store*"
      ]
    }
  ]
}
```

------

同样，使用 `/db1/*` 匹配 `db1` 中的所有表，以下策略将授予对 `db1` 中所有表的 `GetTables` 访问权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "GetTablesReturnAll",
      "Effect": "Allow",
      "Action": [
        "glue:GetTables"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/db1",
        "arn:aws:glue:us-east-1:111122223333:table/db1/*"
      ]
    }
  ]
}
```

------

如果未提供表 ARN，调用 `GetTables` 将成功，但会返回空列表。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "GetTablesEmptyResults",
      "Effect": "Allow",
      "Action": [
        "glue:GetTables"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/db1"
      ]
    }
  ]
}
```

------

如果策略中缺少数据库 ARN，则调用 `GetTables` 将失败，并出现 `AccessDeniedException`。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "GetTablesAccessDeny",
      "Effect": "Allow",
      "Action": [
        "glue:GetTables"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:table/db1/*"
      ]
    }
  ]
}
```

------

## 授予对表和所有分区的完整访问权限
完整的表访问权限

以下策略授予对数据库 `db1` 中名为 `books` 的表的所有权限。这包括对表本身、对其存档版本及其所有分区的读取和写入权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "FullAccessOnTable",
      "Effect": "Allow",
      "Action": [
        "glue:CreateTable",
        "glue:GetTable",
        "glue:GetTables",
        "glue:UpdateTable",
        "glue:DeleteTable",
        "glue:BatchDeleteTable",
        "glue:GetTableVersion",
        "glue:GetTableVersions",
        "glue:DeleteTableVersion",
        "glue:BatchDeleteTableVersion",
        "glue:CreatePartition",
        "glue:BatchCreatePartition",
        "glue:GetPartition",
        "glue:GetPartitions",
        "glue:BatchGetPartition",
        "glue:UpdatePartition",
        "glue:DeletePartition",
        "glue:BatchDeletePartition"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/db1",
        "arn:aws:glue:us-east-1:111122223333:table/db1/books"
      ]
    }
  ]
}
```

------

在实践中，可以简化上述策略。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "FullAccessOnTable",
      "Effect": "Allow",
      "Action": [
        "glue:*Table*",
        "glue:*Partition*"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/db1",
        "arn:aws:glue:us-east-1:111122223333:table/db1/books"
      ]
    }
  ]
}
```

------

请注意，精细访问控制的最小粒度在表级别。这意味着，您不能向用户授予对表中某些分区的访问权限，而不授予对表中其他分区的访问权限，或授予对表中部分列的访问权限，而不授予对其他列的访问权限。用户要么可以访问表的所有内容，要么不能访问表的任何内容。

## 通过名称前缀和显式拒绝控制访问权限
带拒绝的名称前缀

在本示例中，假设您的 Amazon Glue 数据目录中的数据库和表使用名称前缀来组织。发展阶段的数据库具有名称前缀 `dev-`，生产阶段的数据库具有名称前缀 `prod-`。您可以使用以下策略向开发人员授予对具有 `dev-` 前缀的所有数据库、表、UDF 等的完整访问权限。但是，您会对带有 `prod-` 前缀的所有内容授予只读访问权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "DevAndProdFullAccess",
      "Effect": "Allow",
      "Action": [
        "glue:*Database*",
        "glue:*Table*",
        "glue:*Partition*",
        "glue:*UserDefinedFunction*",
        "glue:*Connection*"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/dev-*",
        "arn:aws:glue:us-east-1:111122223333:database/prod-*",
        "arn:aws:glue:us-east-1:111122223333:table/dev-*/*",
        "arn:aws:glue:us-east-1:111122223333:table/*/dev-*",
        "arn:aws:glue:us-east-1:111122223333:table/prod-*/*",
        "arn:aws:glue:us-east-1:111122223333:table/*/prod-*",
        "arn:aws:glue:us-east-1:111122223333:userDefinedFunction/dev-*/*",
        "arn:aws:glue:us-east-1:111122223333:userDefinedFunction/*/dev-*",
        "arn:aws:glue:us-east-1:111122223333:userDefinedFunction/prod-*/*",
        "arn:aws:glue:us-east-1:111122223333:userDefinedFunction/*/prod-*",
        "arn:aws:glue:us-east-1:111122223333:connection/dev-*",
        "arn:aws:glue:us-east-1:111122223333:connection/prod-*"
      ]
    },
    {
      "Sid": "ProdWriteDeny",
      "Effect": "Deny",
      "Action": [
        "glue:*Create*",
        "glue:*Update*",
        "glue:*Delete*"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:database/prod-*",
        "arn:aws:glue:us-east-1:111122223333:table/prod-*/*",
        "arn:aws:glue:us-east-1:111122223333:table/*/prod-*",
        "arn:aws:glue:us-east-1:111122223333:userDefinedFunction/prod-*/*",
        "arn:aws:glue:us-east-1:111122223333:userDefinedFunction/*/prod-*",
        "arn:aws:glue:us-east-1:111122223333:connection/prod-*"
      ]
    }
  ]
}
```

------

上述策略中的第二条语句使用显式 `deny`。您可以使用显式 `deny` 覆盖被授予委托人的任何 `allow` 权限。这样，您就可以锁定关键资源的访问权限，并阻止其他策略意外授予这些资源的访问权限。

在上述示例中，尽管第一条语句授予对 `prod-` 资源的完整访问权限，第二条语句则显式撤消这些资源的写入访问权限，只保留 `prod-` 资源的读取访问权限。

## 使用标签授权
使用标签的访问控制示例

例如，假设您想将对触发器 `t2` 的访问限制为您账户中名为 `Tom` 的特定用户。所有其他用户（包括 `Sam`）都有权访问触发器 `t1`。触发器 `t1` 和 `t2` 具有以下属性。

```
aws glue get-triggers
{
    "Triggers": [
        {
            "State": "CREATED",
            "Type": "SCHEDULED",
            "Name": "t1",
            "Actions": [
                {
                    "JobName": "j1"
                }
            ],
            "Schedule": "cron(0 0/1 * * ? *)"
        },
        {
            "State": "CREATED",
            "Type": "SCHEDULED",
            "Name": "t2",
            "Actions": [
                {
                    "JobName": "j1"
                }
            ],
            "Schedule": "cron(0 0/1 * * ? *)"
        }
    ]
}
```

Amazon Glue 管理员已将标签值 `Tom` (`aws:ResourceTag/Name": "Tom"`) 附加到触发器 `t2`。Amazon Glue 管理员还为 Tom 提供了一个 IAM policy，其中包含基于标签的条件语句。因此，Tom 只能使用对带标签值 `Tom` 的资源有效的 Amazon Glue 操作。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "glue:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Name": "Tom"
        }
      }
    }
  ]
}
```

------

当 Tom 尝试访问触发器 `t1` 时，他收到一条指示访问被拒绝的消息。同时，他可以成功检索触发器 `t2`。

```
aws glue get-trigger --name t1

An error occurred (AccessDeniedException) when calling the GetTrigger operation: User: Tom is not authorized to perform: glue:GetTrigger on resource: arn:aws:glue:us-east-1:123456789012:trigger/t1

aws glue get-trigger --name t2
{
    "Trigger": {
        "State": "CREATED",
        "Type": "SCHEDULED",
        "Name": "t2",
        "Actions": [
            {
                "JobName": "j1"
            }
        ],
        "Schedule": "cron(0 0/1 * * ? *)"
    }
}
```

Tom 无法使用复数 `GetTriggers` API 操作列出触发器，因为此操作不支持对标签进行筛选。

为了向 Tom 提供对 `GetTriggers` 的访问权限，Amazon Glue 管理员创建了一个将权限拆分为两部分的策略。一个部分允许 Tom 使用 `GetTriggers` API 操作访问所有触发器。另一个部分允许 Tom 访问使用值 `Tom` 标记的 API 操作。利用此策略，Tom 可以使用 `GetTriggers` 和 `GetTrigger` 来访问触发器 `t2`。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "glue:GetTriggers",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": "glue:*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Name": "Tom"
        }
      }
    }
  ]
}
```

------

## 使用标签拒绝访问
使用标签拒绝访问

另一种资源策略方法是明确拒绝对资源的访问。

**重要**  
显式拒绝策略不适用于复数 API 操作（如 `GetTriggers`）。

在以下示例策略中，允许所有 Amazon Glue 任务操作。但是，第二条 `Effect` 语句*明确*拒绝访问带有 `Team` 键和 `Special` 值标记的任务。

当管理员将以下策略附加到身份时，该身份可以访问*除*标记为 `Team` 键和 `Special` 值之外的所有任务。

## 将标签与 List 和 Batch API 操作结合使用


编写资源策略的第三种方法是允许使用 `List` API 操作访问资源以列出标签值的资源。然后，使用相应的 `Batch` API 操作以允许访问特定资源的详细信息。利用此方法，管理员无需允许访问复数 `GetCrawlers`、`GetDevEndpoints`、`GetJobs` 或 `GetTriggers` API 操作。相反，您可以允许使用以下 API 操作列出资源：
+ `ListCrawlers`
+ `ListDevEndpoints`
+ `ListJobs`
+ `ListTriggers`

此外，您可以允许使用以下 API 操作获取有关各个资源的详细信息：
+ `BatchGetCrawlers`
+ `BatchGetDevEndpoints`
+ `BatchGetJobs`
+ `BatchGetTriggers`

作为管理员，要使用此方法，您可以执行以下操作：

1. 将标签添加到您的爬网程序、开发终端节点、作业和触发器。

1. 拒绝用户对 `Get` API 操作（例如 `GetCrawlers`、`GetDevEndponts`、`GetJobs` 和 `GetTriggers`）的访问。

1. 要使用户能够查明他们有权访问的标记资源，请允许用户访问 `List` API 操作，例如 `ListCrawlers`、`ListDevEndponts`、`ListJobs` 和 `ListTriggers`。

1. 拒绝用户对 Amazon Glue 标记 API（例如 `TagResource` 和 `UntagResource`）的访问。

1. 允许用户使用 `BatchGet` API 操作（例如 `BatchGetCrawlers`、`BatchGetDevEndponts`、`BatchGetJobs` 和 `BatchGetTriggers`）访问资源详细信息。

例如，在调用 `ListCrawlers` 操作时，请提供标签值以匹配用户名。然后，结果是与提供的标签值匹配的爬网程序的列表。向 `BatchGetCrawlers` 提供名称列表以获取有关每个带给定标签的爬网程序的详细信息。

例如，如果 Tom 应只能检索标记了 `Tom` 的触发器的详细信息，管理员可将标签添加到 `Tom` 的触发器，拒绝所有用户对 `GetTriggers` API 操作的访问，并允许所有用户访问 `ListTriggers` 和 `BatchGetTriggers`。

以下是 Amazon Glue 管理员向 Tom 授予的资源策略。在此策略的第一个部分中，`GetTriggers` 拒绝 Amazon Glue API 操作。在此策略的第二个部分中，所有资源允许 `ListTriggers`。但在第三个部分中，允许使用 `BatchGetTriggers` 访问标记了 `Tom` 的那些资源。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "glue:GetTriggers",
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "glue:ListTriggers"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "glue:BatchGetTriggers"
      ],
      "Resource": [
        "*"
      ],
      "Condition": {
        "StringEquals": {
          "aws:ResourceTag/Name": "Tom"
        }
      }
    }
  ]
}
```

------

通过使用上一个示例中的相同触发器，Tom 可以访问触发器 `t2` 而不是触发器 `t1`。以下示例显示了 Tom 尝试使用 `BatchGetTriggers` 访问 `t1` 和 `t2` 时的结果。

```
aws glue batch-get-triggers --trigger-names t2
{
    "Triggers": {
        "State": "CREATED",
        "Type": "SCHEDULED",
        "Name": "t2",
        "Actions": [
            {
                "JobName": "j2"
            }
        ],
        "Schedule": "cron(0 0/1 * * ? *)"
    }
}

aws glue batch-get-triggers  --trigger-names t1

An error occurred (AccessDeniedException) when calling the BatchGetTriggers operation: No access to any requested resource.
```

以下示例显示了 Tom 尝试通过同一 `BatchGetTriggers` 调用访问触发器 `t2` 和触发器 `t3`（不存在）时的结果。请注意，由于 Tom 有权访问触发器 `t2` 且该触发器存在，因此，仅返回 `t2`。虽然 Tom 有权访问触发器 `t3`，但触发器 `t3` 不存在，因此在 `"TriggersNotFound": []` 列表的响应中将返回 `t3`。

```
aws glue batch-get-triggers --trigger-names t2 t3
{
    "Triggers": {
        "State": "CREATED",
        "Type": "SCHEDULED",
        "Name": "t2",
        "Actions": [
            {
                "JobName": "j2"
            }
        ],
        "TriggersNotFound": ["t3"],
        "Schedule": "cron(0 0/1 * * ? *)"
    }
}
```

## 使用条件键或上下文键控制设置
创建使用条件键控制设置的策略

授予创建和更新任务的权限时，可以使用条件键或上下文键。以下部分讨论了这些键：
+ [使用条件键控制设置的策略](#glue-identity-based-policy-condition-key-vpc)
+ [控制使用上下文键控制设置的策略](#glue-identity-based-policy-context-key-glue)

### 使用条件键控制设置的策略
使用条件键控制设置

Amazon Glue 提供了三个 IAM 条件键，分别是 `glue:VpcIds`、`glue:SubnetIds` 和 `glue:SecurityGroupIds`。授予创建和更新任务的权限时，可以使用 IAM policy 中的条件键。您可以使用此设置确保创建（或更新）的作业或会话不会在所需 VPC 环境之外运行。VPC 设置信息不是 `CreateJob` 请求中的直接输入，而是从指向 Amazon Glue 连接的任务“连接”字段推断得出。

**示例用法**  
使用所需的 VpcId "vpc-id1234"、SubnetIds 和 SecurityGroupIds 创建名为 "traffic-monitored-connection"（流量监控连接）的 Amazon Glue 网络类型连接。

为 IAM policy 中的 `CreateJob` 和 `UpdateJob` 操作指定条件键条件。

```
{
  "Effect": "Allow",
  "Action": [
    "glue:CreateJob",
    "glue:UpdateJob"
  ],
  "Resource": [
    "*"
  ],
  "Condition": {
    "ForAnyValue:StringLike": {
      "glue:VpcIds": [
        "vpc-id1234"
      ]
    }
  }
}
```

 您可以创建类似的 IAM policy，以禁止在不指定连接信息的情况下创建 Amazon Glue 任务。

**限制 VPC 上的会话**

 要强制创建的会话在指定的 VPC 内运行，您可以通过对 `glue:CreateSession` 操作添加 `Deny` 效果来限制角色权限，条件是 glue:vpc-id 不等于 vpc-<123>。例如：

```
"Effect": "Deny",
"Action": [
    "glue:CreateSession"
 ],
"Condition": {
    "StringNotEquals" : {"glue:VpcIds" : ["vpc-123"]} 
}
```

 您还可以将创建的会话强制在 VPC 内运行，方法是为 `Deny` 是空的 `glue:CreateSession` 操作添加 `glue:vpc-id` 效果。例如：

```
{
    "Effect": "Deny",
    "Action": [
        "glue:CreateSession"
    ],
      "Condition": {
        "Null": {"glue:VpcIds": true}
    }
}, 
{
    "Effect": "Allow",
    "Action": [
        "glue:CreateSession"
    ],
    "Resource": ["*"]
}
```

### 控制使用上下文键控制设置的策略
使用上下文键控制设置

Amazon Glue 为 Amazon Glue 提供给任务和开发人员端点的每个角色会话提供了上下文键 (`glue:CredentialIssuingService= glue.amazonaws.com`)。这允许您对 Amazon Glue 脚本执行的操作实施安全控制。Amazon Glue 还为每个角色会话提供了另一个上下文键（`glue:RoleAssumedBy=glue.amazonaws.com`），其中 Amazon Glue 会代表客户调用另一个 Amazon 服务（不是通过任务/开发端点，而是直接通过 Amazon Glue 服务）。

**示例用法**  
在 IAM policy 中指定条件权限，并将其附上 Amazon Glue 任务要使用的角色。这确保了可以基于角色会话是否用于 Amazon Glue 任务运行时环境而允许/拒绝某些操作。

```
{
    "Effect": "Allow",
    "Action": "s3:GetObject",
    "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*",
    "Condition": {
        "StringEquals": {
            "glue:CredentialIssuingService": "glue.amazonaws.com"
        }
    }
}
```

## 拒绝某个身份创建数据预览会话


该部分包含一个 IAM policy 示例，用于拒绝某个身份创建数据预览会话。将此策略附加到身份，该身份与数据预览会话在运行期间使用的角色是分开的。

```
{
    "Sid": "DatapreviewDeny",
    "Effect": "Deny",
     "Action": [
           "glue:CreateSession"
     ],
     "Resource": [
          "arn:aws:glue:*:*:session/glue-studio-datapreview*"
      ]
 }
```

# Amazon Glue 基于资源的策略示例
基于资源的策略示例

本部分包含基于资源的策略示例，其中包括用于授予跨账户存取的策略。

此示例使用 Amazon Command Line Interface（Amazon CLI）与 Amazon Glue 服务 API 操作进行交互。您可以使用 Amazon Glue 控制台或使用 Amazon SDK 之一执行相同操作。

**重要**  
通过更改 Amazon Glue 资源策略，您可能意外撤消您账户中现有 Amazon Glue 用户的权限并导致意外中断。仅在开发或测试账户中尝试这些示例，并确保它们不会中断任何现有的工作流，然后再进行更改。

**Topics**
+ [

## 将基于资源的策略用于 Amazon Glue 的注意事项
](#security_iam_resource-based-policy-examples-considerations)
+ [

## 使用资源策略控制同一账户中的访问
](#glue-policy-resource-policies-example-same-account)

## 将基于资源的策略用于 Amazon Glue 的注意事项
注意事项

**注意**  
IAM policy 和 Amazon Glue 资源策略都需要几秒钟进行传播。附加新策略后，您可能会注意到，旧策略仍有效，直至新策略传播到整个系统。

可使用以 JSON 格式编写的策略文档来创建或修改资源策略。策略语法与基于身份的 IAM policy 相同（请参阅 [IAM JSON 策略参考](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies.html)），但存在以下例外：
+ 每条策略语句需要一个 `"Principal"` 或 `"NotPrincipal"` 块。
+ `"Principal"` 或 `"NotPrincipal"` 必须识别有效的现有主体。不允许使用通配符模式（如 `arn:aws:iam::account-id:user/*`）。
+ 策略中的 `"Resource"` 块要求所有资源 ARN 均与以下正则表达式语法匹配（其中第一个 `%s` 为 *region*，第二个 `%s` 为 *account-id*）：

  ```
  *arn:aws:glue:%s:%s:(\*|[a-zA-Z\*]+\/?.*)
  ```

  例如，`arn:aws:glue:us-west-2:account-id:*` 和 `arn:aws:glue:us-west-2:account-id:database/default` 都允许使用，但不允许 `*`。
+ 与基于身份的策略不同，Amazon Glue 资源策略只能包含属于该策略附加到的目录的资源的 Amazon 资源名称（ARN）。此类 ARN 总是以 `arn:aws:glue:` 开头。
+ 策略不能导致创建它的身份被锁定，无法进一步创建或修改策略。
+ 资源策略 JSON 文档的大小不能超过 10 KB。

## 使用资源策略控制同一账户中的访问
同一账户的访问

在此示例中，账户 A 中的管理员用户创建一个资源策略，该策略向账户 A 中的 IAM 用户 `Alice` 授予对目录的完整访问权限。Alice 未附加 IAM policy。

为执行此操作，管理员用户需运行以下 Amazon CLI 命令。

```
# Run as admin of Account A
$ aws glue put-resource-policy --profile administrator-name --region us-west-2 --policy-in-json '{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Principal": {
        "AWS": [
          "arn:aws:iam::account-A-id:user/Alice"
        ]
      },
      "Effect": "Allow",
      "Action": [
        "glue:*"
      ],
      "Resource": [
        "arn:aws:glue:us-west-2:account-A-id:*"
      ]
    }
  ]
}'
```

不是在 Amazon CLI 命令中输入 JSON 策略文档，您可以将策略文档保存在一个文件中，然后在 Amazon CLI 命令中引用该文件路径，前缀为 `file://`。下面是具体操作示例。

```
$ echo '{
  "Version": "2012-10-17",		 	 	 
  "Statement": [
    {
      "Principal": {
        "AWS": [
          "arn:aws:iam::account-A-id:user/Alice"
        ]
      },
      "Effect": "Allow",
      "Action": [
        "glue:*"
      ],
      "Resource": [
        "arn:aws:glue:us-west-2:account-A-id:*"
      ]
    }
  ]
}' > /temp/policy.json

$ aws glue put-resource-policy --profile admin1 \
    --region us-west-2 --policy-in-json file:///temp/policy.json
```

在此资源策略传播后，Alice 可以访问账户 A 中的所有 Amazon Glue 资源，如下所示。

```
# Run as user Alice
$ aws glue create-database --profile alice --region us-west-2 --database-input '{
    "Name": "new_database",
    "Description": "A new database created by Alice",
    "LocationUri": "s3://amzn-s3-demo-bucket"
}'

$ aws glue get-table --profile alice --region us-west-2 --database-name "default" --table-name "tbl1"}
```

为了响应 Alice 的 `get-table` 调用，Amazon Glue 服务将返回以下内容。

```
{
  "Table": {
    "Name": "tbl1",
    "PartitionKeys": [],
    "StorageDescriptor": {
        ......
    },
    ......
  }
}
```

# 授予 Amazon Glue 的 Amazon 托管式策略
授予 Amazon 托管式策略

Amazon 托管式策略是由 Amazon 创建和管理的独立策略。Amazon 托管式策略旨在为许多常见使用案例提供权限，以便您可以开始为用户、组和角色分配权限。

请记住，Amazon 托管式策略可能不会为您的特定使用案例授予最低权限，因为它们可供所有 Amazon 客户使用。我们建议通过定义特定于使用案例的[客户管理型策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#customer-managed-policies)来进一步减少权限。

您无法更改 Amazon 托管式策略中定义的权限。如果 Amazon 更新在 Amazon 托管式策略中定义的权限，则更新会影响该策略所附加到的所有主体身份（用户、组和角色）。当新的 Amazon Web Services 服务 启动或新的 API 操作可用于现有服务时，Amazon 最有可能更新 Amazon 托管式策略。

有关更多信息，请参阅《IAM 用户指南》**中的 [Amazon 托管式策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)。

## 适用于 Amazon Glue 的 Amazon 托管（预定义）策略


Amazon 通过提供由 Amazon 创建和管理的独立 IAM policy 来满足许多常用案例的要求。这些 Amazon 托管策略可针对常用案例授予必要的权限，使您免去调查所需权限的工作。有关更多信息，请参阅《IAM 用户指南》中的 [Amazon 托管式策略](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies_managed-vs-inline.html#aws-managed-policies)**。

下面的 Amazon 托管策略可附加到您账户中的身份，这些托管策略特定于 Amazon Glue 并且按使用案例场景进行分组：
+ [AWSGlueConsoleFullAccess](https://console.amazonaws.cn/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleFullAccess)：当策略所附加的身份使用 Amazon Web Services 管理控制台 资源时，授予对 Amazon Glue 资源的完全访问权限。如果遵循此策略中指定的资源的命名约定，则用户具有完全控制台功能。此策略通常附加到 Amazon Glue 控制台的用户。
+ [AWSGlueServiceRole](https://console.amazonaws.cn/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole) – 授予对各种 Amazon Glue 进程代表您运行所需的资源的访问权限。这些资源包括 Amazon Glue、Amazon S3、IAM、CloudWatch Logs 和 Amazon EC2。如果您遵循此策略中指定的资源的命名约定，则 Amazon Glue 进程具有所需的权限。此策略通常附加到在定义爬网程序、作业和开发终端节点时指定的角色。
+ [AwsGlueSessionUserRestrictedServiceRole](https://console.amazonaws.cn/iam/home#policies/details/arn:aws:iam::aws:policy%2Fservice-role%2FAwsGlueSessionUserRestrictedServiceRole) – 提供对除会话之外的所有 Amazon Glue 资源的完全访问权限。允许用户仅创建和使用与用户关联的交互式会话。此策略包括由 Amazon Glue 管理其他 Amazon 服务中的 Amazon Glue 资源所需的其他权限。此策略还允许向其他 Amazon 服务中的 Amazon Glue 资源添加标签。
**注意**  
若要完全实现安全益处，请勿将此策略授予分配到 `AWSGlueServiceRole`、`AWSGlueConsoleFullAccess` 或 `AWSGlueConsoleSageMakerNotebookFullAccess` 策略的用户。
+ [AwsGlueSessionUserRestrictedPolicy](https://console.amazonaws.cn/iam/home#policies/arn:aws:iam::aws:policy/AwsGlueSessionUserRestrictedPolicy)：仅当提供的标签键“拥有者”和值与受让人的 Amazon Glue 用户 ID 匹配时，才提供使用 `CreateSession` API 操作创建 Amazon 交互式会话的访问权限。此身份策略已附上调用 `CreateSession` API 操作的 IAM用户。此策略还允许受让人与使用和其 Amazon 用户 ID 匹配的“拥有者”标签和值创建的 Amazon Glue 交互式会话资源进行交互。此策略拒绝在创建会话后从 Amazon Glue 会话资源中更改或删除“拥有者”标签的权限。
**注意**  
若要完全实现安全益处，请勿将此策略授予分配到 `AWSGlueServiceRole`、`AWSGlueConsoleFullAccess` 或 `AWSGlueConsoleSageMakerNotebookFullAccess` 策略的用户。
+ [AwsGlueSessionUserRestrictedNotebookServiceRole](https://console.amazonaws.cn/iam/home#policies/arn:aws:iam::aws:policy/AwsGlueSessionUserRestrictedNotebookServiceRole)：提供足够的 Amazon Glue Studio 笔记本会话访问权限，以便与特定的 Amazon Glue 交互式会话资源进行交互。这些是使用与创建笔记本的主体（IAM 用户或角色）的 Amazon 用户 ID 匹配的“拥有者”标签值创建的资源。有关这些标签的更多信息，请参阅 *IAM 用户指南*中的[主体键值](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_variables.html#policy-vars-infotouse)图表。

  此服务角色策略将附上使用笔记本中的魔术命令指定的角色，或作为角色传递给 `CreateSession` API 操作。此策略还允许主体仅当标签键“拥有者”和值与主体的 Amazon 用户 ID 匹配时，才从 Amazon Glue Studio 笔记本界面创建 Amazon Glue 交互式会话。此策略拒绝在创建会话后从 Amazon Glue 会话资源中更改或删除“拥有者”标签的权限。此策略还包括写入和读取 Amazon S3 存储桶、写入 CloudWatch 日志和为 Amazon Glue 使用的 Amazon EC2 资源创建和删除标签的权限。
**注意**  
若要完全实现安全益处，请勿将此策略授予分配到 `AWSGlueServiceRole`、`AWSGlueConsoleFullAccess` 或 `AWSGlueConsoleSageMakerNotebookFullAccess` 策略的角色。
+ [AwsGlueSessionUserRestrictedNotebookPolicy](https://console.amazonaws.cn/iam/home#policies/arn:aws:iam::aws:policy/AwsGlueSessionUserRestrictedNotebookPolicy)：仅当存在标签键“拥有者”和值与创建笔记本的主体（IAM 用户或角色）的 Amazon 用户 ID 匹配时，才提供从 Amazon Glue Studio 笔记本界面创建 Amazon Glue 交互式会话的访问权限。有关这些标签的更多信息，请参阅 *IAM 用户指南*中的[主体键值](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_variables.html#policy-vars-infotouse)图表。

  此策略已附上从 Amazon Glue Studio 笔记本界面创建会话的主体（IAM 用户或角色）。此策略还允许对 Amazon Glue Studio 笔记本的充分访问权限，以便与特定的 Amazon Glue 交互式会话资源进行交互。这些是使用与主体的 Amazon 用户 ID 匹配的“拥有者”标签值创建的资源。此策略拒绝在创建会话后从 Amazon Glue 会话资源中更改或删除“拥有者”标签的权限。
+ [AWSGlueServiceNotebookRole](https://console.amazonaws.cn/iam/home#policies/arn:aws:iam::aws:policy/service-role/AWSGlueServiceNotebookRole)：授予对 Amazon Glue Studio 笔记本中开启的 Amazon Glue 会话的访问权限。此策略允许列出和获取所有会话的会话信息，但仅允许用户创建和使用标记为其 Amazon 用户 ID 的会话。此策略会拒绝从标记为其 Amazon ID 的 Amazon Glue 会话资源中更改或删除“拥有者”标签的权限。

  将此策略分配给使用 Amazon Glue Studio 中的笔记本界面创建任务的 Amazon 用户。
+ [AWSGlueConsoleSageMakerNotebookFullAccess](https://console.amazonaws.cn/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueConsoleSageMakerNotebookFullAccess)：在策略所附加的身份使用 Amazon Web Services 管理控制台时，授予对 Amazon Glue 和 SageMaker AI 资源的完全访问权限。如果遵循此策略中指定的资源的命名约定，则用户具有完全控制台功能。此策略通常附加到管理 SageMaker AI 笔记本的 Amazon Glue 控制台的用户。
+ [AWSGlueSchemaRegistryFullAccess](https://console.amazonaws.cn/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueSchemaRegistryFullAccess)：在策略所附加的身份使用 Amazon Web Services 管理控制台 或 Amazon CLI 时，授予对 Amazon Glue 架构注册表资源的完全访问权限。如果遵循此策略中指定的资源的命名约定，则用户具有完全控制台功能。此策略通常附加到管理 Amazon Glue 架构注册表的 Amazon Glue 控制台或 Amazon CLI 的用户。
+ [AWSGlueSchemaRegistryReadonlyAccess](https://console.amazonaws.cn/iam/home#policies/arn:aws:iam::aws:policy/AWSGlueSchemaRegistryReadonlyAccess)：在策略附加到的身份使用 Amazon Web Services 管理控制台 或 Amazon CLI 时，授予对 Amazon Glue 架构注册表资源的只读访问权限。如果遵循此策略中指定的资源的命名约定，则用户具有完全控制台功能。此策略通常附加到使用 Amazon Glue 架构注册表的 Amazon Glue 控制台或 Amazon CLI 的用户。

**注意**  
您可以通过登录到 IAM 控制台并在该控制台中搜索特定策略来查看这些权限策略。

此外，您还可以创建您自己的自定义 IAM 策略，以授予 Amazon Glue 操作和资源的相关权限。您可以将这些自定义策略附加到需要这些权限的 IAM 用户或组。

要使用自定义 IAM 角色创建具有 VPC 配置的连接，它必须具有以下 VPC 访问操作：
+ secretsmanager:GetSecretValue
+ secretsmanager:PutSecretValue
+ secretsmanager:DescribeSecret
+ ec2:CreateNetworkInterface
+ ec2:DeleteNetworkInterface
+ ec2:DescribeNetworkInterfaces
+ ec2:DescribeSubnets

## Amazon Glue 对 Amazon 托管策略的更新
策略更新



查看有关 Amazon Glue 的 Amazon 托管策略更新的详细信息（从该服务开始跟踪这些更改开始）。有关此页面更改的自动提示，请订阅 Amazon Glue 文档历史记录页面上的 RSS 源。




| 更改 | 描述 | 日期 | 
| --- | --- | --- | 
| AwsGlueSessionUserRestrictedNotebookPolicy – 对现有策略的次要更新。 | 添加允许对拥有者标签键执行 glue:TagResource 操作。对于具备拥有者标签键的会话，需要支持创建时加上标签功能。 | 2024 年 8 月 30 日 | 
| AwsGlueSessionUserRestrictedNotebookServiceRole – 对现有策略的次要更新。 | 添加允许对拥有者标签键执行 glue:TagResource 操作。对于具备拥有者标签键的会话，需要支持创建时加上标签功能。 | 2024 年 8 月 30 日 | 
| AwsGlueSessionUserRestrictedPolicy – 对现有策略的次要更新。 | 添加允许对拥有者标签键执行 glue:TagResource 操作。对于具备拥有者标签键的会话，需要支持创建时加上标签功能。 | 2024 年 8 月 5 日 | 
| AwsGlueSessionUserRestrictedServiceRole – 对现有策略的次要更新。 | 添加允许对拥有者标签键执行 glue:TagResource 操作。对于具备拥有者标签键的会话，需要支持创建时加上标签功能。 | 2024 年 8 月 5 日 | 
| AwsGlueSessionUserRestrictedPolicy – 对现有策略的次要更新。 | 将 glue:StartCompletion 和 glue:GetCompletion 添加到策略。对于 Amazon Glue 中的 Amazon Q 集成为必需。 | 2024 年 4 月 30 日 | 
| AwsGlueSessionUserRestrictedNotebookServiceRole – 对现有策略的次要更新。 | 将 glue:StartCompletion 和 glue:GetCompletion 添加到策略。对于 Amazon Glue 中的 Amazon Q 集成为必需。 | 2024 年 4 月 30 日 | 
| AwsGlueSessionUserRestrictedServiceRole – 对现有策略的次要更新。 | 将 glue:StartCompletion 和 glue:GetCompletion 添加到策略。对于 Amazon Glue 中的 Amazon Q 集成为必需。 | 2024 年 4 月 30 日 | 
| AWSGlueServiceNotebookRole – 对现有策略的微小更新。 | 将 glue:StartCompletion 和 glue:GetCompletion 添加到策略。对于 Amazon Glue 中的 Amazon Q 集成为必需。 | 2024 年 1 月 30 日 | 
| AwsGlueSessionUserRestrictedNotebookPolicy – 对现有策略的次要更新。 | 将 glue:StartCompletion 和 glue:GetCompletion 添加到策略。对于 Amazon Glue 中的 Amazon Q 集成为必需。 | 2023 年 11 月 29 日 | 
| AWSGlueServiceNotebookRole – 对现有策略的微小更新。 | 为策略添加 codewhisperer:GenerateRecommendations。Amazon Glue 生成 CodeWhisperer 推荐所用新功能所必需的。 | 2023 年 10 月 9 日 | 
|  AWSGlueServiceRole – 对现有策略的微小更新。  |  收紧 CloudWatch 权限的范围，以更好地反映 Amazon Glue 日志记录。 | 2023 年 8 月 4 日 | 
|  AWSGlueConsoleFullAccess：对现有策略的微小更新。  |  向策略添加 databrew 配方列表和描述权限。需要为 Amazon Glue 可以访问配方的新功能提供完全的管理权限。 | 2023 年 5 月 9 日 | 
|  AWSGlueConsoleFullAccess：对现有策略的微小更新。  |  为策略添加 cloudformation:ListStacks。Amazon CloudFormation 授权要求变更后保留现有功能。 | 2023 年 3 月 28 日 | 
|  为交互式会话功能添加了新的托管策略 [\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/glue/latest/dg/security-iam-awsmanpol.html)  |  这些策略旨在为 Amazon Glue Studio 中的交互式会话和笔记本提供额外的安全性。这些策略会限制对 `CreateSession` API 操作的访问，使得只有拥有者有权访问。  | 2021 年 11 月 30 日 | 
|  AWSGlueConsoleSageMakerNotebookFullAccess：对现有策略的更新  |  为以下操作删除了冗余资源 ARN（`arn:aws:s3:::aws-glue-*/*`）：为 Amazon Glue 用于存储脚本和临时文件的 Amazon S3 存储桶授予读取/写入权限。 通过将 `"StringEquals"` 更改为 `"ForAnyValue:StringLike"` 修复了语法问题，并且在行乱序的每个位置将 ` "Effect": "Allow"` 行移到 `"Action":` 行之前。  | 2021 年 7 月 15 日 | 
|  AWSGlueConsoleFullAccess：对现有策略的更新  | 为以下操作删除了冗余资源 ARN（arn:aws:s3:::aws-glue-\$1/\$1）：为 Amazon Glue 用于存储脚本和临时文件的 Amazon S3 存储桶授予读取/写入权限。 | 2021 年 7 月 15 日 | 
|  Amazon Glue 已开启跟踪更改  | Amazon Glue 为其 Amazon 托管策略开启了跟踪更改。 | 2021 年 6 月 10 日 | 

# 为作业执行授予动态范围限定策略
授予动态范围限定策略

Amazon Glue 提供了一项强大的新功能：用于作业执行的动态会话策略。此功能可以为每个作业运行指定自定义的精细权限，而无需创建多个 IAM 角色。

使用 `StartJobRun` API 启动 Glue 作业时，您可以包含内联会话策略。此策略会临时修改作业的执行角色在该特定作业运行期间的权限。这类似于在其他 Amazon 服务中通过 `AssumeRole` API 使用临时凭证。
+ **增强安全性**：您可以将作业权限限制为每次运行所需的最低权限。
+ **简化管理**：无需为不同的场景创建和维护大量 IAM 角色。
+ **灵活性**：您可以根据运行时参数或租户特定需求动态调整权限。
+ **可扩展性**：此方法非常适合需要在租户之间隔离资源的多租户环境。

**授予动态范围限定策略的使用示例：**

以下示例演示如何仅授予作业对特定 Amazon S3 存储桶路径的*读**写*访问权限，其中路径由作业运行 ID 动态确定。此示例说明如何为每个作业运行实现精细的执行特定权限。

**通过 CLI**

```
aws glue start-job-run \
    --job-name "your-job-name" \
    --execution-role-session-policy '{
        "Version": "2012-10-17",		 	 	 
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:PutObject"
                ],
                "Resource": [
                    "arn:aws:s3:::specific-bucket/${JobRunId}/*"
                ]
            }
        ]
    }'
```

# 指定 Amazon Glue 资源 ARN
指定 Amazon Glue 资源 ARN

在 Amazon Glue 中，您可以使用 Amazon Identity and Access Management（IAM）policy 控制对资源的访问。在策略中，您可以使用 Amazon 资源名称（ARN）标识策略应用到的资源。并非 Amazon Glue 中的所有资源都支持 ARN。

**Topics**
+ [

## 数据目录 ARN
](#data-catalog-resource-arns)
+ [

## Amazon Glue 中非目录对象的 ARN
](#non-catalog-resource-arns)
+ [

## Amazon Glue 非目录单数 API 操作的访问控制
](#non-catalog-singular-apis)
+ [

## 检索多个项目的 Amazon Glue 非目录 API 操作的访问控制
](#non-catalog-plural-apis)
+ [

## Amazon Glue 非目录 BatchGet API 操作的访问控制
](#non-catalog-batch-get-apis)

## 数据目录 ARN
数据目录 ARN

数据目录资源具有层次结构，其中以 `catalog` 作为根。

```
arn:aws:glue:region:account-id:catalog
```

每个 Amazon 账户在 Amazon 区域中有单个数据目录，以 12 位的账户 ID 作为目录 ID。资源具有与其关联的唯一 ARN，如下表所示。


| **资源类型**  |  **ARN 格式**  | 
| --- | --- | 
| 目录 |  `arn:aws:glue:region:account-id:catalog` 例如：`arn:aws:glue:us-east-1:123456789012:catalog`  | 
| 数据库 |  `arn:aws:glue:region:account-id:database/database name` 例如：`arn:aws:glue:us-east-1:123456789012:database/db1`  | 
| 表 |  `arn:aws:glue:region:account-id:table/database name/table name` 例如：`arn:aws:glue:us-east-1:123456789012:table/db1/tbl1`  | 
| 联合 S3 表目录（所有表存储桶） |   `arn:aws:glue:region:account-id:catalog/s3tablescatalog`  例如：`arn:aws:glue:us-east-1:123456789012:catalog/s3tablescatalog`  | 
| 联合 S3 表存储桶目录（子目录） |   `arn:aws:glue:region:account-id:catalog/s3tablescatalog/bucket name`  例如：`arn:aws:glue:us-east-1:123456789012:catalog/s3tablescatalog/amzn-s3-demo-bucket1`  | 
| 联合 S3 表数据库 |   `arn:aws:glue:region:account-id:database/s3tablescatalog/child catalog name/database name`  例如：`arn:aws:glue:us-east-1:123456789012:database/s3tablescatalog/amzn-s3-demo-bucket1/nsdb1`  | 
| 联合 S3 表 |   `arn:aws:glue:region:account-id:table/s3tablescatalog/child catalog name/database name/table name`  例如：`arn:aws:glue:us-east-1:123456789012:table/s3tablescatalog/amzn-s3-demo-bucket1/nsdb1/s3tbl1`  | 
| 联合 S3 表目录（在 Lake Formation 中注册的单个表存储桶） | `arn:aws:glue:region:account-id:catalog`/*目录名称*  例如：`arn:aws:glue:us-east-1:123456789012:catalog/amzn-s3-demo-bucket1`  | 
| 联合 S3 表数据库  | `arn:aws:glue:region:account-id:catalog`/*目录名称*/*数据库名称* 例如：`arn:aws:glue:us-east-1:123456789012:database/amzn-s3-demo-bucket1/nsdb1`  | 
| 联合 S3 表 | `arn:aws:glue:region:account-id:catalog`/*目录名称*/*数据库名称*/*表名*  例如：`arn:aws:glue:us-east-1:123456789012:table/amzn-s3-demo-bucket1/nsdb1/s3tbl1`  | 
| 联合或托管目录（多目录中的顶级目录） |   `arn:aws:glue:region:account-id:catalog/top-level catalog name`  例如：`arn:aws:glue:us-east-1:123456789012:catalog/nscatalog` 托管目录的 ARN 格式遵循相同的结构。  | 
| 联合多级目录（多级目录中的子目录） |   `arn:aws:glue:region:account-id:catalog/top-level catalog name/child catalog name`  例如：`arn:aws:glue:us-east-1:123456789012:catalog/nscatalog/dbcatalog`  | 
| 联合数据库 |   `arn:aws:glue:region:account-id:database/name space catalog name/child catalog name/database name`  例如：`arn:aws:glue:us-east-1:123456789012:database/nscatalog/dbcatalog/schemadb`  | 
| 联合表 |   `arn:aws:glue:region:account-id:table/name space catalog name/child catalog name/database name/table name`  例如：`arn:aws:glue:us-east-1:123456789012:table/nscatalog/dbcatalog/schemadb/rstbl1`  | 
| 目录链接容器 | `arn:aws:glue:region:account-id:catalog`/*链接容器名称* 例如：`arn:aws:glue:glue:us-east-1:123456789012:catalog`/linkcontainer-examle   | 
| 数据库 | `arn:aws:glue:region:account-id:catalog`/*链接容器名称*/*数据库名称* 例如：`arn:aws:glue:glue:us-east-1:123456789012:database`/linkcontainer-example/link-db  | 
| 用户定义的函数 |  `arn:aws:glue:region:account-id:userDefinedFunction/database name/user-defined function name` 例如：`arn:aws:glue:us-east-1:123456789012:userDefinedFunction/db1/func1`  | 
| Connection |  `arn:aws:glue:region:account-id:connection/connection name` 例如：`arn:aws:glue:us-east-1:123456789012:connection/connection1`  | 
| 交互式会话 |  `arn:aws:glue:region:account-id:session/interactive session id` 例如：`arn:aws:glue:us-east-1:123456789012:session/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111`  | 

要启用精细访问控制，您可以在 IAM policy 和资源策略中使用这些 ARN 来授予或拒绝对特定资源的访问权限。允许在策略中使用通配符。例如，以下 ARN 与数据库 `default` 中的所有表匹配。

```
arn:aws:glue:us-east-1:123456789012:table/default/*
```

**重要**  
对数据目录资源执行所有操作都需要具有对该资源及其所有原级的权限。例如，要为一个表创建分区，需要具有该表的权限以及该表所在数据库和目录的权限。以下示例显示对数据目录中的数据库 `PrivateDatabase` 中的表 `PrivateTable` 创建分区所需的权限。  

```
{
   "Sid": "GrantCreatePartitions",
   "Effect": "Allow",
   "Action": [
       "glue:BatchCreatePartitions"
   ],
   "Resource": [
       "arn:aws:glue:us-east-1:123456789012:table/PrivateDatabase/PrivateTable",
       "arn:aws:glue:us-east-1:123456789012:database/PrivateDatabase",
       "arn:aws:glue:us-east-1:123456789012:catalog"
   ]
}
```
除了对资源及其所有原级的权限外，所有删除操作还需要具有该资源的所有子级的权限。例如，要删除一个数据库，您需要具有该数据库中的所有表和用户定义函数的权限，以及该数据库及其所在目录的权限。以下示例显示删除数据目录中的数据库 `PrivateDatabase` 所需的权限。  

```
{
   "Sid": "GrantDeleteDatabase",
   "Effect": "Allow",
   "Action": [
       "glue:DeleteDatabase"
   ],
   "Resource": [
       "arn:aws:glue:us-east-1:123456789012:table/PrivateDatabase/*",
       "arn:aws:glue:us-east-1:123456789012:userDefinedFunction/PrivateDatabase/*",
       "arn:aws:glue:us-east-1:123456789012:database/PrivateDatabase",
       "arn:aws:glue:us-east-1:123456789012:catalog"
   ]
}
```
概括来说，对数据目录资源的操作遵循以下权限规则：  
针对目录的操作只需要具有目录的权限。
针对数据库的操作需要具有数据库和目录的权限。
针对数据库的删除操作需要具有数据库和目录的权限，以及数据库中所有表和用户定义函数的权限。
针对表、分区或表版本的操作需要具有表、数据库和目录的权限。
针对用户定义的函数的操作需要具有用户定义的函数、数据库和目录的权限。
针对连接的操作需要具有连接和目录的权限。

## Amazon Glue 中非目录对象的 ARN
非目录 ARN

有些 Amazon Glue 资源允许资源级权限使用 ARN 来控制访问。您可以在 IAM policy 中使用这些 ARN 来启用精细访问控制。下表列出了可以包含资源 ARN 的资源。


| **资源类型**  |  **ARN 格式**  | 
| --- | --- | 
| 爬网程序 |  `arn:aws:glue:region:account-id:crawler/crawler-name` 例如：`arn:aws:glue:us-east-1:123456789012:crawler/mycrawler`  | 
| 任务 |  `arn:aws:glue:region:account-id:job/job-name` 例如：`arn:aws:glue:us-east-1:123456789012:job/testjob`  | 
| 触发器 |  `arn:aws:glue:region:account-id:trigger/trigger-name` 例如：`arn:aws:glue:us-east-1:123456789012:trigger/sampletrigger`  | 
| 开发终端节点 |  `arn:aws:glue:region:account-id:devEndpoint/development-endpoint-name` 例如：`arn:aws:glue:us-east-1:123456789012:devEndpoint/temporarydevendpoint`  | 
| 机器学习转换 |  `arn:aws:glue:region:account-id:mlTransform/transform-id` 例如：`arn:aws:glue:us-east-1:123456789012:mlTransform/tfm-1234567890`  | 

## Amazon Glue 非目录单数 API 操作的访问控制
非目录单数 API 的访问

Amazon Glue 非目录*单数* API 操作对单个项目（开发终端节点）执行。示例包括 `GetDevEndpoint`、`CreateUpdateDevEndpoint` 和 `UpdateDevEndpoint`。对于这些操作，策略必须将 API 名称放在 `"action"` 块中，将资源 ARN 放在 `"resource"` 块中。

假设您要允许用户调用 `GetDevEndpoint` 操作。以下策略将所需的最低权限授予名为 `myDevEndpoint-1` 的终端节点。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "MinimumPermissions",
      "Effect": "Allow",
      "Action": "glue:GetDevEndpoint",
      "Resource": "arn:aws:glue:us-east-1:111122223333:devEndpoint/myDevEndpoint-1"
    }
  ]
}
```

------

以下策略允许 `UpdateDevEndpoint` 访问用通配符 (\$1) 与 `myDevEndpoint-` 匹配的资源。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "PermissionWithWildcard",
      "Effect": "Allow",
      "Action": "glue:UpdateDevEndpoint",
      "Resource": "arn:aws:glue:us-east-1:111122223333:devEndpoint/myDevEndpoint-*"
    }
  ]
}
```

------

您可以合并两个策略，如以下示例所示。您可能会看到名称以 `A` 开头的任何开发终端节点的 `EntityNotFoundException`。不过，当您尝试访问其他开发终端节点时，将返回一个访问被拒绝错误。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "CombinedPermissions",
      "Effect": "Allow",
      "Action": [
        "glue:UpdateDevEndpoint",
        "glue:GetDevEndpoint"
      ],
      "Resource": "arn:aws:glue:us-east-1:111122223333:devEndpoint/A*"
    }
  ]
}
```

------

## 检索多个项目的 Amazon Glue 非目录 API 操作的访问控制
get[\$1] 非目录 API 的访问

有些 Amazon Glue API 操作检索多个项目（如多个开发终端节点）；例如，`GetDevEndpoints`。对于此操作，您可以仅指定通配符 (\$1) 资源，而不是特定的 ARN。

例如，要在策略中包含 `GetDevEndpoints`，资源的范围必须限定为通配符 (\$1)。单数操作（`GetDevEndpoint`、`CreateDevEndpoint` 和 `DeleteDevendpoint`）的范围也确定为示例中的所有 (\$1) 资源。

```
{
            "Sid": "PluralAPIIncluded",
            "Effect": "Allow",
            "Action": [
                "glue:GetDevEndpoints",
                "glue:GetDevEndpoint",
                "glue:CreateDevEndpoint",
                "glue:UpdateDevEndpoint"
            ],
            "Resource": [
                "*"
            ]
}
```

## Amazon Glue 非目录 BatchGet API 操作的访问控制
BatchGet 非目录 API 的访问

有些 Amazon Glue API 操作检索多个项目（如多个开发终端节点）；例如，`BatchGetDevEndpoints`。对于此操作，您可以指定一个 ARN 来限制可访问的资源的范围。

例如，要允许访问特定的开发终端节点，请将 `BatchGetDevEndpoints` 及其资源 ARN 包含在策略中。

```
{
            "Sid": "BatchGetAPIIncluded",
            "Effect": "Allow",
            "Action": [
                "glue:BatchGetDevEndpoints"
            ],
            "Resource": [
                "arn:aws:glue:us-east-1:123456789012:devEndpoint/de1" 
            ]
}
```

利用此策略，您可以成功访问名为 `de1` 的开发终端节点。但是，如果您尝试访问名为 `de2` 的开发终端节点，则会返回错误。

```
An error occurred (AccessDeniedException) when calling the BatchGetDevEndpoints operation: No access to any requested resource.
```

**重要**  
有关设置 IAM policy 的替代方法（例如，使用 `List` 和 `BatchGet` API 操作），请参阅 [适用于 Amazon Glue 的基于身份的策略示例](security_iam_id-based-policy-examples.md)。

# 授予跨账户访问权限


授予跨账户的数据目录资源访问权限，支持您提取、转换和加载（ETL）任务，以便从不同账户查询和联接数据。

**Topics**
+ [

## 用于在 Amazon Glue 中授予跨账户访问权限的方法
](#cross-account-how-works)
+ [

## 添加或更新数据目录资源策略
](#cross-account-adding-resource-policy)
+ [

## 执行跨账户 API 调用
](#cross-account-calling)
+ [

## 执行跨账户 ETL 调用
](#cross-account-calling-etl)
+ [

## 跨账户 CloudTrail 日志记录
](#cross-account-ct-logs)
+ [

## 跨账户资源所有权和账单
](#cross-account-ownership-and-billing)
+ [

## 跨账户访问限制
](#cross-account-limitations)

## 用于在 Amazon Glue 中授予跨账户访问权限的方法
用于授予跨账户访问权限的方法

您可以使用 Amazon Glue 方法或 Amazon Lake Formation 跨账户授权，为外部 Amazon 账户授予数据访问权限。Amazon Glue 方法使用 Amazon Identity and Access Management（IAM）policy，实现精细访问控制。Lake Formation 使用更简单的 `GRANT/REVOKE` 权限模型，类似于关系数据库系统中的 `GRANT/REVOKE` 命令。

本部分介绍如何使用 Amazon Glue 方法。有关使用 Lake Formation 跨账户授权的信息，请参阅《Amazon Lake Formation 开发人员指南》**中的[授予 Lake Formation 权限](https://docs.amazonaws.cn/lake-formation/latest/dg/lake-formation-permissions.html)。

有两种 Amazon Glue 方法可用于授予跨账户资源访问权限：
+ 使用数据目录资源策略
+ 使用 IAM 角色

**使用资源策略授予跨账户访问权限**  
以下是使用数据目录资源策略授予跨账户访问权限的一般步骤：

1. 账户 A 中的管理员（或其他授权身份）将资源策略附加到账户 A 中的数据目录。此策略将向账户 B 授予对账户 A 的目录中的资源执行操作的具体跨账户权限。

1. 账户 B 中的管理员将一个 IAM policy 附加到账户 B 中的 IAM 身份，用于委托从账户 A 收到的权限。

   现在，账户 B 中的身份有权访问账户 A 中的指定资源。

   用户需要*同时*具有资源拥有者（账户 A）*及*其父账户（账户 B）授予的权限，才能访问资源。

**使用 IAM 角色授予跨账户访问权限**  
以下是使用 IAM 角色授予跨账户访问权限的一般步骤：

1. 账户中拥有资源（账户 A）的管理员（或其他授权身份）可创建一个 IAM 角色。

1. 账户 A 中的管理员会向该角色中附加一个策略，以授予用于访问所涉及资源的跨账户访问权限。

1. 账户 A 中的管理员将向该角色中附加一个信任策略，用于将其他账户（账户 B）中的 IAM 身份标识为可以担任该角色的委托人。

   如果您需要向 Amazon 服务授予担任该角色的权限，则信任策略中的委托人也可以是 Amazon 服务委托人。

1. 现在，账户 B 中的管理员向账户 B 中的一个或多个 IAM 身份委托权限，使其可以担任该角色。这样，账户 B 中的身份便可访问账户 A 中的资源。

有关使用 IAM 委派权限的更多信息，请参阅 *IAM 用户指南*中的[访问权限管理](https://docs.amazonaws.cn/IAM/latest/UserGuide/access.html)。有关用户、组、角色和权限的更多信息，请参阅 *IAM 用户指南*中的[身份（用户、组和角色）](https://docs.amazonaws.cn/IAM/latest/UserGuide/id.html)。

有关这两种方法的对比，请参阅 *IAM 用户指南*中的 [IAM 角色与基于资源的策略有何不同](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_compare-resource-policies.html)。Amazon Glue 支持这两个选项，但存在限制，即资源策略只能授予对 Data Catalog 资源的访问权限。

例如，要向账户 B 中的 `Dev` 角色授予对账户 A 中的数据库 `db1` 的访问权限，请将以下资源策略附加到账户 A 中的目录。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetDatabase"
      ],
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:role/Dev"
        ]
      },
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/db1"
      ]
    }
  ]
}
```

------

此外，账户 B 还必须将以下 IAM policy 附加至 `Dev` 角色，然后才能实际访问账户 A 中的 `db1`。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetDatabase"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/db1"
      ]
    }
  ]
}
```

------

## 添加或更新数据目录资源策略


您可以使用控制台、API 或 Amazon Command Line Interface（Amazon CLI）添加或更新 Amazon Glue 数据目录资源策略。

**重要**  
如果您已经使用 Amazon Lake Formation 从您的账户授予跨账户权限，则添加或更新数据目录资源策略需要额外步骤。有关更多信息，请参阅 *Amazon Lake Formation 开发人员指南*中的 [同时使用 Amazon Glue 和 Lake Formation 管理跨账户权限](https://docs.amazonaws.cn/lake-formation/latest/dg/hybrid-cross-account.html)。  
要确定是否存在 Lake Formation 跨账户授权，请使用 `glue:GetResourcePolicies` API 操作或 Amazon CLI。如果 `glue:GetResourcePolicies` 返回现有 Data Catalog 策略以外的任何策略，则存在 Lake Formation 授权。有关更多信息，请参阅 *Amazon Lake Formation 开发人员指南*中的[使用 GetResourcePolicies API 操作查看所有跨账户授权](https://docs.amazonaws.cn/lake-formation/latest/dg/cross-account-getresourcepolicies.html)。

**添加或更新数据目录资源策略（控制台）**

1. 通过 [https://console.aws.amazon.com/glue/](https://console.amazonaws.cn/glue/) 打开 Amazon Glue 控制台。

   作为具有 `glue:PutResourcePolicy` 权限的 Amazon Identity and Access Management（IAM）管理用户登录。

1. 在导航窗格中，选择 **Settings (设置)**。

1. 在 **Data catalog settings (数据目录设置)** 页面上的 **Permissions (权限)** 下面，将资源策略粘贴到文本区域。然后选择**保存**。

   如果控制台显示提示，指明策略中的权限不属于使用 Lake Formation 授予的权限，请选择 **Proceed (继续)**。

**添加或更新数据目录资源策略（Amazon CLI）**
+ 提交 `aws glue put-resource-policy` 命令。如果 Lake Formation 授权已存在，请确保包含值为 `'TRUE'` 的 `--enable-hybrid` 选项。

  有关使用此命令的示例，请参阅 [Amazon Glue 基于资源的策略示例](security_iam_resource-based-policy-examples.md)。

## 执行跨账户 API 调用
跨账户调用

所有 Amazon Glue Data Catalog 操作都有一个 `CatalogId` 字段。如果已授予所需的权限来启用跨账户访问，则发起人可以跨账户进行数据目录 API 调用。调用方通过传递 `CatalogId` 中的目标 Amazon 账户 ID，以访问目标账户中的资源。

如果没有提供 `CatalogId` 值，Amazon Glue 将默认使用调用方自己的账户 ID，但该调用不是跨账户调用。

## 执行跨账户 ETL 调用
来自任务的跨账户调用

有些 Amazon Glue PySpark 和 Scala API 具有目录 ID 字段。如果已授予启用跨账户访问所需的全部权限，ETL 任务可通过在目录 ID 字段中传递目标 Amazon 账户 ID 来对 API 操作进行跨账户的 PySpark 和 Scala 调用，以访问目标账户中的数据目录资源。

如果没有提供目录 ID 值，Amazon Glue 将默认使用调用方自己的账户 ID，但该调用不是跨账户调用。

对于支持 `catalog_id` 的 PySpark API，请参阅 [GlueContext 类](aws-glue-api-crawler-pyspark-extensions-glue-context.md)。对于支持 `catalogId` 的 Scala API，请参阅 [Amazon Glue Scala GlueContext API](glue-etl-scala-apis-glue-gluecontext.md)。

以下示例显示被授权者运行 ETL 任务所需的权限。在此示例中，*grantee-account-id* 是运行作业的客户端的 `catalog-id`，*grantor-account-id* 是资源的拥有者。此示例用于授予对授予者账户中所有目录资源的权限。为限制所授予资源的范围，您可以提供目录、数据库、表和连接的特定 ARN。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetConnection",
        "glue:GetDatabase",
        "glue:GetTable",
        "glue:GetPartition"
      ],
      "Principal": {
        "AWS": [
          "arn:aws:iam::111122223333:root"
        ]
      },
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:*"
      ]
    }
  ]
}
```

------

**注意**  
如果授予者账户中的某个表指向同在该账户中的一个 Amazon S3 位置，则授予者账户中用于运行 ETL 任务的 IAM 角色必须有权列出和获取授予者账户中的对象。

如果账户 A 中的客户端已经获得创建和运行 ETL 作业的权限，则设置用于跨账户访问的 ETL 作业的基本步骤如下：

1. 允许跨账户数据访问（如果已设置 Amazon S3 跨账户访问权限，则可跳过此步骤）。

   1. 更新账户 B 中的 Amazon S3 存储桶策略，以允许来自账户 A 的跨账户访问

   1. 更新账户 A 中的 IAM policy，以允许访问账户 B 中的存储桶。

1. 允许跨账户数据目录访问。

   1. 创建或更新账户 B 中附加到数据目录的资源策略，以允许来自账户 A 的访问。

   1. 更新账户 A 中的 IAM policy，以允许访问账户 B 中的数据目录。

## 跨账户 CloudTrail 日志记录


当 Amazon Glue 提取、转换和加载（ETL）任务访问通过 Amazon Lake Formation 跨账户授权分享的数据目录表的底层数据时，存在额外 Amazon CloudTrail 日志记录行为。

为了本次讨论，共享表的 Amazon 账户是拥有者账户，与该表的共享目标账户是收件人账户。当收件人账户中的 ETL 任务访问拥有者账户中表的数据时，添加到收件人账户日志中的数据访问 CloudTrail 事件将复制到拥有者账户的 CloudTrail 日志。这样，拥有者账户可以跟踪不同收件人账户的数据访问情况。默认情况下，CloudTrail 事件不包括人类可读的委托人标识符（委托人 ARN）。收件人账户中的管理员可以选择在日志中包含委托人 ARN。

有关更多信息，请参阅 *Amazon Lake Formation 开发人员指南*中的[跨账户 CloudTrail 日志记录](https://docs.amazonaws.cn/lake-formation/latest/dg/cross-account-logging.html)。

**另请参阅**  
[Amazon Glue 中的日志记录和监控](logging-and-monitoring.md)

## 跨账户资源所有权和账单
跨账户所有权

当一个 Amazon 账户（账户 A）中的用户在其他账户（账户 B）中创建新资源（如数据库）时，该资源的所有者将为账户 B，即创建资源所在的账户。账户 B 中的管理员将自动获得访问这一新资源的完整权限，包括读取、写入和向第三个账户授予访问权限。账户 A 中的用户只有获得账户 B 授予的相应权限后，才能访问他们刚刚创建的资源。

与新资源直接关联的存储成本和其他成本将计入账户 B，即资源所有者。创建资源的用户的请求成本将计入请求者的账户，即账户 A。

 有关 Amazon Glue 计费和定价的更多信息，请参阅 [Amazon 定价原理](https://d0.awsstatic.com/whitepapers/aws_pricing_overview.pdf)。

## 跨账户访问限制
跨账户限制

Amazon Glue 跨账户访问具有以下限制：
+ 如果您在区域支持 Amazon Glue 之前已使用 Amazon Athena 或 Amazon Redshift Spectrum 创建数据库和表，并且资源拥有者账户尚未将 Amazon Athena 数据目录迁移至 Amazon Glue，则不允许跨账户访问 Amazon Glue。可以使用[GetCatalogImportStatus (get\$1catalog\$1import\$1status)](aws-glue-api-catalog-migration.md#aws-glue-api-catalog-migration-GetCatalogImportStatus)查找当前的迁移状态。有关如何将 Athena 目录迁移到 Amazon Glue 的更多信息，请参阅 *Amazon Athena 用户指南*中的[按步骤升级到 Amazon Glue Data Catalog](https://docs.amazonaws.cn/athena/latest/ug/glue-upgrade.html)。
+ *仅*数据目录资源（包括数据库、表、用户定义的函数和连接）支持跨账户访问。
+ 从 Athena 跨账户访问数据目录需要将目录注册为 Athena `DataCatalog` 资源。有关说明，请参阅 *Amazon Athena 用户指南*中的[从其他账户注册 Amazon Glue Data Catalog](https://docs.amazonaws.cn/athena/latest/ug/data-sources-glue-cross-account.html)。

# 对 Amazon Glue 身份和访问进行故障排除
问题排查

使用以下信息可帮助您诊断和修复在使用 Amazon Glue 和 IAM 时可能遇到的常见问题。

**Topics**
+ [

## 我无权在 Amazon Glue 中执行操作
](#security_iam_troubleshoot-no-permissions)
+ [

## 我无权执行 iam:PassRole
](#security_iam_troubleshoot-passrole)
+ [

## 我希望允许我的 Amazon Web Services 账户 以外的人访问我的 Amazon Glue 资源
](#security_iam_troubleshoot-cross-account-access)

## 我无权在 Amazon Glue 中执行操作


如果您收到错误提示，指明您无权执行某个操作，则必须更新策略以允许执行该操作。

当 `mateojackson` IAM 用户尝试使用控制台查看有关虚构 `my-example-widget` 资源的详细信息，但不拥有虚构 `glue:GetWidget` 权限时，会发生以下示例错误。

```
User: arn:aws:iam::123456789012:user/mateojackson is not authorized to perform: glue:GetWidget on resource: my-example-widget
```

在此情况下，必须更新 `mateojackson` 用户的策略，以允许使用 `glue:GetWidget` 操作访问 `my-example-widget` 资源。

如果您需要帮助，请联系 Amazon 管理员。您的管理员是提供登录凭证的人。

## 我无权执行 iam:PassRole


如果您收到错误，表明您无权执行 `iam:PassRole` 操作，则必须更新策略以允许您将角色传递给 Amazon Glue。

有些 Amazon Web Services 服务 允许将现有角色传递到该服务，而不是创建新服务角色或服务关联角色。为此，您必须具有将角色传递到服务的权限。

当名为 `marymajor` 的 IAM 用户尝试使用控制台在 Amazon Glue 中执行操作时，会发生以下示例错误。但是，服务必须具有服务角色所授予的权限才可执行此操作。Mary 不具有将角色传递到服务的权限。

```
User: arn:aws:iam::123456789012:user/marymajor is not authorized to perform: iam:PassRole
```

在这种情况下，必须更新 Mary 的策略以允许她执行 `iam:PassRole` 操作。

如果您需要帮助，请联系 Amazon 管理员。您的管理员是提供登录凭证的人。

## 我希望允许我的 Amazon Web Services 账户 以外的人访问我的 Amazon Glue 资源


您可以创建一个角色，以便其他账户中的用户或您组织外的人员可以使用该角色来访问您的资源。您可以指定谁值得信赖，可以代入角色。对于支持基于资源的策略或访问控制列表（ACL）的服务，您可以使用这些策略向人员授予对您的资源的访问权。

要了解更多信息，请参阅以下内容：
+ 要了解 Amazon Glue 是否支持这些功能，请参阅 [Amazon Glue 如何与 IAM 协同工作](security_iam_service-with-iam.md)。
+ 要了解如何为您拥有的 Amazon Web Services 账户中的资源提供访问权限，请参阅《IAM 用户指南》**中的[为您拥有的另一个 Amazon Web Services 账户中的 IAM 用户提供访问权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_common-scenarios_aws-accounts.html)。
+ 要了解如何为第三方 Amazon Web Services 账户 提供您的资源的访问权限，请参阅《IAM 用户指南》**中的[为第三方拥有的 Amazon Web Services 账户 提供访问权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_common-scenarios_third-party.html)。
+ 要了解如何通过身份联合验证提供访问权限，请参阅《IAM 用户指南》**中的[为经过外部身份验证的用户（身份联合验证）提供访问权限](https://docs.amazonaws.cn/IAM/latest/UserGuide/id_roles_common-scenarios_federated-users.html)。
+ 要了解使用角色和基于资源的策略进行跨账户访问之间的差别，请参阅《IAM 用户指南》**中的 [IAM 中的跨账户资源访问](https://docs.amazonaws.cn/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html)。

# Amazon Lake Formation 访问控制模式


Amazon Glue 5.0 及更高版本支持两种通过 Amazon Lake Formation 访问数据的模式：

**Topics**
+ [

# 将 Amazon Glue 与 Amazon Lake Formation 结合使用实现全表访问
](security-access-control-fta.md)
+ [

# 将 Amazon Glue 与 Amazon Lake Formation 结合使用以进行精细访问控制
](security-lf-enable.md)

# 将 Amazon Glue 与 Amazon Lake Formation 结合使用实现全表访问


## 全表访问简介


Amazon Glue 5.0 及更高版本支持 Apache Spark 中的全表访问（FTA）控制，具体取决于您在 Amazon Lake Formation 中定义的策略。当作业角色具有全表访问权限时，您可以借助此功能从 Amazon Glue Spark 作业在注册到 Amazon Lake Formation 的表上执行读写操作。FTA 非常适合需要在表级别遵守安全法规的使用案例，并支持将各种 Spark 功能用于 Amazon Lake Formation 表，包括弹性分布式数据集（RDD）、自定义库和用户定义函数（UDF）。

当 Amazon Glue Spark 作业配置为全表访问（FTA）模式时，Amazon Lake Formation 凭证将用于为注册到 Amazon Lake Formation 的表读取/写入 Amazon S3 数据，而作业的运行时角色凭证将用于读取/写入未注册到 Amazon Lake Formation 的表。此功能支持数据操作语言（DML）操作，包括 Apache Hive 和 Iceberg 表上的 CREATE、ALTER、DELETE、UPDATE 和 MERGE INTO 语句。

**注意**  
检查您的需求并确定是精细访问控制（FGAC）模式还是全表访问（FTA）适合您的需求。对于给定 Amazon Glue 作业，只能启用一种 Amazon Lake Formation 权限方法。同一个作业不能同时运行全表访问（FTA）和精细访问控制（FGAC）。

## Amazon Glue 上的全表访问（FTA）工作原理


 Amazon Lake Formation 提供了精细访问控制（FGAC）和全表访问（FTA）这两种数据访问控制方法。FGAC 可按列、行和单元格级别进行筛选，从而增强安全性，非常适合需要精细权限的场景。FTA 非常适合需要表级别权限的简单访问控制场景。由于无需启用精细访问模式，因此简化了实施；同时由于无需系统驱动程序和系统执行程序，因此提高了性能并降低了成本；此外还支持读取和写入操作（包括 CREATE、ALTER、DELETE、UPDATE 和 MERGE INTO 命令）。

 在 Amazon Glue 4.0 中，基于 Amazon Lake Formation 的数据访问通过 GlueContext 类（Amazon Glue 提供的实用程序类）实现。在 Amazon Glue 5.0 中，基于 Amazon Lake Formation 的数据访问可通过原生 Spark SQL、Spark DataFrames 实现，并且继续支持通过 GlueContext 类访问。

## 全表访问模式的实施


### 第 1 步：在 Amazon Lake Formation 中启用全表访问


要使用全表访问（FTA）模式，您需要允许第三方查询引擎无需在 Amazon Lake Formation 中验证 IAM 会话标签即可访问数据。要启用此模式，请按照 [Application integration for full table access](https://docs.amazonaws.cn/lake-formation/latest/dg/full-table-credential-vending.html) 中的步骤操作。

### 第 2 步：设置作业运行时角色的 IAM 权限


要获得基础数据的读取或写入权限，除 Amazon Lake Formation 权限外，作业运行时角色还需要具有 `lakeformation:GetDataAccess` IAM 权限。获得此权限后，Amazon Lake Formation 将授权访问数据的临时凭证请求。

以下示例策略展示了如何提供 IAM 权限以访问 Amazon S3 中的脚本、将日志上传到 Amazon S3、Amazon Glue API 权限以及访问 Amazon Lake Formation 的权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ScriptAccess",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/scripts/*"
      ]
    },
    {
      "Sid": "LoggingAccess",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/logs/*"
      ]
    },
    {
      "Sid": "GlueCatalogAccess",
      "Effect": "Allow",
      "Action": [
        "glue:GetDatabase",
        "glue:GetDatabases",
        "glue:GetTable",
        "glue:GetTables",
        "glue:GetPartition",
        "glue:GetPartitions",
        "glue:CreateTable",
        "glue:UpdateTable"
      ],
      "Resource": [
        "arn:aws:glue:us-east-1:111122223333:catalog",
        "arn:aws:glue:us-east-1:111122223333:database/default",
        "arn:aws:glue:us-east-1:111122223333:table/default/*"
      ]
    },
    {
      "Sid": "LakeFormationAccess",
      "Effect": "Allow",
      "Action": [
        "lakeformation:GetDataAccess"
      ],
      "Resource": "*"
    }
  ]
}
```

------

#### 第 2.1 步：配置 Amazon Lake Formation 权限


从 Amazon S3 读取数据的 Amazon Glue Spark 作业需要具有 Amazon Lake Formation SELECT 权限。

在 Amazon S3 中写入/删除数据的 Amazon Glue Spark 作业需要具有 Amazon Lake Formation ALL 权限。

与 Amazon Glue 数据目录交互的 Amazon Glue Spark 作业需要视情况具有 DESCRIBE、ALTER、DROP 权限。

### 第 3 步：使用 Amazon Lake Formation 初始化 Spark 会话以实现全表访问


要访问注册到 Amazon Lake Formation 的表，需要在 Spark 初始化期间设置以下配置，以便将 Spark 配置为使用 Amazon Lake Formation 凭证。

 要访问注册到 Amazon Lake Formation 的表，您需要将 Spark 会话显式配置为使用 Amazon Lake Formation 凭证。在初始化 Spark 会话时添加以下配置：

```
from pyspark.sql import SparkSession
        
# Initialize Spark session with Lake Formation configurations
spark = SparkSession.builder \
    .appName("Lake Formation Full Table Access") \
    .config("spark.sql.catalog.glue_catalog", "org.apache.spark.sql.catalog.hive.GlueCatalog") \
    .config("spark.sql.catalog.glue_catalog.glue.lakeformation-enabled", "true") \
    .config("spark.sql.defaultCatalog", "glue_catalog") \
    .getOrCreate()
```

 关键配置：
+  `spark.sql.catalog.glue_catalog`：注册一个名为“glue\$1catalog”的目录，该目录使用 GlueCatalog 实现 
+  `spark.sql.catalog.glue_catalog.glue.lakeformation-enabled`：为此目录显式启用 Amazon Lake Formation 集成 
+  目录名称（在此例中为“glue\$1catalog”）可以自定义，但在两个配置设置中必须一致 

#### Hive


```
‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.Amazon Glue.accesscontrol.AWSLakeFormationCredentialResolver
--conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true 
--conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true
--conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true
--conf spark.sql.catalog.createDirectoryAfterTable.enabled=true
--conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
```

#### Iceberg


```
--conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.Amazon Glue.accesscontrol.AWSLakeFormationCredentialResolver
--conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true 
--conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true
--conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true
--conf spark.sql.catalog.createDirectoryAfterTable.enabled=true
--conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
--conf spark.sql.catalog.<catalog>.Amazon Glue.lakeformation-enabled=true
```
+  `spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.Amazon Glue.accesscontrol.AWSLakeFormationCredentialResolver`：配置 EMR 文件系统（EMRFS）以将 Amazon Lake Formation S3 凭证用于注册到 Amazon Lake Formation 的表。如果表未注册，请使用作业的运行时角色凭证。
+ `spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true` 和 `spark.hadoop.fs.s3.folderObject.autoAction.disabled=true`：在创建 S3 文件夹时，将 EMRFS 配置为使用内容类型标头应用程序/x 目录，而不是 \$1folder\$1 后缀。这在读取 Amazon Lake Formation 表时为必需，因为 Amazon Lake Formation 凭证不允许读取带有 \$1folder\$1 后缀的表文件夹。
+  `spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true`：将 Spark 配置为在创建表之前跳过空表位置验证。这对于注册到 Amazon Lake Formation 的表是必需的，因为只有在创建 Amazon Glue Data Catalog 表之后，用于验证空位置的 Amazon Lake Formation 凭证才会可用。如果未启用此配置，则作业的运行时角色凭证将会验证空表位置。
+  `spark.sql.catalog.createDirectoryAfterTable.enabled=true`：将 Spark 配置为在 Hive 元数据存储中创建表后再创建 Amazon S3 文件夹。这对于注册到 Amazon Lake Formation 的表为必需，因为只有在创建 Amazon Glue Data Catalog 表之后，用于创建 Amazon S3 文件夹的 Amazon Lake Formation 凭证才会可用。
+  `spark.sql.catalog.dropDirectoryBeforeTable.enabled=true`：将 Spark 配置为在 Hive 元数据存储中删除表之前删除 Amazon S3 文件夹。这对于注册到 Amazon Lake Formation 的表是必需的，因为在从 Amazon Glue Data Catalog 删除表之后，用于删除 S3 文件夹的 Amazon Lake Formation 凭证将不可用。
+  `spark.sql.catalog.<catalog>.Amazon Glue.lakeformation-enabled=true`：将 Iceberg 目录配置为将 Amazon Lake Formation Amazon S3 凭证用于注册到 Amazon Lake Formation 的表。如果表未注册，则会使用默认环境凭证。

## 使用模式


### 将 FTA 与 DataFrames 结合使用


熟悉 Spark 的用户可以将 DataFrames 与 Amazon Lake Formation 全表访问模式结合使用。

Amazon Glue 5.0 增加了对 Lake Formation 全表访问模式的原生 Spark 支持，从而简化了处理受保护表的方式。借助此功能，Amazon Glue 5.0 Amazon Glue Spark 作业可在获得全表访问权限后直接读取和写入数据，从而消除了以前会限制某些提取、转换、加载（ETL）操作的限制。现在，您可以将各种高级 Spark 功能用于 Amazon Lake Formation 表，包括弹性分布式数据集（RDD）、自定义库和用户定义函数（UDF）等。

#### Amazon Glue 5.0 中的原生 Spark FTA


Amazon Glue 5.0 支持 Apache Spark 中的全表访问（FTA）控制模式，具体取决于您在 Amazon Lake Formation 中定义的策略。这种控制级别非常适合需要在表级别遵守安全法规的使用案例。

#### Apache Iceberg 表示例


```
from pyspark.sql import SparkSession

catalog_name = "spark_catalog"
aws_region = "us-east-1"
aws_account_id = "123456789012"
warehouse_path = "s3://amzn-s3-demo-bucket/warehouse/"

spark = SparkSession.builder \
    .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkSessionCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.warehouse", f"{warehouse_path}") \
    .config(f"spark.sql.catalog.{catalog_name}.client.region",f"{aws_region}") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.account-id",f"{aws_account_id}") \
    .config(f"spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled","true") \
    .config(f"spark.sql.catalog.dropDirectoryBeforeTable.enabled", "true") \
    .config(f"spark.sql.catalog.{catalog_name}.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \
    .config(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") \
    .config("spark.sql.defaultCatalog", catalog_name) \  # Add this line
    .getOrCreate()

database_name = "your_database"
table_name = "your_table"

df = spark.sql(f"select * from {database_name}.{table_name}")
df.show()
```

#### 必需的 IAM 权限


您的 Amazon Glue 作业执行角色必须具有以下权限：

```
{
    "Action": "lakeformation:GetDataAccess",
    "Resource": "*",
    "Effect": "Allow"
}
```

以及您的数据位置相应的 S3 访问权限。

#### Lake Formation 配置


使用 Amazon Glue 5.0 中的原生 Spark FTA 之前：

1. 允许第三方查询引擎无需在 Amazon Lake Formation 中验证 IAM 会话标签即可访问数据

1. 通过 Amazon Lake Formation 控制台向 Amazon Glue 作业执行角色授予相应的表权限

1. 使用上例中所示的必需参数配置 Spark 会话

### 将 FTA 与 DynamicFrames 结合使用


 Amazon Glue 的原生 DynamicFrames 可以与 Amazon Lake Formation 全表访问结合使用，从而优化 ETL 操作。全表访问（FTA）是一种在表级别授予权限的安全模式，由于没有行级和列级权限检查的开销，因此数据处理速度比精细访问控制（FGAC）模式更快。需要处理完整的表并且表级权限能够满足安全要求时，这种方法将非常实用。

 在 Amazon Glue 4.0 中将 DynamicFrames 与 FTA 结合使用时，将需要特定的 GlueContext 配置。虽然现有用于 FTA 的 Amazon Glue 4.0 DynamicFrame 代码在 Amazon Glue 5.0 中继续有效，不过新版本还提供了更灵活的原生 Spark FTA 支持。对于新的开发，建议考虑使用 DataFrames 部分中描述的原生 Spark 方法，尤其是在需要将额外的功能用于 Amazon Lake Formation 表时，例如弹性分布式数据集（RDD）、自定义库和用户定义函数（UDF）等。

#### 所需权限


执行 Glue 作业的 IAM 角色必须具有下列权限：
+ `lakeformation:GetDataAccess` 许可
+ 通过 Lake Formation 控制台授予相应的 Lake Formation 表权限

#### Amazon Glue 5.0 中的 DynamicFrame 实现示例


```
from awsglue.context import GlueContext
from pyspark.context import SparkContext

# Initialize Glue context
sc = SparkContext()
glueContext = GlueContext(sc)

# Configure catalog for Iceberg tables
catalog_name = "glue_catalog"
aws_region = "us-east-1"
aws_account_id = "123456789012"
warehouse_path = "s3://amzn-s3-demo-bucket/warehouse/"

spark = glueContext.spark_session
spark.conf.set(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog")
spark.conf.set(f"spark.sql.catalog.{catalog_name}.warehouse", f"{warehouse_path}")
spark.conf.set(f"spark.sql.catalog.{catalog_name}.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog")
spark.conf.set(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO")
spark.conf.set(f"spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled","true")
spark.conf.set(f"spark.sql.catalog.{catalog_name}.client.region",f"{aws_region}")
spark.conf.set(f"spark.sql.catalog.{catalog_name}.glue.id", f"{aws_account_id}")

# Read Lake Formation-protected table with DynamicFrame
df = glueContext.create_data_frame.from_catalog(
    database="your_database",
    table_name="your_table"
)
```

## 其他配置


### 在 Amazon Glue Studio 笔记本中配置全表访问模式


要在 Amazon Glue Studio 笔记本中通过交互式 Spark 会话访问注册到 Amazon Lake Formation 的表，必须使用兼容性权限模式。在启动交互式会话之前，使用 `%%configure` magic 命令设置 Spark 配置。此配置必须是笔记本中的第一个命令，因为该命令无法在会话启动后应用。根据表类型选择配置：

#### 对于 Hive 表


```
%%configure
--conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver
--conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true
--conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true
--conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true
--conf spark.sql.catalog.createDirectoryAfterTable.enabled=true
--conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
```

#### 对于 Iceberg 表


```
%%configure
--conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver
--conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true
--conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true
--conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true
--conf spark.sql.catalog.createDirectoryAfterTable.enabled=true
--conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
--conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true
--conf spark.sql.catalog.glue_catalog.warehouse=s3://example-s3-bucket_DATA_LOCATION
--conf spark.sql.catalog.glue_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog
--conf spark.sql.catalog.glue_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO
--conf spark.sql.catalog.glue_catalog.glue.account-id=ACCOUNT_ID
--conf spark.sql.catalog.glue_catalog.glue.region=REGION
```

替换占位符：
+  S3\$1DATA\$1LOCATION：*s3://amzn-s3-demo-bucket* 
+  REGION：*Amazon 区域（例如 us-east-1）* 
+  ACCOUNT\$1ID：*您的 Amazon 账户 ID* 

**注意**  
必须在笔记本中执行任何 Spark 操作之前设置这些配置。

### 支持的操作


这些操作将使用 Amazon Lake Formation 凭证来访问表数据。

**注意**  
 启用 Amazon Lake Formation 时：  
 对于 FTA：启用 Spark 配置 `spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled` 
+ CREATE TABLE
+ ALTER TABLE
+ INSERT INTO
+  INSERT OVERWRITE 
+ SELECT
+ UPDATE
+ MERGE INTO
+ DELETE FROM
+ ANALYZE TABLE
+ REPAIR TABLE
+ DROP TABLE
+ Spark Datasource 查询
+ Spark Datasource 写入

**注意**  
上面未列出的操作将继续使用 IAM 权限来访问表数据。

## 从 Amazon Glue 4.0 迁移到 Amazon Glue 5.0 FTA


从 Amazon Glue 4.0 GlueContext FTA 迁移到 Amazon Glue 5.0 原生 Spark FTA 时：

1. 允许第三方查询引擎无需在 Amazon Lake Formation 中验证 IAM 会话标签即可访问数据。按照[第 1 步：在 Amazon Lake Formation 中启用全表访问](#security-access-control-fta-step-1)中的说明操作。

1. 不需要更改作业运行时角色。但需要验证 Amazon Glue 作业执行角色是否具有 lakeformation:GetDataAccess IAM 权限。

1. 修改脚本中的 Spark 会话配置。确保存在以下 Spark 配置：

   ```
   --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog
   --conf spark.sql.catalog.spark_catalog.warehouse=s3://<bucket-name>/warehouse/
   --conf spark.sql.catalog.spark_catalog.client.region=<REGION>
   --conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID
   --conf spark.sql.catalog.spark_catalog.glue.lakeformation-enabled=true
   --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
   ```

1. 更新脚本，确保将 GlueContext DataFrames 更改为原生 Spark DataFrames。

1. 将 Amazon Glue 作业更新为使用 Amazon Glue 5.0

## 注意事项和限制

+ 如果使用未启用全表访问的作业创建 Hive 表，并且未插入任何记录，则后续从启用全表访问的作业进行的读取或写入操作都将失败。这是因为未启用全表访问的 Amazon Glue Spark 会将 \$1folder\$1 后缀添加到表文件夹名称。要解决此问题，您可以使用以下任一方法：
  +  从未启用 FTA 的作业在表中至少插入一行。
  +  配置未启用 FTA 的作业，从而确保不在 S3 文件夹名称中使用 \$1folder\$1 后缀。可以通过设置 Spark 配置 `spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true` 来实现此目的。
  +  使用 Amazon S3 控制台或 Amazon S3 CLI 在表位置 `s3://path/to/table/table_name` 创建一个 Amazon S3 文件夹。
+ 全表访问模式仅适用于 EMR 文件系统（EMRFS），不兼容 S3A 文件系统。
+  全表访问模式支持 Hive 和 Iceberg 表。尚未增加对 Hudi 和 Delta 表的支持。
+ 使用 Amazon Lake Formation 精细访问控制（FGAC）规则或 Amazon Glue Data Catalog 视图引用表的作业将会失败。要使用 FGAC 规则或 Amazon Glue Data Catalog 视图查询表，需要使用 FGAC 模式。您可以按照以下 Amazon 文档中介绍的步骤启用 FGAC 模式：将 Amazon Glue 与 Amazon Lake Formation 结合使用实现精细访问控制。
+  全表访问模式不支持 Spark Streaming。
+ 不能与 FGAC 同时使用。

# 将 Amazon Glue 与 Amazon Lake Formation 结合使用以进行精细访问控制
适用于 FGAC 的 Lake Formation

## 概述


对于 Amazon Glue 版本 5.0 及更高版本，您可以利用 Amazon Lake Formation 对 S3 支持的 Data Catalog 表应用精细访问控制。此功能允许您为 Amazon Glue for Apache Spark 作业中的 read 查询配置表、行、列和单元格级别的访问控制。请参阅以下部分，了解有关 Lake Formation 以及如何将其与 Amazon Glue 结合使用的更多信息。

Glue 4.0 或更早版本支持的基于 `GlueContext` 的表级访问控制（具有 Amazon Lake Formation 权限）在 Glue 5.0 中不受支持。请使用 Glue 5.0 中的新 Spark 原生精细访问控制 (FGAC)。请注意以下详细信息：
+ 如果您需要细粒度访问控制 (FGAC) 来控制行/列/单元格访问控制，则需要从 Glue 4.0 和先前版本中的 `GlueContext`/Glue DynamicFrame 迁移到 Glue 5.0 中的 Spark DataFrame。有关示例，请参阅[从 GlueContext/Glue DynamicFrame 迁移到 Spark DataFrame](security-lf-migration-spark-dataframes.md)。
+  如果需要全表访问控制（FTA），则可以在 Amazon Glue 5.0 中将 FTA 与 DynamicFrames 结合使用。您还可以迁移到原生 Spark 方法，从而将各种额外的功能用于 Amazon Lake Formation 表，例如弹性分布式数据集（RDD）、自定义库和用户定义函数（UDF）等。有关示例，请参阅[从 Amazon Glue 4.0 迁移到 Amazon Glue 5.0](https://docs.amazonaws.cn/glue/latest/dg/migrating-version-50.html)。
+ 如果您不需要 FGAC，则无需迁移到 Spark DataFrame，而且诸如作业书签、下推谓词之类的 `GlueContext` 功能将继续起作用。
+ 使用 FGAC 的作业至少需要以下 4 个工作线程：一个用户驱动程序、一个系统驱动程序、一个系统执行程序和一个备用用户执行程序。

将 Amazon Glue 与 Amazon Lake Formation 结合使用会产生额外费用。

## Amazon Glue 如何与 Amazon Lake Formation 协同工作
工作原理

将 Amazon Glue 与 Lake Formation 结合使用，您可以对每个 Spark 作业强制执行一层权限，以便在 Amazon Glue 执行作业时应用 Lake Formation 权限控制。AmazonGlue 使用 [Spark 资源配置文件](https://spark.apache.org/docs/latest/api/java/org/apache/spark/resource/ResourceProfile.html)创建两个配置文件来有效执行作业。用户配置文件执行用户提供的代码，而系统配置文件强制执行 Lake Formation 策略。有关更多信息，请参阅[什么是 Amazon Lake Formation](https://docs.amazonaws.cn/lake-formation/latest/dg/what-is-lake-formation.html) 以及[注意事项和限制](https://docs.amazonaws.cn/glue/latest/dg/security-lf-enable-considerations.html)。

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

![\[该图显示了精细访问控制如何与 Amazon Glue StartJobrun API 配合使用。\]](http://docs.amazonaws.cn/glue/latest/dg/images/glue-50-fgac-start-job-run-api-diagram.png)


1. 用户在启用 Amazon Lake Formation 的 Amazon Glue 作业上调用 `StartJobRun` API。

1. Amazon Glue 会将作业发送到用户驱动程序，并在用户配置文件中运行作业。用户驱动程序运行精简版的 Spark，该版本无法启动任务、请求执行程序、访问 S3 或 Glue Catalog。其构建了作业计划。

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

1. 然后，Amazon Glue 使用用户驱动程序或系统驱动程序在执行程序上运行这些阶段。任何阶段的用户代码都只能在用户配置文件执行程序上运行。

1. 从受 Amazon Lake Formation 保护的数据目录表中读取数据的阶段，或应用安全筛选器的阶段委托给系统执行程序。

## 最少工作线程要求
最少工作线程

Amazon Glue 中启用 Lake Formation 的作业至少需要以下 4 个工作线程：一个用户驱动程序、一个系统驱动程序、一个系统执行程序和一个备用用户执行程序。这比标准 Amazon Glue 作业所需的最少 2 个工作线程有所增加。

Amazon Glue 中启用 Lake Formation 的作业利用两个 Spark 驱动程序：一个用于系统配置文件，另一个用于用户配置文件。同样，执行程序也分为两个配置文件：
+ 系统执行程序：处理应用 Lake Formation 数据筛选条件的任务。
+ 用户执行程序：由系统驱动程序根据需要请求。

由于 Spark 作业本质上是惰性的，因此在扣除两个驱动程序后，Amazon Glue 会为用户执行程序预留总工作线程数量的 10%（至少为 1 个）。

所有启用 Lake Formation 的作业都已启用自动扩缩，这意味着用户执行程序只有在需要时才会启动。

有关配置示例，请参阅[注意事项和限制](https://docs.amazonaws.cn/glue/latest/dg/security-lf-enable-considerations.html)。

## 作业运行时角色 IAM 权限
启用运行时权限

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

下面是一个策略示例，展示了如何提供 IAM 权限以访问 S3 中的脚本、将日志上传到 S3、Amazon Glue API 权限以及访问 Lake Formation 的权限。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ScriptAccess",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::*.amzn-s3-demo-bucket/scripts",
        "arn:aws:s3:::*.amzn-s3-demo-bucket/*"
      ]
    },
    {
      "Sid": "LoggingAccess",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/logs/*"
      ]
    },
    {
      "Sid": "GlueCatalogAccess",
      "Effect": "Allow",
      "Action": [
        "glue:Get*",
        "glue:Create*",
        "glue:Update*"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "LakeFormationAccess",
      "Effect": "Allow",
      "Action": [
        "lakeformation:GetDataAccess"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------

## 设置 Lake Formation 的作业运行时角色权限
设置运行时权限

首先，在 Lake Formation 中注册 Hive 表的位置。然后在所需的表上创建作业运行时角色的权限。有关 Lake Formation 的更多详细信息，请参阅《Amazon Lake Formation 开发人员指南》**中的[什么是 Amazon Lake Formation？](https://docs.amazonaws.cn/lake-formation/latest/dg/what-is-lake-formation.html)。

设置 Lake Formation 权限后，您可以在 Amazon Glue 上提交 Spark 作业。

## 提交作业运行


完成设置 Lake Formation 授予后，您可以在 Amazon Glue 上提交 Spark 作业。要运行 Iceberg 作业，您必须提供下面的 Spark 配置。要通过 Glue 作业参数进行配置，请输入下面的参数：
+ 键：

  ```
  --conf
  ```
+ 值：

  ```
  spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog 
  					  --conf spark.sql.catalog.spark_catalog.warehouse=<S3_DATA_LOCATION> 
  					  --conf spark.sql.catalog.spark_catalog.glue.account-id=<ACCOUNT_ID> 
  					  --conf spark.sql.catalog.spark_catalog.client.region=<REGION> 
  					  --conf spark.sql.catalog.spark_catalog.glue.endpoint=https://glue.<REGION>.amazonaws.com
  ```

## 使用交互式会话


 设置好 Amazon Lake Formation 授予后，即可在 Amazon Glue 上使用交互式会话。在执行代码之前，必须通过 `%%configure` 魔术命令提供以下 Spark 配置。

```
%%configure
{
    "--enable-lakeformation-fine-grained-access": "true",
    "--conf": "spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog --conf spark.sql.catalog.spark_catalog.warehouse=<S3_DATA_LOCATION> --conf spark.sql.catalog.spark_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --conf spark.sql.catalog.spark_catalog.client.region=<REGION> --conf spark.sql.catalog.spark_catalog.glue.account-id=<ACCOUNT_ID> --conf spark.sql.catalog.spark_catalog.glue.endpoint=https://glue.<REGION>.amazonaws.com"
}
```

## 适用于 Amazon Glue 5.0 Notebook 或交互式会话的 FGAC


要在 Amazon Glue 中启用精细访问控制（FGAC），必须在创建第一个单元格之前指定 Lake Formation 所需的 Spark 配置作为 %%configure 魔术命令的一部分。

之后使用 `SparkSession.builder().conf("").get()` 或 `SparkSession.builder().conf("").create()` 调用来指定是不够的。这与 Amazon Glue 4.0 的行为有所不同。

## 开放表格式支持
支持的操作

Amazon Glue 版本 5.0 或更高版本包含基于 Lake Formation 的精细访问控制支持。AmazonGlue 支持 Hive 和 Iceberg 表类型。下表列出了所有支持的操作。

[\[See the AWS documentation website for more details\]](http://docs.amazonaws.cn/glue/latest/dg/security-lf-enable.html)

# 从 GlueContext/Glue DynamicFrame 迁移到 Spark DataFrame


以下是 Python 和 Scala 示例，它们将 Glue 4.0 中的 `GlueContext`/Glue `DynamicFrame` 迁移到 Glue 5.0 中的 Spark `DataFrame`。

**Python**  
之前：

```
escaped_table_name= '`<dbname>`.`<table_name>`'

additional_options = {
  "query": f'select * from {escaped_table_name} WHERE column1 = 1 AND column7 = 7'
}

# DynamicFrame example
dataset = glueContext.create_data_frame_from_catalog(
    database="<dbname>",
    table_name=escaped_table_name, 
    additional_options=additional_options)
```

之后：

```
table_identifier= '`<catalogname>`.`<dbname>`.`<table_name>`"' #catalogname is optional

# DataFrame example
dataset = spark.sql(f'select * from {table_identifier} WHERE column1 = 1 AND column7 = 7')
```

**Scala**  
之前：

```
val escapedTableName = "`<dbname>`.`<table_name>`"

val additionalOptions = JsonOptions(Map(
    "query" -> s"select * from $escapedTableName WHERE column1 = 1 AND column7 = 7"
    )
)

# DynamicFrame example
val datasource0 = glueContext.getCatalogSource(
    database="<dbname>", 
    tableName=escapedTableName, 
    additionalOptions=additionalOptions).getDataFrame()
```

之后：

```
val tableIdentifier = "`<catalogname>`.`<dbname>`.`<table_name>`" //catalogname is optional

# DataFrame example
val datasource0 = spark.sql(s"select * from $tableIdentifier WHERE column1 = 1 AND column7 = 7")
```

# 注意事项和限制
注意事项

将 Lake Formation 与 Amazon Glue 结合使用时，请考虑以下注意事项和限制。

具有 Lake Formation 的 Amazon Glue 可在除 Amazon GovCloud（美国东部）和 Amazon GovCloud（美国西部）之外的所有受支持区域使用。
+ Amazon Glue 仅支持通过 Lake Formation 对 Apache Hive 和 Apache Iceberg 表进行精细访问控制。Apache Hive 格式包括 Parquet、ORC 和 CSV。
+ 您只能将 Lake Formation 与 Spark 作业结合使用。
+ 具有 Lake Formation 的 Amazon Glue 在整个作业中仅支持单个 Spark 会话。
+ 启用 Lake Formation 后，Amazon Glue 需要更多的工作线程，因为它需要一个系统驱动程序、一个系统执行程序、一个用户驱动程序以及可选的用户执行程序（当您的作业有 UDF 或 `spark.createDataFrame` 时需要此选项）。
+ 具有 Lake Formation 的 Amazon Glue 仅支持通过资源链接共享的跨账户表查询。资源链接的名称必须与源账户资源的名称相同。
+ 要为 Amazon Glue 作业启用精细访问控制，请传递 `--enable-lakeformation-fine-grained-access` 作业参数。
+ 您可以将 Amazon Glue 作业配置为使用 Amazon Glue 多目录层次结构。有关与 Amazon Glue `StartJobRun` API 一起使用的配置参数的信息，请参阅 [Working with Amazon Glue multi-catalog hierarchy on EMR Serverless](https://docs.amazonaws.cn/emr/latest/EMR-Serverless-UserGuide/external-metastore-glue-multi.html)。
+ 不支持以下项：
  + 弹性分布式数据集（RDD）
  + Spark 流
  + 使用 Lake Formation 授予的权限写入
  + 嵌套列的访问控制
+ Amazon Glue 会阻止可能破坏系统驱动程序完全隔离的功能，包括：
  + UDT、HiveUDFS 以及任何涉及自定义类的用户定义函数
  + 自定义数据来源
  + 为 Spark 扩展、连接器或元存储提供额外的 jar
  + `ANALYZE TABLE` 命令
+ 为了强制执行访问控制，`EXPLAIN PLAN` 和 DDL 操作（如 `DESCRIBE TABLE`）不会公开受限信息。
+ Amazon Glue 会限制访问启用 Lake Formation 的应用程序上的系统驱动程序 Spark 日志。由于系统驱动程序的运行权限更大，因此系统驱动程序生成的事件和日志可能包含敏感信息。为防止未经授权的用户或代码访问此敏感数据，Amazon Glue 禁止访问系统驱动程序日志。要进行故障排除，请联系 Amazon 支持。
+ 如果您在 Lake Formation 中注册了表位置，则无论 Amazon Glue 作业运行时角色的 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`。AmazonGlue 会隐藏可能包含敏感数据的列，例如 `partitions`、`path` 和 `summaries`。此限制不适用于未在 Lake Formation 中注册的 Iceberg 表。
+ 未在 Lake Formation 中注册的表支持所有 Iceberg 存储过程。任何表都不支持 `register_table` 和 `migrate` 程序。
+ 我们建议使用 Iceberg DataFrameWriterV2，而不是 V1。

## 工作线程分配示例


对于配置了以下参数的作业：

```
--enable-lakeformation-fine-grained-access=true  
--number-of-workers=20
```

工作线程分配将是：
+ 一个工作线程用于用户驱动程序。
+ 一个工作线程用于系统驱动程序。
+ 其余 18 个工作线程的 10％（即 2 个工作线程）预留给用户执行程序。
+ 为系统执行程序分配多达 16 个工作线程。

启用自动扩缩后，用户执行程序可以在需要时利用系统执行程序中任何未分配的容量。

## 控制用户执行程序分配


您可以使用以下配置调整用户执行程序的预留百分比：

```
--conf spark.dynamicAllocation.maxExecutorsRatio=<value between 0 and 1>
```

此配置允许对相对于总可用容量预留的用户执行程序数量进行微调控制。

# 问题排查


有关故障排除解决方案，请参阅以下部分：

## 日志记录


Amazon Glue 使用 Spark 资源配置文件来拆分作业执行。AmazonGlue 使用用户配置文件来运行您提供的代码，而系统配置文件则强制执行 Lake Formation 策略。您可以访问作为用户配置文件运行的任务的日志。

## Live UI 和 Spark History Server


Live UI 和 Spark History Server 包含从用户配置文件生成的所有 Spark 事件以及从系统驱动程序生成的编辑事件。

您可以在**执行程序**选项卡中查看用户和系统驱动程序中的所有任务。但日志链接仅适用于用户配置文件。此外，还会从 Live UI 中编辑一些信息，例如输出记录数。

## 由于 Lake Formation 权限不足，作业失败


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

## RDD 作业执行失败


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

## 无法访问 Amazon S3 中的数据文件


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

## 安全验证异常


Amazon Glue 检测到安全验证错误。请联系 Amazon 支持寻求帮助。

## 跨账户共享 Amazon Glue Data Catalog 和表


您可以跨账户共享数据库和表，且仍可使用 Lake Formation。有关更多信息，请参阅 [Cross-account data sharing in Lake Formation](https://docs.amazonaws.cn/lake-formation/latest/dg/cross-account-permissions.html) 和 [How do I share Amazon Glue Data Catalog and tables cross-account using ?](https://repost.aws/knowledge-center/glue-lake-formation-cross-account)。

下表概括了如何为工作负载选择精细访问控制（FGAC）模式和全表访问（FTA）模式。


| 功能 | 精细访问控制 (FGAC) | 全表访问（FTA） | 
| --- |--- |--- |
| Access Level | Column/row level | Full table | 
| Use Case | Queries and ETL with limited permissions | ETL | 
| Performance Impact | Requires system/user space transitions for access control evaluation, adding latency | Optimized performance | 

# 将 Amazon S3 访问权限管控与 Amazon Glue 结合使用


在 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 访问权限管控结合使用


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 访问权限管控注意事项


将 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 访问权限管控


**先决条件**  
调用者或管理员创建了 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
   ```

# 将可信身份传播与 Amazon Glue ETL 结合使用
可信身份传播

借助 IAM Identity Center，您可以连接到身份提供者（IdP）并跨 Amazon 分析服务集中管理用户和组的访问权限。您可以将 Okta、Ping 和 Microsoft Entra ID（以前称为 Azure Active Directory）等身份提供者与 IAM Identity Center 集成，以便您组织中的用户使用单点登录体验访问数据。IAM Identity Center 还支持连接其他第三方身份提供者。

使用 Amazon Glue 5.0 及更高版本时，您可以将用户身份从 IAM Identity Center 传播到 Amazon Glue 交互式会话。Amazon Glue交互式会话会进一步将提供的身份传播到下游服务（例如 Amazon S3 访问权限管控、Amazon Lake Formation 和 Amazon Redshift），从而在这些下游服务中通过用户身份实现安全的数据访问。

## 概览


 对于任何规模和类型的组织，都建议在 Amazon 上使用 [Identity Center](https://docs.amazonaws.cn/singlesignon/latest/userguide/what-is.html) 进行员工身份验证和授权。借助 Identity Center，您可以在 Amazon 中创建和管理用户身份，或连接现有身份源，包括微软 Microsoft Active Directory、Okta、Ping Identity、JumpCloud、Google Workspace 和 Microsoft Entra ID（前身为 Azure AD）。

[可信身份传播](https://docs.amazonaws.cn/singlesignon/latest/userguide/trustedidentitypropagation-overview.html)是 IAM Identity Center 的一项功能，已连接的 Amazon 服务的管理员可以使用此功能来授予和审计对服务数据的访问权限。对这些数据的访问权限基于用户属性，例如组关联。要设置可信身份传播，需要已连接的 Amazon 服务的管理员和 IAM Identity Center 管理员之间进行协作。

## 功能和优势


将 Amazon Glue 交互式会话与 IAM Identity Center [可信身份传播](https://docs.amazonaws.cn/singlesignon/latest/userguide/trustedidentitypropagation-overview.html)功能集成，将具有以下优势：
+ 能够在 Lake Formation 托管式 Amazon Glue 数据目录表上使用 Identity Center 身份强制执行表级授权并实现精细访问控制。
+ 能够在 Amazon Redshift 集群上使用 IAM Identity Center 身份强制执行授权。
+ 可实现端到端的全程用户操作跟踪，以满足审计的需要。
+ 能够在 Amazon S3 访问权限管控托管式 Amazon S3 前缀上使用 Identity Center 身份强制执行 Amazon S3 前缀级别的授权。

## 使用案例


**交互式数据探索和分析**  
 数据工程师可使用其企业身份，跨多个 Amazon 账户无缝访问和分析数据。使用 SageMaker Studio 时，他们可通过 Amazon Glue ETL 启动交互式 Spark 会话，连接到各种数据来源，包括 Amazon S3 和 Amazon Glue Data Catalog。当工程师探索数据集时，Spark 会根据他们的身份实施在 Lake Formation 中定义的精细访问控制，确保他们只能查看获得授权的数据。所有查询和数据转换操作都会登记用户身份，从而创建清晰的审计跟踪记录。这种简洁的方法有利于快速设计新分析产品的原型，同时确保在客户环境中执行严格的数据治理。

**数据准备和特征工程**  
 来自多个研究团队的数据科学家可以使用统一的数据平台协作完成复杂的项目。他们只需使用企业凭证登录 SageMaker Studio，即可立即跨多个 Amazon 账户访问庞大的共享数据湖。开始新机器学习模型的特征工程时，通过 Amazon Glue ETL启动的 Spark 会话会根据他们传播的身份强制执行 Lake Formation 列级和行级安全策略。科学家可以使用自己熟悉的工具高效地准备数据和开展特征工程，同时合规团队也可以确信每次数据交互都会得到自动跟踪和审计。这种安全的协作环境不仅可以加快研究管道，同时还可确保遵守受监管行业严格的数据保护标准。

## 工作方式


![\[展示 Amazon Glue 交互式会话工作流的架构图。用户通过 IAM Identity Center 登录面向客户的应用程序（SageMaker Unified Studio 或自定义应用程序）。在最终访问 S3 存储之前，用户的身份会传播到 Amazon Glue 会话，后者会连接到各种访问控制服务，包括 IAM Identity Center、Amazon Lake Formation、Amazon Glue Data Catalog 和 Amazon S3 访问权限管控等。\]](http://docs.amazonaws.cn/glue/latest/dg/images/GlueISSMAI.png)


 用户使用其企业身份，通过 IAM Identity Center 登录面向客户的应用程序（SageMaker AI 或自定义应用程序）。然后，该身份将通过整个数据访问管道传播。

 通过身份验证的用户启动 Amazon Amazon Glue 交互式会话，并将其作为计算引擎来处理数据。这些会话负责在整个工作流中维护用户的身份上下文。

 Amazon Lake Formation 与 Amazon Glue Data Catalog 协同工作，强制实施精细访问控制。Lake Formation 根据传播的用户身份应用安全策略，而 Amazon S3 访问权限管控则提供额外的权限层，确保用户只能访问被授权查看的数据。

 最后，系统会连接到实际数据驻留的 Amazon S3 存储。所有访问均通过组合安全策略进行监管，在实现交互式数据探索和分析的同时遵循数据治理要求。这种架构可实现跨多个 Amazon 服务进行基于身份的安全数据访问，同时确保处理大型数据集的数据科学家和工程师获得无缝的用户体验。

## 集成


### Amazon 托管式开发环境


以下面向客户端的 Amazon 托管式应用程序支持通过 Amazon Glue 交互式会话进行可信身份传播：
+ [Sagemaker Unified Studio](https://www.amazonaws.cn/sagemaker/unified-studio/)
+ [Amazon SageMaker AI](https://www.amazonaws.cn/sagemaker-ai/)

**Sagemaker Unified Studio**  
要将可信身份传播与 Sagemaker Unified Studio 结合使用：

1. 将启用了可信身份传播的 Sagemaker Unified Studio 项目设置为面向客户的开发环境。

1. 设置 [Lake Formation](https://docs.amazonaws.cn/en_us/singlesignon/latest/userguide/tip-tutorial-lf.html)，以便基于 IAM Identity Center 中的用户或组为 Amazon Glue 表启用精细访问控制。

1. [设置 Amazon S3 访问权限管控](https://docs.amazonaws.cn/en_us/singlesignon/latest/userguide/tip-tutorial-s3.html)，以便允许临时访问 Amazon S3 中的相关数据位置。

1. 打开 Sagemaker Unified Studio JupyterLab IDE 空间，然后将 Amazon Glue 选择作为 Notebook 执行的计算资源。

### 客户自行管理的自托管 Notebook 环境


要为自定义开发应用程序的用户启用可信身份传播，请参阅 Amazon 安全博客中的 [Access Amazon services programmatically using trusted identity propagation](https://www.amazonaws.cn/blogs/security/access-aws-services-programmatically-using-trusted-identity-propagation/)。

# Amazon Glue ETL 中的可信身份传播入门


本节的内容有助您配置使用交互式会话的 Amazon Glue 应用程序，从而与 IAM Identity Center 集成并启用[可信身份传播](https://docs.amazonaws.cn/singlesignon/latest/userguide/trustedidentitypropagation-overview.html)。

## 先决条件

+ 在要创建启用可信身份传播的 Amazon Glue 交互式会话的 Amazon 区域中有一个 Identity Center 实例。对于任何 Amazon 账户而言，Identity Center 实例只能存在于单个区域中。有关更多信息，请参阅 [Enable IAM Identity Center](https://docs.amazonaws.cn/singlesignon/latest/userguide/get-started-enable-identity-center.html) 以及 [provision the users and groups from your source of identities into IAM Identity Center](https://docs.amazonaws.cn/singlesignon/latest/userguide/tutorials.html)。
+ 为交互式工作负载将与之交互的下游服务（例如 Lake Formation 或 Amazon S3 访问权限管控或 Amazon Redshift 集群）启用可信身份传播，以便访问数据。

## 将 Amazon Glue ETL 连接到 IAM Identity Center 所需的权限


**创建一个 IAM 角色**  
创建 IAM Identity Center 连接的角色需要具有在 Amazon Glue 和 IAM Identity Center 中创建和修改应用程序配置的权限，如以下内联策略所示。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:CreateGlueIdentityCenterConfiguration",
                "sso:CreateApplication",
                "sso:PutApplicationAssignmentConfiguration",
                "sso:PutApplicationAuthenticationMethod",
                "sso:PutApplicationGrant",
                "sso:PutApplicationAccessScope",
                "sso:ListInstances"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

以下内联策略包含查看、更新和删除 Amazon Glue 与 IAM Identity Center 集成的属性所需的特定权限。

使用以下内联策略允许 IAM 角色查看 Amazon Glue 与 IAM Identity Center 的集成。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetGlueIdentityCenterConfiguration"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

使用以下内联策略允许 IAM 角色更新 Amazon Glue 与 IAM Identity Center 的集成。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:UpdateGlueIdentityCenterConfiguration",
                "sso:PutApplicationAccessScope",
                "sso:DeleteApplicationAccessScope"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

使用以下内联策略允许 IAM 角色删除 Amazon Glue 与 IAM Identity Center 的集成。

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:DeleteGlueIdentityCenterConfiguration",
                "sso:DeleteApplication"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

### 权限描述

+ `glue:CreateGlueIdentityCenterConfiguration`：授予创建 Amazon Glue IdC 配置的权限。
+ `glue:GetGlueIdentityCenterConfiguration`：授予获取现有 IdC 配置的权限。
+ `glue:DeleteGlueIdentityCenterConfiguration`：授予删除现有 Amazon Glue IdC 配置的权限。
+ `glue:UpdateGlueIdentityCenterConfiguration`：授予更新现有 Amazon Glue IdC 配置的权限。
+ `sso:CreateApplication`：授予创建 Amazon Glue 托管式 IAM Identity Center 应用程序的权限。
+ `sso:DescribeApplication`：授予描述 Amazon Glue 托管式 IAM Identity Center 应用程序的权限。
+ `sso:DeleteApplication`：授予删除 Amazon Glue 托管式 IAM Identity Center 应用程序的权限。
+ `sso:UpdateApplication`：授予更新 Amazon Glue 托管式 IAM Identity Center 应用程序的权限。
+ `sso:PutApplicationGrant`：授予在 IdC 应用程序上应用 token-exchange、introspectToken、refreshToken 和 RevokeToken 授权的权限。
+ `sso:PutApplicationAuthenticationMethod`：授予在 Amazon Glue 托管式 IdC 应用程序上放置 authenticationMethod 的权限，以便 Amazon Glue 服务主体能够与 IdC 应用程序交互。
+ `sso:PutApplicationAccessScope`：授予在 Amazon Glue 托管式 IdC 应用程序上添加或更新授权下游服务作用域列表的权限。
+ `sso:DeleteApplicationAccessScope`：授予在为 Amazon Glue 托管式 IdC 应用程序移除某个作用域时授予删除下游作用域的权限。
+ `sso:PutApplicationAssignmentConfiguration`：授予在 IdC 应用程序上设定“User-assignment-not-required”设置的权限。
+ `sso:ListInstances`：授予列出实例和验证您在 identity-center-configuration 参数中指定的 IdC InstanceArn 的权限。

## 将 Amazon Glue 连接到 IAM Identity Center


将 Amazon Glue 连接到 IAM Identity Center 时，系统会为每个账户创建一个单例托管式 IdC 应用程序。以下示例演示了如何将 Amazon Glue 连接到 IAM Identy Center：

```
aws glue create-glue-identity-center-configuration \
--instance-arn arn:aws:sso:::instance/ssoins-123456789 \
--scopes '["s3:access_grants:read_write", "redshift:connect","lakeformation:query"]'
```

要更新托管式应用程序的作用域（通常是为了传播到更多下游服务），可以使用：

```
aws glue update-glue-identity-center-configuration \
--scopes '["s3:access_grants:read_write", "redshift:connect","lakeformation:query"]'
```

Scopes 参数是可选的，如果未提供此参数，则将会添加所有作用域。支持的值为 `s3:access_grants:read_write`、`redshift:connect` 和 `lakeformation:query`。

要获取配置详细信息，可以使用：

```
aws glue get-glue-identity-center-configuration
```

您可以使用以下命令删除 Amazon Glue 与 IAM Identity Center 之间的连接：

```
aws glue delete-glue-identity-center-configuration
```

**注意**  
Amazon Glue 会在您的账户中创建一个服务托管式 Identity Center 应用程序以供服务使用，从而对下游服务进行身份验证和身份传播。您账户中的所有可信身份传播会话都会共享 Amazon Glue 创建的托管式 Identity Center 应用程序。  
**警告：**请勿手动修改托管式 Identity Center 应用程序的设置。任何更改都可能影响账户中所有启用可信身份传播的 Amazon Glue 交互式会话。

## 创建启用可信身份传播的 Amazon Glue 交互式会话


将 Amazon Glue 连接到 IAM Identity Center 后，您可以使用[身份增强型角色凭证](https://docs.amazonaws.cn/singlesignon/latest/userguide/trustedidentitypropagation-identity-enhanced-iam-role-sessions.html)来创建 Amazon Glue 交互式会话。创建 5.0 Amazon Glue 会话时无需传递其他参数。由于 Amazon Glue 已连接到 IAM Identity Center，如果 Amazon Glue 检测到身份增强型角色凭证，则会自动将身份信息传播到您的语句中将会调用的下游服务。但是，会话的运行时角色需要具有如下所示的 `sts:SetContext` 权限。

**传播身份所需的运行时角色权限**  
 由于 Amazon Glue 会话使用[身份增强型凭证](https://docs.amazonaws.cn/singlesignon/latest/userguide/trustedidentitypropagation-identity-enhanced-iam-role-sessions.html)将身份传播到下游 Amazon 服务，因此其运行时角色的信任策略需要获得额外的权限 `sts:SetContext`，才能允许将身份传播到下游服务（例如 Amazon S3 访问权限管控、Lake Formation 和 Amazon Redshift）。要详细了解如何创建运行时角色，请参阅[设置运行时角色](https://docs.amazonaws.cn/glue/latest/dg/create-service-role.html)。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "glue.amazonaws.com"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:SetContext"
      ]
    }
  ]
}
```

------

此外，运行时角色需要作业运行将会调用的下游 Amazon 服务的权限，以便使用用户身份获取数据。请参阅以下链接，了解如何配置 Amazon S3 访问权限管控和 Lake Formation：
+ [将 Lake Formation 与 Amazon Glue 结合使用](https://docs.amazonaws.cn/glue/latest/dg/security-lake-formation-fgac.html)
+ [将 Amazon S3 访问权限管控与 Amazon Glue 结合使用](https://docs.amazonaws.cn/glue/latest/dg/security-s3-access-grants.html)

# Amazon Glue ETL 可信身份传播集成的注意事项和限制


**重要**  
 默认情况下，会话不是私有的，这意味着 IdC 用户可以访问其他 IdC 用户的会话。您可以使用 [TagonCreate](https://docs.amazonaws.cn/glue/latest/dg/glue-is-security.html#glue-is-tagoncreate) 将自己的会话设为私有。例如，您可以将会话添加一个 owner 标签，其值为 IDC 用户 ID，然后在策略中使用类似于 [https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-identity-store-user-id](https://docs.amazonaws.cn/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-identity-store-user-id) 的全局条件键，从而根据客户端主体/运行时角色策略中的 owner 标签验证所有会话 API 操作，确保 IdC 用户无法访问其他 IdC 用户的会话。

将 IAM Identity Center 可信身份传播与 Amazon Glue 应用程序结合使用时，应注意以下几点：
+ Amazon Glue 5.0 及更高版本支持通过 Identity Center 进行可信身份传播，但仅限于使用 Amazon Glue 交互式会话时。
+ Lake Formation Identity Center 集成涵盖了 Amazon Glue Data Catalog。
+ 可信身份传播仅限于 Amazon Glue 中的交互式会话，不包括其他数据处理实体，例如作业、触发器、工作流和机器学习任务。但是，所有 Amazon Glue API 都会在 Amazon CloudTrail 中记录用户身份以供审计。
+ Amazon Glue 目前仅支持通过 API 和 CLI 接口与 IAM Identity Center 集成，不支持通过控制台集成。
+ 在 Amazon Glue 端启用应用程序后，请务必使用 IdC 凭证创建 5.0 会话，而不要使用 IdC 凭证创建 4.0 会话。
+ 以下 Amazon 区域支持将可信身份传播与 Amazon Glue 结合使用：
  + af-south-1 – 非洲（开普敦）
  + ap-east-1：亚太地区（香港）
  + ap-northeast-1：亚太地区（东京）
  + ap-northeast-2：亚太地区（首尔）
  + ap-northeast-3：亚太地区（大阪）
  + ap-south-1：亚太地区（孟买）
  + ap-southeast-1：亚太地区（新加坡）
  + ap-southeast-2：亚太地区（悉尼）
  + ap-southeast-3：亚太地区（雅加达）
  + ca-central-1：加拿大（中部）
  + eu-central-1：欧洲地区（法兰克福）
  + eu-north-1：欧洲（斯德哥尔摩）
  + eu-south-1 – 欧洲地区（米兰）
  + eu-west-1：欧洲地区（爱尔兰）
  + eu-west-2：欧洲（伦敦）
  + eu-west-3：欧洲（巴黎）
  + me-south-1 – 中东（巴林）
  + sa-east-1：南美洲（圣保罗）
  + us-east-1：美国东部（弗吉尼亚北部）
  + us-east-2：美国东部（俄亥俄）
  + us-west-1：美国西部（加利福尼亚北部）
  + us-west-2：美国西部（俄勒冈）

# Amazon Glue ETL 的用户后台会话
用户后台会话

借助用户后台会话，即使用户已从笔记本界面注销，长时间运行的分析和机器学习工作负载也能继续运行。此功能是通过 Amazon Glue 的可信身份传播功能实现的。以下页面说明了用户后台会话的配置选项和行为。

**注意**  
用户后台会话适用于通过 SageMaker 融通式合作开发工作室等笔记本界面发起的 Amazon Glue 交互式会话。启用或禁用此功能仅影响新的交互式会话；现有活动会话不受影响。

## 配置用户后台会话


必须在两个级别上启用用户后台会话才能正常运行：

1. IAM Identity Center 实例级别（由 IdC 管理员配置）

1. Amazon Glue Identity Center 配置级别（由 Amazon Glue 管理员配置）

### 启用 Amazon Glue 的用户后台会话


要启用 Amazon Glue 的用户后台会话，在创建或更新配置时，必须在 Identity Center 配置中将 `userBackgroundSessionsEnabled` 参数设置为 `true`。

先决条件
+ 用于创建/更新 Amazon Glue Identity Center 配置的 IAM 角色必须具有 `sso:PutApplicationSessionConfiguration` 权限。此权限允许 Amazon Glue 在 Amazon Glue 托管的 IdC 应用程序级别启用用户后台会话。
+ 您的 Amazon Glue 交互式会话必须使用 Amazon Glue 5.0 或更高版本，并且必须启用可信身份传播。

要使用 Amazon CLI 启用用户后台会话：

```
aws glue create-glue-identity-center-configuration \
    --instance-arn "arn:aws:sso:::instance/ssoins-1234567890abcdef" \
    --user-background-sessions-enabled
```

要更新现有配置：

```
aws glue update-glue-identity-center-configuration \
    --user-background-sessions-enabled
```

#### 配置矩阵


有效的用户后台会话配置取决于 Amazon Glue 配置设置和 IAM Identity Center 实例级别设置：


| IAM Identity Center userBackgroundSession 已启用？ | Amazon Glue userBackgroundSessionsEnabled | 行为 | 
| --- | --- | --- | 
| 是 | TRUE | 用户后台会话已启用 | 
| 是 | FALSE | 会话过期，用户注销 | 
| 否 | TRUE | 会话创建失败，出现异常 | 
| 否 | FALSE | 会话过期，用户注销 | 

## 默认用户后台会话持续时间


默认情况下，在 IAM Identity Center 中，所有用户后台会话的持续时间限制为 7 天。管理员可以在 IAM Identity Center 控制台中修改此持续时间。此设置在 IAM Identity Center 实例级别应用，会影响该实例内所有受支持的 IAM Identity Center 应用程序。
+ 持续时间可以设置为 15 分钟到 90 天之间的任意值
+ 此设置在 IAM Identity Center 控制台的“设置”→“身份验证”→“配置”（“非交互式作业”部分）下配置

**注意**  
默认情况下，Amazon Glue 交互式会话单独的空闲超时限制为 48 小时。当 Amazon Glue 会话空闲超时或用户后台会话持续时间达到时（以先到者为准），会话将终止。

## 禁用用户后台会话的影响


在 Amazon Glue 配置级别禁用用户后台会话时：
+ **现有交互式会话：**如果这些会话是在启用用户后台会话的情况下启动的，则可以不间断地继续运行。这些会话将继续使用其现有的后台会话令牌，直到这些会话自然终止或被明确停止。
+ **新的交互式会话：**将使用标准的可信身份传播流，而且将在用户注销或交互式会话到期时（例如关闭 SageMaker 融通式合作开发工作室 Jupyter Notebook 时）终止。

### 更改用户后台会话持续时间


在 IAM Identity Center 中修改用户后台会话的持续时间设置时：
+ **现有交互式会话：**继续以与开始时相同的后台会话持续时间运行
+ **新的交互式会话：**将使用后台会话的新会话持续时间

## 运行时系统注意事项


### 会话终止条件


使用用户后台会话时，Amazon Glue 交互式会话将继续运行，直到出现以下情况之一：
+ 用户后台会话过期（基于 IdC 配置，最长 90 天）
+ 管理员已手动撤销用户后台会话
+ Amazon Glue 交互式会话达到其空闲超时（默认值：上次执行语句后 48 小时）
+ 用户明确停止或重新启动笔记本内核

### 数据持久性


使用用户后台会话时：
+ 用户注销后无法重新连接到笔记本界面查看结果
+ 将您的 Spark 语句配置为在执行完成之前将结果写入永久存储（例如 Amazon S3）

### 成本影响

+ 即使用户结束了 SageMaker 融通式合作开发工作室 JupyterLab 会话，作业仍将继续运行直至完成，并且将在完成运行的整个持续时间内产生费用
+ 监控您的活动后台会话，避免因忘记或放弃会话而产生不必要的费用

### 功能可用性


Amazon Glue 的用户后台会话可用于：
+ 仅限 Amazon Glue 交互式会话（不支持 Amazon Glue 作业和流式传输作业）
+ Amazon Glue 版本 5.0 及更高版本
+ 仅限启用可信身份传播的配置

# Amazon Glue 中的日志记录和监控
日志记录和监控

您可以自动运行您的 ETL（提取、转换和加载）作业。Amazon Glue 提供了有关爬网程序和作业的指标，您可以监控这些指标。使用所需元数据设置 Amazon Glue Data Catalog后，Amazon Glue 会提供有关环境运行状况的统计数据。您可以基于 cron 使用基于时间的计划自动调用爬网程序和作业。您也可以在基于事件的触发器触发时触发作业。

Amazon Glue 与 Amazon CloudTrail 集成，后者是在 Amazon Glue 中记录用户、角色或 Amazon 服务所执行操作的服务。如果您创建跟踪，则可以使 CloudTrail 事件持续传送到 Amazon Simple Storage Service（Amazon S3）存储桶、Amazon CloudWatch Logs 和 Amazon CloudWatch Events。每个事件或日志条目都包含有关生成请求的人员信息。在 Amazon Glue 5.1 版本中，Amazon CloudTrail 日志中将提供 Amazon Glue 和 Amazon Lake Formation API 调用的审计上下文。

使用 Amazon CloudWatch Events 自动化您的 Amazon 服务，以自动响应系统事件，例如应用程序可用性问题或资源更改。Amazon 服务中的事件近乎实时地传输到 CloudWatch Events 。您可以编写简单规则来指示所关注的事件，并指示要在事件匹配规则时执行的自动化操作。

**另请参阅**  
[使用 EventBridge 实现 Amazon Glue 的自动化](automating-awsglue-with-cloudwatch-events.md)
[跨账户 CloudTrail 日志记录](cross-account-access.md#cross-account-ct-logs)

 云端安全的一个重要方面是日志记录。您必须以按以下方式配置日志记录：既不捕获密钥和机密材料，同时又能捕获调试和保护云基础结构所需的信息。务必要熟悉正在记录的内容。

# 的合规性验证 Amazon Glue
合规性验证

要了解某个 Amazon Web Services 服务是否在特定合规性计划范围内，请参阅[合规性计划范围内的 Amazon Web Services 服务](https://www.amazonaws.cn/compliance/services-in-scope/)，然后选择您感兴趣的合规性计划。有关常规信息，请参阅 、、[Amazon Web Services 合规性计划](https://www.amazonaws.cn/compliance/programs/)。

您可以使用 Amazon Artifact 下载第三方审计报告。有关更多信息，请参阅、[在 Amazon Artifact 中下载报告](https://docs.amazonaws.cn/artifact/latest/ug/downloading-documents.html)。

您在使用 Amazon Web Services 服务 时的合规性责任由您的数据的敏感性、您公司的合规性目标以及适用的法律法规决定。有关您在使用 Amazon Web Services 服务时的合规责任的更多信息，请参阅 [Amazon 安全性文档](https://docs.amazonaws.cn/security/)。

# Amazon Glue 中的故障恢复能力
故障恢复能力

Amazon全球基础架构围绕Amazon区域和可用区构建。Amazon区域提供多个在物理上独立且隔离的可用区，这些可用区通过延迟低、吞吐量高且冗余性高的网络连接在一起。利用可用区，您可以设计和操作在可用区之间无中断地自动实现故障转移的应用程序和数据库。与传统的单个或多个数据中心基础架构相比，可用区具有更高的可用性、容错性和可扩展性。

有关 Amazon 区域和可用区的更多信息，请参阅 [Amazon 全球基础架构](https://www.amazonaws.cn/about-aws/global-infrastructure/)。

有关 Amazon Glue 作业弹性的更多信息，请参阅[错误：Amazon Glue 中 VPC 之间的失效转移行为](https://docs.amazonaws.cn/glue/latest/dg/glue-troubleshooting-errors.html#vpc-failover-behavior-error-10)。

# Amazon Glue 中的基础结构安全性
基础结构安全性

作为一项托管式服务，Amazon Glue 由 [Amazon Web Services：安全流程概览](https://d0.awsstatic.com/whitepapers/Security/AWS_Security_Whitepaper.pdf)白皮书中所述的 Amazon 全球网络安全程序提供保护。

您可以使用 Amazon 发布的 API 调用通过网络访问。Amazon Glue客户端必须支持传输层安全性协议 (TLS) 1.0 或更高版本。建议使用 TLS 1.2 或更高版本。客户端还必须支持具有完全向前保密（PFS）的密码套件，例如 Ephemeral Diffie-Hellman（DHE）或 Elliptic Curve Ephemeral Diffie-Hellman（ECDHE）。大多数现代系统（如 Java 7 及更高版本）都支持这些模式。

此外，必须使用访问密钥 ID 和与 IAM 主体关联的秘密访问密钥来对请求进行签名。或者，您可以使用 [Amazon Security Token Service](https://docs.amazonaws.cn/STS/latest/APIReference/Welcome.html)（Amazon STS）生成临时安全凭证来对请求进行签名。

**Topics**
+ [

# 为 Amazon Glue（Amazon PrivateLink）配置接口 VPC 端点（Amazon PrivateLink）
](vpc-interface-endpoints.md)
+ [

# 配置共享的 Amazon VPC
](shared-vpc.md)

# 为 Amazon Glue（Amazon PrivateLink）配置接口 VPC 端点（Amazon PrivateLink）
为 Amazon Glue 配置接口 VPC 端点（Amazon PrivateLink）

您可以通过创建*接口 VPC 端点*在 VPC 和 Amazon Glue 之间建立私有连接。接口端点由 [Amazon PrivateLink](https://www.amazonaws.cn/privatelink) 提供支持，该技术支持您通过私密方式访问 Amazon Glue API，而无需互联网网关、NAT 设备、VPN 连接或 Amazon Direct Connect 连接。VPC 中的实例即使没有公有 IP 地址也可与 Amazon Glue API 进行通信。VPC 和 Amazon Glue 之间的流量不会脱离 Amazon 网络。

每个接口终端节点均由子网中的一个或多个[弹性网络接口](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/using-eni.html)表示。

有关更多信息，请参阅《Amazon VPC 用户指南》**中的[接口 VPC 端点（Amazon PrivateLink）](https://docs.amazonaws.cn/vpc/latest/userguide/vpce-interface.html)。

## Amazon Glue VPC 端点注意事项


请务必先查看 *Amazon VPC 用户指南*中的[接口端点属性和限制](https://docs.amazonaws.cn/vpc/latest/userguide/vpce-interface.html#vpce-interface-limitations)，然后再为 Amazon Glue 设置接口 VPC 终端节点。

Amazon Glue 支持从 VPC 调用它的所有 API 操作。

## 为 Amazon Glue 创建接口 VPC 端点


您可以使用 Amazon VPC 控制台或 Amazon Command Line Interface (Amazon CLI) 为 Amazon Glue 服务创建 VPC 端点。有关更多信息，请参阅《Amazon VPC 用户指南》**中的[创建接口端点](https://docs.amazonaws.cn/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint)

使用以下服务名称为 Amazon Glue 创建 VPC 端点：
+ com.amazonaws.*region*.glue

如果为端点启用私有 DNS，则可以使用其默认 DNS 名称作为区域，向 Amazon Glue 发送 API 请求，例如 `glue.us-east-1.amazonaws.com`。

有关更多信息，请参阅《Amazon VPC 用户指南》**中的[通过接口端点访问服务](https://docs.amazonaws.cn/vpc/latest/userguide/vpce-interface.html#access-service-though-endpoint)。

## 为 Amazon Glue 创建 VPC 端点策略


您可以为 VPC 端点附加控制对 Amazon Glue 的访问的端点策略。该策略指定以下信息：
+ 可执行操作的主体。
+ 可执行的操作。
+ 可对其执行操作的资源。

有关更多信息，请参阅《Amazon VPC 用户指南》**中的[使用 VPC 端点控制对服务的访问](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-endpoints-access.html)。

**示例：适用于 Amazon Glue 允许创建和更新任务的 VPC 终端节点策略**  
下面是用于 Amazon Glue 的端点策略示例。当附加到端点时，此策略会向所有资源上的所有主体授予对列出的 Amazon Glue 操作的访问权限。

```
{
  "Statement": [
    {
      "Sid": "RestrictPassRole",
      "Effect": "Allow",
      "Action": "iam:PassRole",
      "Resource": "arn:aws:iam::123456789012:role/GlueServiceRole*",
      "Condition": {
        "StringEquals": {
          "iam:PassedToService": "glue.amazonaws.com"
        }
      }
    }
  ]
}
```

**示例：允许只读数据目录访问的 VPC 终端节点策略**  
下面是用于 Amazon Glue 的端点策略示例。当附加到端点时，此策略会向所有资源上的所有主体授予对列出的 Amazon Glue 操作的访问权限。

```
{
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "glue:GetDatabase",
        "glue:GetDatabases",
        "glue:GetTable",
        "glue:GetTables",
        "glue:GetTableVersion",
        "glue:GetTableVersions",
        "glue:GetPartition",
        "glue:GetPartitions",
        "glue:BatchGetPartition",
        "glue:SearchTables"
      ],
      "Resource": "*"
    }
  ]
}
```

# 配置共享的 Amazon VPC


Amazon Glue 支持 Amazon Virtual Private Cloud 中的共享 Virtual Private Cloud（VPC）。Amazon VPC 共享允许多个 Amazon 账户将其应用程序资源（例如 Amazon EC2 实例和 Amazon Relational Database Service（Amazon RDS）数据库）创建到共享的集中管理式 Amazon VPC 中。在此模型中，拥有 VPC 的账户（拥有者）与属于 Amazon Organizations 中同一企业的其他账户（参与者）共享一个或多个子网。共享子网之后，参与者可以查看、创建、修改和删除与他们共享的子网中的应用程序资源。

在 Amazon Glue 中，要创建与共享子网的连接，您必须在账户中创建一个安全组，并将安全组附加到共享子网。

有关更多信息，请参阅以下主题：
+ 《Amazon VPC 用户指南》**中的[使用共享 VPC](https://docs.amazonaws.cn/vpc/latest/userguide/vpc-sharing.html)
+ 《Amazon Organizations 用户指南》**中的[什么是 Amazon Organizations？](https://docs.amazonaws.cn/organizations/latest/userguide/orgs_introduction.html)