

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

# 使用适用于 Apache Spark 的 Amazon Redshift 集成进行身份验证
<a name="emr-spark-redshift-auth"></a>

以下部分展示了与 Apache Spark 集成后 Amazon Redshift 提供的身份验证选项。这些部分展示了如何检索登录凭证，以及将 JDBC 驱动程序与 IAM 身份验证结合使用的详细信息。

## 用于 Amazon Secrets Manager 检索凭证并连接亚马逊 Redshift
<a name="emr-spark-redshift-secrets"></a>

您可以将凭证存储在 Secrets Manager 中，以便安全地对 Amazon Redshift 进行身份验证。您可以使 Spark 任务调用 `GetSecretValue` API 来获取凭证：

```
from pyspark.sql import SQLContextimport boto3

sc = # existing SparkContext
sql_context = SQLContext(sc)

secretsmanager_client = boto3.client('secretsmanager', region_name=os.getenv('AWS_REGION'))
secret_manager_response = secretsmanager_client.get_secret_value(
    SecretId='string',
    VersionId='string',
    VersionStage='string'
)
username = # get username from secret_manager_response
password = # get password from secret_manager_response
url = "jdbc:redshift://redshifthost:5439/database?user=" + username + "&password=" + password

# Access to Redshift cluster using Spark
```

## 将基于 IAM 的身份验证与 Amazon EMR on EKS 任务执行角色结合使用
<a name="emr-spark-redshift-iam"></a>

从 Amazon EMR on EKS 发行版 6.9.0 开始，Amazon Redshift JDBC 驱动程序版本 2.1 或更高版本将被打包到环境中。您可以使用 JDBC 驱动程序 2.1 及更高版本指定 JDBC URL，而不包括原始用户名和密码。相反，您可以指定 `jdbc:redshift:iam://` 方案。从而命令 JDBC 驱动程序使用 Amazon EMR on EKS 任务执行角色自动获取凭证。

有关更多信息，请参阅《Amazon Redshift 管理指南**》中的[配置 JDBC 或 ODBC 连接以使用 IAM 凭证](https://docs.amazonaws.cn/redshift/latest/mgmt/generating-iam-credentials-configure-jdbc-odbc.html)。

以下示例 URL 使用 `jdbc:redshift:iam://` 方案。

```
jdbc:redshift:iam://examplecluster.abc123xyz789.us-west-2.redshift.amazonaws.com:5439/dev
```

如果任务执行角色满足提供的条件，则需要以下权限。


| 权限 | 任务执行角色所需的条件 | 
| --- | --- | 
|  redshift:GetClusterCredentials  | JDBC 驱动程序从 Amazon Redshift 获取凭证所需的权限 | 
|  redshift:DescribeCluster  | 在 JDBC URL 中指定 Amazon Redshift 集群和 Amazon Web Services 区域 而非端点所需的权限 | 
|  redshift-serverless:GetCredentials  | JDBC 驱动程序从 Amazon Redshift Serverless 获取凭证所需的权限 | 
|  redshift-serverless:GetWorkgroup  | 使用 Amazon Redshift Serverless 并根据工作组名称和区域指定 URL 所需的权限 | 

您的任务执行角色策略应具备以下权限。

```
{
            "Effect": "Allow",
            "Action": [
                "redshift:GetClusterCredentials",
                "redshift:DescribeCluster",
                "redshift-serverless:GetCredentials",
                "redshift-serverless:GetWorkgroup"
            ],
            "Resource": [
                "arn:aws:redshift:AWS_REGION:ACCOUNT_ID:dbname:CLUSTER_NAME/DATABASE_NAME",
                "arn:aws:redshift:AWS_REGION:ACCOUNT_ID:dbuser:DATABASE_NAME/USER_NAME"
            ]
        }
```

## 使用 JDBC 驱动程序对 Amazon Redshift 进行身份验证
<a name="emr-spark-redshift-jdbc"></a>

**在 JDBC URL 中设置用户名和密码**

要向 Amazon Redshift 集群验证 Spark 任务，您可以在 JDBC URL 中指定 Amazon Redshift 数据库的名称和密码。

**注意**  
如果您在 URL 中传递数据库凭证，则有权访问该 URL 的任何人也可以访问凭证。通常不建议使用此方法，因为这不是一个安全的选项。

如果您的应用程序不考虑安全性，则可以使用以下格式在 JDBC URL 中设置用户名和密码：

```
jdbc:redshift://redshifthost:5439/database?user=username&password=password
```