使用kms加密密钥将数据帧作为csv写入S3而不提供密钥

问题描述

我已经通过 spark 数据框创建了 CSV 文件,这些文件会自动对 KMS 进行加密。

为了您的参考,我提供了一个创建这些 KMS 加密文件的示例代码片段。如果您在写作时看到我没有提供任何 KMS 密钥。如果您能说出根本原因,那将非常有帮助。

val df=spark.read.format("csv").option("header","true").load("s3:///test/App_IP.csv")
df.createOrReplaceTempView("test")
val df1=spark.sql("select name from test")
df1.coalesce(1).write.format("com.databricks.spark.csv").option("header","true").save("s3://test/city5/")

这段代码我是从 EMR 集群中的 spark-shell (emr-5.24.0) 执行的,spark 版本是 Spark 2.4.2

解决方法

您可以使用 EMR 文档中所述的 S3 加密Amazon S3 Server-Side Encryption

fs.s3.enableServerSideEncryption:设置为 true 时,存储在 Amazon S3 中的对象使用服务器端加密进行加密。如果未指定密钥,则使用 SSE-S3。 fs.s3.serverSideEncryption.kms.keyId:指定 AWS KMS 密钥 ID 或 ARN。如果指定了密钥,则使用 SSE-KMS。

创建启用 SSE-S3 的集群:

aws emr create-cluster --release-label emr-5.24.0 \
--instance-count 3 --instance-type m5.xlarge --emrfs Encryption=ServerSide

创建启用 SSE-KMS 的集群:

aws emr create-cluster --release-label emr-5.24.0 \ --instance-count 3 \
--instance-type m5.xlarge --use-default-roles \
--emrfs Encryption=ServerSide,Args=[fs.s3.serverSideEncryption.kms.keyId=<keyId>]

或者通过提供集群配置 JSON :

[
  ...
   {
    "Classification":"emrfs-site","Properties": {
       "fs.s3.enableServerSideEncryption": "true","fs.s3.serverSideEncryption.kms.keyId":"<keyId>"
    }
  }
]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...