使用 Spark 连接器进行身份验证
下图描述了 Amazon S3、Amazon Redshift、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 操作所需的所有权限。
-
Redshift:GetClusterCredentials(适用于预置的 Redshift 集群)
-
Redshift:DescribeClusters(适用于预置的 Redshift 集群)
-
Redshift:GetWorkgroup(适用于 Amazon Redshift Serverless 工作组)
-
Redshift:GetCredentials(适用于 Amazon Redshift Serverless 工作组)
有关 GetClusterCredentials 的更多信息,请参阅 GetClusterCredentials 的资源策略。
您还必须确保 Amazon Redshift 可以在 COPY
和 UNLOAD
操作期间担任 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 之间进行身份验证,则使用以下方法之一:
-
AWS SDK for Java 会自动尝试使用由 DefaultAWSCredentialsProviderChain 类实施的默认凭证提供程序链来查找 AWS 凭证。有关更多信息,请参阅使用默认凭证提供程序链。
-
您可以通过 Hadoop 配置属性
指定 AWS 密钥。例如,如果您的 tempdir
配置指向s3n://
文件系统,请在 Hadoop XML 配置文件中设置fs.s3n.awsAccessKeyId
和fs.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 中对身份验证密钥进行编码。例如,URIs3n://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 中的 Identity and Access Management。
与 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