

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

# 设置查询引擎和权限以创建带结构化数据存储的知识库
<a name="knowledge-base-prereq-structured"></a>

本主题介绍将知识库连接到结构化数据存储时所需的权限。如果您计划将 Amazon Bedrock 知识库连接到结构化数据存储，则需要满足相应的先决条件。有关需满足的一般权限要求，请参阅[为用户或角色设置创建和管理知识库所需的权限](knowledge-base-prereq-permissions-general.md)。

**重要**  
执行任意 SQL 查询可能对任何 Text-to-SQL应用程序构成安全风险。我们建议您根据需要采取预防措施，例如使用受限角色、只读数据库和沙盒处理。

Amazon Bedrock 知识库使用 Amazon Redshift 作为查询引擎来查询数据存储。查询引擎访问结构化数据存储中的元数据，并使用这些元数据来帮助生成 SQL 查询。Amazon Redshift 是一项数据仓库服务，它使用 SQL 来分析数据仓库、数据库和数据湖中的结构化数据。

## 创建 Amazon Redshift 查询引擎
<a name="kb-query-engine-setup-create"></a>

可以根据您的使用案例使用 Amazon Redshift Serverless 或已预调配的 Amazon Redshift，并连接到数据仓库的工作组或集群。Amazon Redshift 引擎可以查询的基础数据可以是原生存储在 Amazon Redshift 集群中的数据，也可以是位于默认集群下的数据 AWS Glue Data Catalog （例如亚马逊 S3 等）。

如果您已创建查询引擎，则可以跳过此先决条件。否则，请执行以下步骤来设置已预调配的 Amazon Redshift 或 Amazon Redshift Serverless 查询引擎：

**在已预调配的 Amazon Redshift 中设置查询引擎**

