

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Apache Spark 的 Amazon Redshift 整合進行身分驗證
<a name="emr-spark-redshift-auth"></a>

當您與 Apache Spark 整合時，以下各節顯示 Amazon Redshift 的身分驗證選項。這些章節說明如何擷取登入憑證，以及使用 JDBC 驅動程式搭配 IAM 身分驗證的詳細資訊。

## 使用 AWS Secrets Manager 擷取登入資料並連線至 Amazon 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.aws.amazon.com/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 叢集和 AWS 區域 時所需的條件 | 
|  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
```