

# 指定 AWS Glue 资源 ARN
<a name="glue-specifying-resource-arns"></a>

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

**Topics**
+ [数据目录 ARN](#data-catalog-resource-arns)
+ [AWS Glue 中非目录对象的 ARN](#non-catalog-resource-arns)
+ [AWS Glue 非目录单数 API 操作的访问控制](#non-catalog-singular-apis)
+ [检索多个项目的 AWS Glue 非目录 API 操作的访问控制](#non-catalog-plural-apis)
+ [AWS Glue 非目录 BatchGet API 操作的访问控制](#non-catalog-batch-get-apis)

## 数据目录 ARN
<a name="data-catalog-resource-arns"></a>

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

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

每个 AWS 账户在 AWS 区域中有单个数据目录，以 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"
   ]
}
```
概括来说，对数据目录资源的操作遵循以下权限规则：  
针对目录的操作只需要具有目录的权限。
针对数据库的操作需要具有数据库和目录的权限。
针对数据库的删除操作需要具有数据库和目录的权限，以及数据库中所有表和用户定义函数的权限。
针对表、分区或表版本的操作需要具有表、数据库和目录的权限。
针对用户定义的函数的操作需要具有用户定义的函数、数据库和目录的权限。
针对连接的操作需要具有连接和目录的权限。

## AWS Glue 中非目录对象的 ARN
<a name="non-catalog-resource-arns"></a>

有些 AWS 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`  | 

## AWS Glue 非目录单数 API 操作的访问控制
<a name="non-catalog-singular-apis"></a>

AWS 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*"
    }
  ]
}
```

------

## 检索多个项目的 AWS Glue 非目录 API 操作的访问控制
<a name="non-catalog-plural-apis"></a>

有些 AWS 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": [
                "*"
            ]
}
```

## AWS Glue 非目录 BatchGet API 操作的访问控制
<a name="non-catalog-batch-get-apis"></a>

有些 AWS 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 操作），请参阅 [适用于 AWS Glue 的基于身份的策略示例](security_iam_id-based-policy-examples.md)。