使用 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 之间进行身份验证,则使用以下方法之一:

  • AWS SDK for Java 会自动尝试使用由 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 对密钥对(ACCESSKEYSECRETKEY)进行编码。

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 根据 Apache 2.0 许可证的许可而开发的示例代码和语言。