1. 按照《Amazon Redshift 入门指南》中的[步骤 1：创建示例 Amazon Redshift 集群](https://docs.aws.amazon.com/redshift/latest/gsg/new-user.html#rs-gsg-launch-sample-cluster)中的过程操作。

1. 记下集群 ID。

1. （可选）有关 Amazon Redshift 预调配集群的更多信息，请参阅《Amazon Redshift 管理指南》中的 [Amazon Redshift 预调配集群](https://docs.aws.amazon.com/redshift/latest/mgmt/working-with-clusters.html)。

**在 Amazon Redshift Serverless 中设置查询引擎**

1. 仅按照《Amazon Redshift 入门指南》中的[使用 Amazon Redshift Serverless 创建数据仓库](https://docs.aws.amazon.com/redshift/latest/gsg/new-user-serverless.html#serverless-console-resource-creation)中的设置过程操作，并为其配置默认设置。

1. 记下工作组 ARN。

1. （可选）有关 Amazon Redshift Serverless 工作组的更多信息，请参阅《Amazon Redshift 管理指南》中的[工作组和命名空间](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-workgroup-namespace.html)。

## 配置 Amazon Redshift 查询引擎权限
<a name="kb-query-engine-setup-redshift-permissions"></a>

根据您选择的 Amazon Redshift 查询引擎，您可以配置某些权限。您配置的权限取决于身份验证方法。下表显示了可用于不同的查询引擎的身份验证方法：


****  

| 身份验证方法 | 已预调配的 Amazon Redshift | Amazon Redshift Serverless | 
| --- | --- | --- | 
| IAM | ![\[Green circular icon with a white checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/icons/icon-yes.png)是 | ![\[Green circular icon with a white checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/icons/icon-yes.png)是 | 
| 数据库用户名 | ![\[Green circular icon with a white checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/icons/icon-yes.png)是 | ![\[Red circular icon with an X symbol, indicating cancellation or denial.\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/icons/icon-no.png)否 | 
| AWS Secrets Manager | ![\[Green circular icon with a white checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/icons/icon-yes.png)是 | ![\[Green circular icon with a white checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/icons/icon-yes.png)是 | 

Amazon Bedrock 知识库使用[服务角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)将知识库连接到结构化数据存储，从这些数据存储中检索数据，并根据用户查询和数据存储的结构生成 SQL 查询。

**注意**  
如果您计划使用 AWS 管理控制台 来创建知识库，则可以跳过此先决条件。控制台将创建具有适当权限的 Amazon Bedrock 知识库服务角色。

要创建具有适当权限的自定义 IAM 服务角色，请按照[创建向 AWS 服务委派权限的角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html)中的步骤操作，并附加[信任关系](kb-permissions.md#kb-permissions-trust)中定义的信任关系。

然后，为您的知识库添加对 Amazon Redshift 查询引擎和数据库的访问权限。展开与适用于您的使用案例的部分：

### 您的查询引擎是已预调配的 Amazon Redshift
<a name="w2aac28c10c27c13c11c15b1"></a>

将以下策略附加到您的自定义服务角色，以允许此角色访问您的数据并使用该数据生成查询：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "RedshiftDataAPIStatementPermissions",
            "Effect": "Allow",
            "Action": [
                "redshift-data:GetStatementResult",
                "redshift-data:DescribeStatement",
                "redshift-data:CancelStatement"
            ],
            "Resource": [
                "*"
            ],
            "Condition": {
                "StringEquals": {
                    "redshift-data:statement-owner-iam-userid": "${aws:userid}"
                }
            }
        },
        {
            "Sid": "RedshiftDataAPIExecutePermissions",
            "Effect": "Allow",
            "Action": [
                "redshift-data:ExecuteStatement"
            ],
            "Resource": [
                "arn:aws:redshift:us-east-1:123456789012:cluster:${Cluster}"
            ]
        },
        {
            "Sid": "SqlWorkbenchAccess",
            "Effect": "Allow",
            "Action": [
                "sqlworkbench:GetSqlRecommendations",
                "sqlworkbench:PutSqlGenerationContext",
                "sqlworkbench:GetSqlGenerationContext",
                "sqlworkbench:DeleteSqlGenerationContext"
            ],
            "Resource": "*"
        },
        {
            "Sid": "GenerateQueryAccess",
            "Effect": "Allow",
            "Action": [
                "bedrock:GenerateQuery"
            ],
            "Resource": "*"
        }
    ]
}
```

------

您还需要添加权限以允许您的服务角色向查询引擎进行身份验证。展开一个部分以查看该方法的权限。

------
#### [ IAM ]

要允许您的服务角色通过 IAM 对已预调配的 Amazon Redshift 查询引擎进行身份验证，请将以下策略附加到自定义服务角色：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "GetCredentialsWithFederatedIAMCredentials",
            "Effect": "Allow",
            "Action": "redshift:GetClusterCredentialsWithIAM",
            "Resource": [
                "arn:aws:redshift:us-east-1:123456789012:dbname:Cluster/database"
            ]
        }
    ]
}
```

------

------
#### [ Database user ]

要以 Amazon Redshift 数据库用户身份进行身份验证，请将以下策略附加到服务角色：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "GetCredentialsWithClusterCredentials",
            "Effect": "Allow",
            "Action": [
                "redshift:GetClusterCredentials"
            ],
            "Resource": [
                "arn:aws:redshift:us-east-1:123456789012:dbuser:${cluster}/${dbuser}",
                "arn:aws:redshift:us-east-1:123456789012:dbname:${cluster}/${database}"
            ]
        }
    ]
}
```

------

------
#### [ AWS Secrets Manager ]

要允许您的服务角色使用 AWS Secrets Manager 密钥向 Amazon Redshift 预配置的查询引擎进行身份验证，请执行以下操作：
+ 将以下策略附加到角色：

  ```
  {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "GetSecretPermissions",
              "Effect": "Allow",
              "Action": [
                  "secretsmanager:GetSecretValue"
              ],
              "Resource": [
                  "arn:aws:secretsmanager:${region}:${account}:secret:${secretName}"
              ]
          }
      ]
  }
  ```

------

### 您的查询引擎是 Amazon Redshift Serverless
<a name="w2aac28c10c27c13c11c15b3"></a>

要附加的权限取决于您的身份验证方法。展开一个部分以查看方法的权限。

------
#### [ IAM ]

要允许您的服务角色通过 IAM 对 Amazon Redshift Serverless 查询引擎进行身份验证，请将以下策略附加到自定义服务角色：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "RedshiftServerlessGetCredentials",
            "Effect": "Allow",
            "Action": "redshift-serverless:GetCredentials",
            "Resource": [
                "arn:aws:redshift-serverless:us-east-1:123456789012:workgroup/WorkgroupId"
            ]
        }
    ]
}
```

------

------
#### [ AWS Secrets Manager ]

要允许您的服务角色使用 AWS Secrets Manager 密钥向 Amazon Redshift 预配置的查询引擎进行身份验证，请执行以下操作：
+ 将以下策略附加到角色：

  ```
  {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "GetSecretPermissions",
              "Effect": "Allow",
              "Action": [
                  "secretsmanager:GetSecretValue"
              ],
              "Resource": [
                  "arn:aws:secretsmanager:${region}:${account}:secret:${secretName}"
              ]
          }
      ]
  }
  ```

------

## 允许知识库服务角色访问您的数据存储
<a name="knowledge-base-prereq-structured-db-access"></a>

确保您的数据存储在以下某个[支持的结构化数据存储](knowledge-base-structured-create.md)中：
+ Amazon Redshift
+ AWS Glue Data Catalog (AWS Lake Formation)

下表汇总了适用于查询引擎的身份验证方法，具体取决于您的数据存储：


****  

| 身份验证方法 | Amazon Redshift | AWS Glue Data Catalog (AWS Lake Formation) | 
| --- | --- | --- | 
| IAM | ![\[Green circular icon with a white checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/icons/icon-yes.png)是 | ![\[Green circular icon with a white checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/icons/icon-yes.png)是 | 
| 数据库用户名 | ![\[Green circular icon with a white checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/icons/icon-yes.png)是 | ![\[Red circular icon with an X symbol, indicating cancellation or denial.\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/icons/icon-no.png)否 | 
| AWS Secrets Manager | ![\[Green circular icon with a white checkmark symbol inside.\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/icons/icon-yes.png)是 | ![\[Red circular icon with an X symbol, indicating cancellation or denial.\]](http://docs.aws.amazon.com/zh_cn/bedrock/latest/userguide/images/icons/icon-no.png)否 | 

要了解如何为 Amazon Bedrock 知识库服务角色设置适当权限，以便访问您的数据存储并基于其生成查询，请展开与数据存储所在的服务对应的部分：

### Amazon Redshift
<a name="w2aac28c10c27c13c13c13b1"></a>

要向 Amazon Bedrock 知识库服务角色授予对 Amazon Redshift 数据库的访问权限，请使用 [Amazon Redshift 查询编辑器 V2](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2.html) 并运行以下 SQL 命令：

1. （如果您使用 IAM 进行身份验证但尚未为数据库创建用户）运行以下命令，该命令使用 CREATE USER [创建数据库用户](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_USER.html)并允许其通过 IAM 进行身份验证，*\$1\$1service-role\$1*替换为您创建的自定义 Amazon Bedrock 知识库服务角色的名称：

   ```
   CREATE USER "IAMR:${service-role}" WITH PASSWORD DISABLE;
   ```
**重要**  
如果您使用在控制台中为您创建的 Amazon Bedrock 知识库服务角色，然后在执行此步骤之前[同步您的数据存储](kb-data-source-structured-sync-ingest.md)，则系统将为您创建用户，不过同步将失败，因为该用户尚未获得对您的数据存储的访问权限。在同步之前，您必须执行以下步骤。

1. 通过运行 [GRANT](https://docs.aws.amazon.com/redshift/latest/dg/r_GRANT.html) 命令向身份授予从数据库中检索信息的权限。

------
#### [ IAM ]

   ```
   GRANT SELECT ON ALL TABLES IN SCHEMA ${schemaName} TO "IAMR:${serviceRole}";
   ```

------
#### [ Database user ]

   ```
   GRANT SELECT ON ALL TABLES IN SCHEMA ${schemaName} TO "${dbUser}";
   ```

------
#### [ AWS Secrets Manager username ]

   ```
   GRANT SELECT ON ALL TABLES IN SCHEMA ${schemaName} TO "${secretsUsername}";
   ```

------
**重要**  
不要向 `CREATE`、`UPDATE` 或 `DELETE` 授予访问权限。向这些操作授予访问权限可能会导致您的数据发生非预期的修改。

   为了更精细地控制可以访问的表，可以用以下表示法替换`ALL TABLES`特定的表名：。*\$1\$1schemaName\$1* *\$1\$1tableName\$1*有关此表示法的更多信息，请参阅[跨数据库查询](https://docs.aws.amazon.com/redshift/latest/dg/cross-database-overview.html)中的**查询对象**部分。

------
#### [ IAM ]

   ```
   GRANT SELECT ON ${schemaName}.${tableName} TO "IAMR:${serviceRole}";
   ```

------
#### [ Database user ]

   ```
   GRANT SELECT ON ${schemaName}.${tableName} TO "${dbUser}";
   ```

------
#### [ AWS Secrets Manager username ]

   ```
   GRANT SELECT ON ${schemaName}.${tableName} TO "${secretsUsername}";
   ```

------

1. 如果您在 Redshift 数据库中创建了新架构，请运行以下命令以向身份授予对新架构的权限。

   ```
   GRANT USAGE ON SCHEMA ${schemaName} TO "IAMR:${serviceRole}";
   ```

### AWS Glue Data Catalog
<a name="w2aac28c10c27c13c13c13b3"></a>

要授予您的 Amazon Bedrock 知识库服务角色访问您的 AWS Glue Data Catalog 数据存储的权限，请使用 [Amazon Redshift 查询编辑器](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor-v2.html) v2 并运行以下 SQL 命令：

1. 运行以下命令，该命令使用 CREATE [US](https://docs.aws.amazon.com/redshift/latest/dg/r_CREATE_USER.html) ER 创建数据库用户并允许其通过 IAM 进行身份验证，*\$1\$1service-role\$1*替换为您创建的自定义 Amazon Bedrock 知识库服务角色的名称：

   ```
   CREATE USER "IAMR:${service-role}" WITH PASSWORD DISABLE;
   ```
**重要**  
如果您使用在控制台中为您创建的 Amazon Bedrock 知识库服务角色，然后在执行此步骤之前[同步您的数据存储](kb-data-source-structured-sync-ingest.md)，则系统将为您创建用户，不过同步将失败，因为该用户尚未获得对您的数据存储的访问权限。在同步之前，您必须执行以下步骤。

1. 通过运行以下 [GRANT](https://docs.aws.amazon.com/redshift/latest/dg/r_GRANT.html) 命令向服务角色授予从数据库中检索信息的权限：

   ```
   GRANT USAGE ON DATABASE awsdatacatalog TO "IAMR:${serviceRole}";
   ```
**重要**  
不要向 `CREATE`、`UPDATE` 或 `DELETE` 授予访问权限。向这些操作授予访问权限可能会导致您的数据发生非预期的修改。

1. 要允许访问您的 AWS Glue Data Catalog 数据库，请将以下权限附加到服务角色：

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

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "VisualEditor0",
               "Effect": "Allow",
               "Action": [
                   "glue:GetDatabases",
                   "glue:GetDatabase",
                   "glue:GetTables",
                   "glue:GetTable",
                   "glue:GetPartitions",
                   "glue:GetPartition",
                   "glue:SearchTables"
               ],
               "Resource": [
                   "arn:aws:glue:us-east-1:123456789012:table/${DatabaseName}/${TableName}",
                   "arn:aws:glue:us-east-1:123456789012:database/${DatabaseName}",
                   "arn:aws:glue:us-east-1:123456789012:catalog"
               ]
           }
       ]
   }
   ```

------

1. 通过以下方式向你的服务角色授予权限 AWS Lake Formation （要详细了解 Lake Formation 及其与 Amazon Redshift 的关系，请参阅 [Redshift 的数据源](https://docs.aws.amazon.com/redshift/latest/dg/copy-parameters-data-source.html)）：

   1. 登录并打开 Lake AWS 管理控制台 Formation 控制台，网址为[https://console.aws.amazon.com/lakeformation/](https://console.aws.amazon.com/lakeformation/)。

   1. 从左侧导航窗格中选择**数据权限**。

   1. 向用于 Amazon Bedrock 知识库的服务角色授予权限。

   1. 授予数据库和表的**描述**和**选择**权限。

1. 根据您在中使用的数据源 AWS Glue Data Catalog，您可能需要添加访问该数据源的权限（有关更多信息，请参阅[AWS Glue 依赖于其他](https://docs.aws.amazon.com/glue/latest/dg/dependency-on-other-services.html)数据源 AWS 服务）。例如，如果您的数据来源位于 Amazon S3 位置，则需要向上述策略添加以下语句。

   ```
   {
       "Sid": "Statement1",
       "Effect": "Allow",
       "Action": [
           "s3:ListBucket",
           "s3:GetObject"
       ],
       "Resource": [
           "arn:aws:s3:::${BucketName}",
           "arn:aws:s3:::${BucketName}/*"
       ]
   }
   ```

1. （可选）如果您使用 AWS KMS 对 Amazon S3 中的数据进行加密 AWS Glue Data Catalog，则需要向该角色添加解密 KMS 密钥上数据的权限。

   ```
   {
       "Action": [
           "kms:Decrypt"
       ],
       "Resource": [
           "arn:aws:kms:${Region}:${Account}:key/{KmsId}",
           "arn:aws:kms:${Region}:${Account}:key/{KmsId}"
       ],
       "Effect": "Allow"
   }
   ```