在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文件
    • 上传文件时设置加密头:

      bash 复制代码
      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)附加以下策略:

      json 复制代码
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "kms:Decrypt",
                      "kms:Encrypt",
                      "kms:GenerateDataKey"
                  ],
                  "Resource": "<KMS_KEY_ARN>"
              }
          ]
      }
  2. PySpark配置

    • spark-defaults.conf中添加:

      properties 复制代码
      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中创建或更新存储集成对象:

      sql 复制代码
      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权限:

      json 复制代码
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "kms:Decrypt",
                  "Resource": "<KMS_KEY_ARN>"
              }
          ]
      }
  2. 创建外部Stage并导入数据

    sql 复制代码
    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角色使用密钥。
相关推荐
小徐敲java1 小时前
python使用s7协议与plc进行数据通讯(HslCommunication模拟)
开发语言·python
猫头虎1 小时前
如何解决 pip install 编译报错 fatal error: hdf5.h: No such file or directory(h5py)问题
人工智能·python·pycharm·开源·beautifulsoup·ai编程·pip
p***23361 小时前
python的sql解析库-sqlparse
数据库·python·sql
陈奕昆1 小时前
n8n实战营Day3:电商订单全流程自动化·需求分析与流程拆解
大数据·开发语言·人工智能·自动化·需求分析·n8n
陈奕昆1 小时前
n8n实战营Day1课时3:高频节点解析+Webhook表单同步Excel实操
人工智能·python·n8n
深蓝电商API2 小时前
动态 Token、加密参数逆向全流程:从原理到实战破解
爬虫·python
qq_17082750 CNC注塑机数采2 小时前
【Python TensorFlow】 TCN-GRU时间序列卷积门控循环神经网络时序预测算法(附代码)
python·rnn·神经网络·机器学习·gru·tensorflow·tcn
java1234_小锋2 小时前
基于Python深度学习的车辆车牌识别系统(PyTorch2卷积神经网络CNN+OpenCV4实现)视频教程 - 切割车牌矩阵获取车牌字符
python·深度学习·cnn·车牌识别
semantist@语校2 小时前
第五十一篇|构建日本语言学校数据模型:埼玉国际学院的城市结构与行为变量分析
java·大数据·数据库·人工智能·百度·ai·github
赵渝强老师2 小时前
【赵渝强老师】阿里云大数据集成开发平台DataWorks
大数据·阿里云·云计算