使用 Spark 連接器進行身分驗證 - Amazon Redshift

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

使用 Spark 連接器進行身分驗證

下圖描述了 Amazon S3、Amazon Redshift、Spark 驅動程式和 Spark 執行程式之間的身分驗證。

這是 Spark 連接器的身分驗證圖。

Redshift 和 Spark 之間的身分驗證

您可以使用 Amazon Redshift 提供的 JDBC 驅動程式第 2 版,透過指定登入憑證使用 Spark 連接器連線到 Amazon Redshift。若要使用 IAM,請設定 JDBC url 以使用 IAM 身分驗證。若要從 Amazon EMR 或 AWS Glue 連線到 Redshift 叢集,請確定您的 IAM 角色有可用來擷取暫時 IAM 憑證的必要許可。下列清單描述 IAM 角色要擷取憑證和執行 Amazon S3 操作所需的所有許可。

如需 GetClusterCredentials 的詳細資訊,請參閱 GetClusterCredentials 的資源政策

您還必須確保 Amazon Redshift 可以在 COPYUNLOAD 操作期間擔任 IAM 角色。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "redshift.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

如果您使用的是最新的 JDBC 驅動程式,該驅動程式會自動管理從 Amazon Redshift 自我簽署憑證到 ACM 憑證的轉換。但是,您必須指定 JDBC url 的 SSL 選項

以下是如何指定 JDBC 驅動程式 URL 和 aws_iam_role 以連線到 Amazon Redshift 的範例。

df.write \ .format("io.github.spark_redshift_community.spark.redshift ") \ .option("url", "jdbc:redshift:iam://<the-rest-of-the-connection-string>") \ .option("dbtable", "<your-table-name>") \ .option("tempdir", "s3a://<your-bucket>/<your-directory-path>") \ .option("aws_iam_role", "<your-aws-role-arn>") \ .mode("error") \ .save()

Amazon S3 和 Spark 之間的身分驗證

如果您使用 IAM 角色在 Spark 和 Amazon S3 之間進行驗證,請使用下列其中一種方法:

  • 適用於 Java 的 AWS SDK 會自動嘗試使用 DefaultAWSCredentialsProviderChain 類別所實作的預設憑證提供者鏈結來尋找 AWS 憑證。如需詳細資訊,請參閱使用預設憑證提供者鏈結

  • 您可以透過 Hadoop 組態屬性來指定 AWS 金鑰。例如,如果您的 tempdir 組態指向 s3n:// 檔案系統,請在 Hadoop XML 組態檔案中設定 fs.s3n.awsAccessKeyIdfs.s3n.awsSecretAccessKey 屬性,或呼叫 sc.hadoopConfiguration.set() 以變更 Spark 的全域 Hadoop 組態。

例如,假設您使用 s3n 檔案系統,請新增:

sc.hadoopConfiguration.set("fs.s3n.awsAccessKeyId", "YOUR_KEY_ID") sc.hadoopConfiguration.set("fs.s3n.awsSecretAccessKey", "YOUR_SECRET_ACCESS_KEY")

若為 s3a 檔案系統,請新增:

sc.hadoopConfiguration.set("fs.s3a.access.key", "YOUR_KEY_ID") sc.hadoopConfiguration.set("fs.s3a.secret.key", "YOUR_SECRET_ACCESS_KEY")

如果您使用 Python,請使用下列操作:

sc._jsc.hadoopConfiguration().set("fs.s3n.awsAccessKeyId", "YOUR_KEY_ID") sc._jsc.hadoopConfiguration().set("fs.s3n.awsSecretAccessKey", "YOUR_SECRET_ACCESS_KEY")
  • tempdir URL 中編碼身分驗證金鑰。例如,URI s3n://ACCESSKEY:SECRETKEY@bucket/path/to/temp/dir 會編碼金鑰對 (ACCESSKEY,SECRETKEY)。

Redshift 和 Amazon S3 之間的身分驗證

如果您在查詢中使用 COPY 和 UNLOAD 命令,則也必須向 Amazon S3 授予 Amazon Redshift 的存取權,以代表您執行查詢。若要這麼做,請先授權 Amazon Redshift 存取其他 AWS 服務,然後授權使用 IAM 角色進行 COPY 和 UNLOAD 操作

我們建議的最佳實務是,將許可政策附加到 IAM 角色,然後根據需要將其指派給使用者和群組。如需詳細資訊,請參閱 Amazon Redshift 中的身分和存取管理

與 AWS Secrets Manager 的整合

您可以從 AWS Secrets Manager 中儲存的機密擷取 Redshift 的使用者名稱和密碼憑證。若要自動提供 Redshift 憑證,請使用 secret.id 參數。如需有關如何建立 Redshift 憑證機密的詳細資訊,請參閱建立 AWS Secrets Manager 資料庫機密

GroupID ArtifactID 支援的修訂 描述
com.amazonaws.secretsmanager aws-secretsmanager-jdbc 1.0.12 適用於 Java 的 AWS Secrets Manager SQL 連線庫可讓 Java 開發人員使用 AWS Secrets Manager 中儲存的機密輕鬆連線到 SQL 資料庫。
注意

確認:本文件包含由 Apache Software Foundation 根據 Apache 2.0 授權所開發的範例程式碼和語言。