当前位置: 首页 > article >正文

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

现有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>
      
    • 或在代码中设置:
      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_int
        TYPE = EXTERNAL_STAGE
        STORAGE_PROVIDER = 'S3'
        ENABLED = TRUE
        STORAGE_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_stage
      URL = 's3://your-bucket/path/'
      STORAGE_INTEGRATION = s3_int
      ENCRYPTION = (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.kler.cn/a/525972.html

相关文章:

  • 【Rust自学】15.1. 使用Box<T>智能指针来指向堆内存上的数据
  • 安卓(android)读取手机通讯录【Android移动开发基础案例教程(第2版)黑马程序员】
  • ASP.NET代码审计 SQL注入篇(简单记录)
  • 51单片机开发:串口通信
  • 计算机网络 IP 网络层 2 (重置版)
  • 设计模式-建造者模式、原型模式
  • Python GUI 开发 | PySide6 PyQt6 学习手册
  • C语言练习(31)
  • 9.进程间通信
  • 后端token校验流程
  • Mono里运行C#脚本37—mono_compile_create_vars函数
  • Spring Boot - 数据库集成07 - 数据库连接池
  • DeepSeek 云端部署,释放无限 AI 潜力!
  • ​‌马尔可夫决策过程-笔记
  • 基于微信小程序的医院预约挂号系统设计与实现(LW+源码+讲解)
  • Python中的函数(下)
  • Node.js 的底层原理
  • 【Node.js】Koa2 整合接口文档
  • 付费进群阿泽魔改源码 跳转不卡顿
  • 剑指 Offer II 009. 乘积小于 K 的子数组
  • HarmonyOS应用开发快速入门
  • 一种用于低成本水质监测的软传感器开源方法:以硝酸盐(NO3⁻)浓度为例
  • 知识管理系统塑造企业文化与学习型组织的变革之路
  • 再写最长上升子序列(简单dp)
  • Python 列表(组织列表)
  • linux——进程树的概念和示例