在AWS上使用KMS客户端密钥加密S3文件,同时支持PySpark读写和Snowflake导入

server/2025/2/2 8:01:34/

现有AWS EMR集群上运行PySpark代码,可以读写S3上的数据文件,Snowflake数据仓库也需要导入S3上的文件到表。现在要用AWS KMS有客户端密钥加密S3上的文件,同时允许PySpark代码,可以读写S3上的数据文件,Snowflake数据仓库导入S3上的文件到表。

为了实现AWS EMR上的PySpark读写KMS加密的S3文件,并让Snowflake导入这些文件,请按照以下步骤操作:

一、S3文件加密配置

  1. 使用SSE-KMS加密S3文件
    • 上传文件时设置加密头:
      aws s3 cp localfile s3://your-bucket/path/ --sse aws:kms --sse-kms-key-id <KMS_KEY_ARN>
      
    • 或通过AWS控制台上传时选择“AWS-KMS”加密并指定CMK。

二、配置EMR集群访问KMS加密文件

  1. IAM角色权限
    • 确保EMR的EC2实例角色(如EMR_EC2_DefaultRole)附加以下策略:
      {"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": ["kms:Decrypt","kms:Encrypt","kms:GenerateDataKey"],"Resource": "<KMS_KEY_ARN>"}]
      }
      
  2. PySpark配置
    • spark-defaults.conf中添加:
      spark.hadoop.fs.s3a.server-side-encryption-algorithm AWS-KMS
      spark.hadoop.fs.s3a.server-side-encryption.key <KMS_KEY_ARN>
      
    • 或在代码中设置:
      python">spark.conf.set("fs.s3a.server-side-encryption-algorithm", "AWS-KMS")
      spark.conf.set("fs.s3a.server-side-encryption.key", "<KMS_KEY_ARN>")
      

三、Snowflake导入加密文件配置

  1. IAM角色授权
    • 在Snowflake中创建或更新存储集成对象:
      CREATE STORAGE INTEGRATION s3_intTYPE = EXTERNAL_STAGESTORAGE_PROVIDER = 'S3'ENABLED = TRUESTORAGE_AWS_ROLE_ARN = 'arn:aws:iam::123456789012:role/snowflake_role'STORAGE_ALLOWED_LOCATIONS = ('s3://your-bucket/path/');
      
    • 为Snowflake的IAM角色添加KMS权限:
      {"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": "kms:Decrypt","Resource": "<KMS_KEY_ARN>"}]
      }
      
  2. 创建外部Stage并导入数据
    CREATE STAGE my_stageURL = 's3://your-bucket/path/'STORAGE_INTEGRATION = s3_intENCRYPTION = (TYPE = 'AWS_KMS' KMS_KEY_ID = '<KMS_KEY_ARN>');COPY INTO my_table
    FROM @my_stage
    FILE_FORMAT = (TYPE = PARQUET);
    

四、验证与故障排查

  1. EMR读写测试
    • 运行PySpark读取/写入S3路径,检查无权限错误。
  2. Snowflake导入测试
    • 执行COPY INTO命令后,检查COPY_HISTORY验证是否成功。
  3. 权限检查
    • 确认KMS密钥策略允许EMR角色和Snowflake角色的kms:Decrypt
    • 确保S3存储桶策略允许两者的访问。

五、注意事项

  • 区域一致性:确保KMS密钥、S3存储桶、EMR集群和Snowflake账户在同一AWS区域。
  • 客户端加密:若使用客户端加密(非SSE-KMS),需在PySpark中处理加解密逻辑,并确保Snowflake支持(需自定义解决方案,可能复杂)。
  • 密钥策略:KMS密钥的策略必须显式允许EMR和Snowflake的IAM角色使用密钥。

http://www.ppmy.cn/server/164276.html

相关文章

Vue3的el-table-column增加跳转其他页面

效果图 既不影响显示内容&#xff0c;也不影响页面跳转 el-table-column写法 <el-table-columnlabel"系统单号"align"center"prop"systematicReceipt"width"180" ><template #default"scope"><el-link t…

论文阅读(三):微阵列数据的图形模型和多变量分析

1.论文链接&#xff1a;Graphical Models and Multivariate Analysis of Microarray Data 摘要&#xff1a; 基因表达数据的通常分析忽略了基因表达值之间的相关性。从生物学上讲&#xff0c;这种假设是不合理的。本章介绍的方法允许通过稀疏高斯图形模型来描述基因之间的相关…

Flutter开发环境配置

下载 Flutter SDK 下载地址&#xff1a;https://docs.flutter.cn/get-started/install M1/M2芯片选择带arm64字样的Flutter SDK。 解压 cd /Applications unzip ~/Downloads/flutter_macos_arm64_3.27.3-stable.zip执行 /Applications/flutter/bin/flutterManage your Flut…

Springboot使用AOP时,需不需要引入AspectJ?

Springboot使用AOP时,需不需要引入AspectJ? 在Spring Boot中使用AOP时&#xff0c;是否需要引入AspectJ取决于你选择的具体AOP实现方式。以下是详细分步说明&#xff1a; 1. 默认场景&#xff1a;使用Spring AOP&#xff08;基于代理&#xff09; 不需要引入AspectJ依赖&am…

VScode+Latex (Recipe terminated with fatal error: spawn xelatex ENOENT)

使用VSCode编辑出现Recipe terminated with fatal error: spawn xelatex ENOENT问题咋办&#xff1f; 很好解决&#xff0c;大概率的原因是因为latex没有添加到系统环境变量中&#xff0c;所有设置的编译工具没有办法找到才出现的这种情况。 解决方法&#xff1a; winR 然后输…

大厂面试题备份20250130

20250130 RAG怎么做的&#xff0c;召回效果 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09; 是一种将信息检索与生成式模型&#xff08;如 GPT&#xff09;相结合的技术&#xff0c;旨在提升生成模型的答案质量&#xff0c;特别是在需要…

Linux《基础指令》

在之前的Linux《Linux简介与环境的搭建》当中我们已经初步了解了Linux的由来和如何搭建Linux环境&#xff0c;那么接下来在本篇当中我们就要来学习Linux的基础指令。在此我们的学习是包括两个部分&#xff0c;即指令和关于Linux的基础知识&#xff1b;因此本篇指令和基础知识的…

C++ 中的引用(Reference)

在 C 中&#xff0c;引用&#xff08;Reference&#xff09;是一种特殊的变量类型&#xff0c;它提供了一个已存在变量的别名。引用在很多场景下都非常有用&#xff0c;比如函数参数传递、返回值等。下面将详细介绍 C 引用的相关知识。 1. 引用的基本概念和语法 引用是已存在…