Можно ли использовать шифрование CSE с использованием KMS для расшифровки данных в кластере EMR? - PullRequest
0 голосов
/ 05 мая 2019

У нас есть кластер EMR, и он уже создан (с использованием шифрования SSE по умолчанию). Нам нужно использовать тот же кластер для обработки данных из s3, которые зашифрованы с использованием CSE. Можем ли мы динамически использовать KMS для расшифровки тех исходных файлов s3 (которые зашифрованы с использованием CSE) в EMR? Мы используем pyspark для обработки данных.

Мы можем создать новый кластер EMR с использованием CSE, но нам нужно использовать тот же кластер (с SSE) для обработки данных с поддержкой CSE в s3.

sc=spark.sparkContext
sc._jsc.hadoopConfiguration().set("com.amazon.odinKms.defaultMaterialSetName",\
    "Name of the material set")
sc._jsc.hadoopConfiguration().set("fs.s3.cse.encryptionMaterialsProvider.uri",\
    "s3 path to jar for the provider")
sc._jsc.hadoopConfiguration().set("com.amazon.odinKms.keyRingBucketName","s3 bucket name")
sc._jsc.hadoopConfiguration().set("fs.s3.cse.encryptionMaterialsProvider",\
    "com.amazon.s3.encryption.provider.EmrEncryptionMaterialsProvider")
sc._jsc.hadoopConfiguration().set("com.amazon.odinKms.kmsKeyRegion","us-east-1")
sc._jsc.hadoopConfiguration().set("com.amazon.odinKms.debugConfig","false")
sc._jsc.hadoopConfiguration().set("com.amazon.odinKms.kmsKeyId","XXXXXXXXXXXXXXXXXXXXXXXX")
sc._jsc.hadoopConfiguration().set("fs.s3.cse.enabled","true")
sc._jsc.hadoopConfiguration().set("com.amazon.odinKms.keyRingPrefix","keyring/")
rdd_mdb_table = sc.textFile(src_s3_path,40)
rdd_mdb_table.take(1)

Невозможно прочитать файл, так как не удалось расшифровать. Значения свойств можно считать точными, поскольку мы используем то же свойство в другой конфигурации кластера EMR, которая создается с использованием конфигурации с поддержкой CSE.

Фактический результат:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/spark/python/pyspark/rdd.py", line 1313, in take
    totalParts = self.getNumPartitions()
  File "/usr/lib/spark/python/pyspark/rdd.py", line 385, in getNumPartitions
    return self._jrdd.partitions().size()
  File "/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/java_gateway.py", line 1133, in __call__
  File "/usr/lib/spark/python/pyspark/sql/utils.py", line 63, in deco
    return f(*a, **kw)
  File "/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py", line 319, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o201.partitions.
: com.amazon.ws.emr.hadoop.fs.shaded.com.google.inject.ProvisionException: Guice provision errors:

1) Error in custom provider, java.lang.IllegalArgumentException: EncryptionMaterialsProvider not found: com.amazon.s3.encryption.provider.EmrEncryptionMaterialsProvider
  at com.amazon.ws.emr.hadoop.fs.guice.EmrFSBaseModule.provideAmazonS3Lite(EmrFSBaseModule.java:99)
  at com.amazon.ws.emr.hadoop.fs.guice.EmrFSBaseModule.provideAmazonS3Lite(EmrFSBaseModule.java:99)
  while locating com.amazon.ws.emr.hadoop.fs.s3.lite.AmazonS3Lite
    for field at com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem.s3(S3NativeFileSystem.java:65)
  while locating com.amazon.ws.emr.hadoop.fs.s3n.S3NativeFileSystem
  while locating org.apache.hadoop.fs.FileSystem annotated with @com.amazon.ws.emr.hadoop.fs.shaded.com.google.inject.name.Named(value=s3n)
Caused by: java.lang.IllegalArgumentException: EncryptionMaterialsProvider not found: com.amazon.s3.encryption.provider.EmrEncryptionMaterialsProvider
        at com.amazon.ws.emr.hadoop.fs.util.ConfigurationUtils.getEncryptionMaterialsProviderClass(ConfigurationUtils.java:308)
        at com.amazon.ws.emr.hadoop.fs.util.ConfigurationUtils.getEncryptionMaterialsProvider(ConfigurationUtils.java:295)
...
...