

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

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

## 使用 AWS Secrets Manager 擷取登入資料並連線至 Amazon Redshift
<a name="emr-spark-redshift-secrets"></a>

您可以安全地向 Amazon Redshift 進行身分驗證，方法是將登入資料存放在 Secrets Manager 中，並讓 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
```

## 使用 JDBC 驅動器對 Amazon Redshift 進行身分驗證
<a name="emr-spark-redshift-jdbc"></a>

**在 JDBC URL 中設定使用者名稱和密碼**

您可以在 JDBC URL 中指定 Amazon Redshift 資料庫名稱和密碼，以向 Amazon Redshift 叢集驗證 Spark 任務。

**注意**  
如果在 URL 中傳遞資料庫憑證，則擁有 URL 存取權的任何人也可以存取憑證。通常不建議使用此方法，因為它不安全。

如果您的應用程式不考慮安全性，請使用下列格式在 JDBC URL 中設定使用者名稱和密碼：

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

## 搭配 Amazon EMR Serverless 任務執行角色使用 IAM 型身分驗證
<a name="emr-spark-redshift-iam"></a>

從 Amazon EMR Serverless 6.9.0 版開始，Amazon Redshift JDBC 驅動程式 2.1 或更新版本會封裝到環境中。使用 JDBC 驅動器 2.1 及更高版本，可以指定 JDBC URL，而不包含原始使用者名稱和密碼。

反之，請指定`jdbc:redshift:iam://`配置。這會命令 JDBC 驅動程式使用您的 EMR Serverless 任務執行角色自動擷取登入資料。如需詳細資訊，請參閱《**[Amazon Redshift 管理指南》中的設定 JDBC 或 ODBC 連線以使用 IAM 憑證](https://docs.aws.amazon.com/redshift/latest/mgmt/generating-iam-credentials-configure-jdbc-odbc.html)。此 URL 的範例如下：

```
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，則為必要項目 | 

## 在不同的 VPC 中連線至 Amazon Redshift
<a name="emr-spark-redshift-vpc"></a>

當您在 VPC 下設定佈建的 Amazon Redshift 叢集或 Amazon Redshift Serverless 工作群組時，請為 Amazon EMR Serverless 應用程式設定 VPC 連線，以存取 資源。如需如何在 EMR Serverless 應用程式上設定 VPC 連線的詳細資訊，請參閱 [設定 EMR Serverless 應用程式的 VPC 存取以連線至資料](vpc-access.md)。
+ 如果您佈建的 Amazon Redshift 叢集或 Amazon Redshift Serverless 工作群組可公開存取，請在建立 EMR Serverless 應用程式時指定一或多個已連接 NAT 閘道的私有子網路。
+ 如果您佈建的 Amazon Redshift 叢集或 Amazon Redshift Serverless 工作群組無法公開存取，您必須為 Amazon Redshift 叢集建立 Amazon Redshift 受管 VPC 端點，如 中所述[設定 EMR Serverless 應用程式的 VPC 存取以連線至資料](vpc-access.md)。或者，您可以建立 Amazon Redshift Serverless 工作群組，如 [Amazon Redshift 管理指南中的連線至 Amazon Redshift Serverless](https://docs.aws.amazon.com/redshift/latest/mgmt/serverless-connecting.html) 所述。 **您必須將叢集或子群組與您建立 EMR Serverless 應用程式時指定的私有子網路建立關聯。

**注意**  
如果您使用 IAM 型身分驗證，且 EMR Serverless 應用程式的私有子網路未連接 NAT 閘道，則您還必須在這些子網路上為 Amazon Redshift 或 Amazon Redshift Serverless 建立 VPC 端點。如此一來，JDBC 驅動程式就可以擷取登入資料。