AWS 错误消息:使用 AWS KMS 托管密钥指定服务器端加密的请求需要 AWS 签名版本 4

Posted

技术标签:

【中文标题】AWS 错误消息:使用 AWS KMS 托管密钥指定服务器端加密的请求需要 AWS 签名版本 4【英文标题】:AWS Error Message: Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4 【发布时间】:2021-02-02 01:15:06 【问题描述】:

我在使用 pyspark 写入 S3 存储桶时遇到以下错误。

com.amazonaws.services.s3.model.AmazonS3Exception:状态代码:400,AWS 服务:Amazon S3,AWS 请求 ID:A0B0C0000000DEF0,AWS 错误代码:InvalidArgument,AWS 错误消息:使用 AWS KMS 指定服务器端加密的请求托管密钥需要 AWS 签名版本 4。,

我已在 S3 存储桶上使用 AWS KMS 服务应用服务器端加密。 我正在使用以下 spark-submit 命令 -

spark-submit --packages com.amazonaws:aws-java-sdk-pom:1.10.34,org.apache.hadoop:hadoop-aws:2.7.2 --jars sample-jar sample_pyspark.py 

这是我正在处理的示例代码 -

spark_context = SparkContext()
sql_context = SQLContext(spark_context) 
spark = SparkSession.builder.appName('abc').getOrCreate()
hadoopConf = spark_context._jsc.hadoopConfiguration()
hadoopConf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
#Have a spark dataframe 'source_data
source_data.coalesce(1).write.mode('overwrite').parquet("s3a://sample-bucket")

注意:尝试将 spark-dataframe 加载到 s3 存储桶 [未启用服务器端加密] 并且成功

【问题讨论】:

您正在使用五年前的 s3a 连接器副本。尝试使用带有 hadoop-3.1 二进制文件的 spark 版本,看看会发生什么。 解决方案:***.com/a/56855992/1465609 【参考方案1】:

错误似乎是在告诉您在 Amazon SDK 上启用 V4 S3 签名。一种方法是从命令行:

spark-submit --conf spark.driver.extraJavaOptions='-Dcom.amazonaws.services.s3.enableV4' \
    --conf spark.executor.extraJavaOptions='-Dcom.amazonaws.services.s3.enableV4' \
    ... (other spark options)

也就是说,我同意 Steve 的观点,即您应该使用更新的 hadoop 库。

参考资料:

Amazon s3a returns 400 Bad Request with Spark

【讨论】:

以上是关于AWS 错误消息:使用 AWS KMS 托管密钥指定服务器端加密的请求需要 AWS 签名版本 4的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cloudformation 创建 KMS 密钥时出现消息“没有 IAM 权限来处理 AWS::KMS::Key 资源上的标签”

AWS:无法使用流从 SSE-KMS 加密存储桶下载文件

AWS lambda 和 kms 密钥别名

java AWS KMS使用Java生成数据密钥

解密aws kms密钥时出现Nodejs异步问题

使用AWS KMS加密本地数据