Как зашифровать переменные при использовании воздушного потока EmrAddStepsOperator? - PullRequest
0 голосов
/ 12 июля 2019

У меня есть Airflow DAG, которая запускает кластер AWS EMR для выполнения шагов. На DAG мы передаем некоторые переменные, которые установлены в переменных воздушного потока. Но некоторые из этих переменных зашифрованы в Airflow, но при переходе к EMR мы можем ясно видеть это на консоли EMR. Есть ли способ это скрыть?

Вот как мы определяем шаг. Переменная воздушного потока db_pass должна быть зашифрована или как-то скрыта

    {
        "Name": "EMR JOB",
        "ActionOnFailure": "CONTINUE",
        "HadoopJarStep": {
            "Jar": "command-runner.jar",
            "Args": [
                "{{var.value.job_script}}",
                "--database_user={{var.value.db_user}}",
                "--database_pass={{var.value.db_pass}}"
            ]
        }
    }
]

Этот SAMPLE_STEP_DEFINITION затем передается как EmrAddStepsOperator:

...

sample_task = EmrAddStepsOperator(
    steps=SAMPLE_STEP_DEFINITION,

...

1 Ответ

1 голос
/ 12 июля 2019

Есть несколько способов сделать это. Сначала я бы предложил зашифровать пароли с помощью KMS. Вот код , как это сделать:

    def encryptString(plainText: String, keyArn: String): String = {
        val req = new EncryptRequest().withKeyId(keyArn).withPlaintext(ByteBuffer.wrap(plainText.getBytes))
        Base64.getEncoder.encodeToString(kmsClient.encrypt(req).getCiphertextBlob.array())
    }

    def decryptString(encryptedText: String, keyArn: String): String = {
        val req = new DecryptRequest().withCiphertextBlob(ByteBuffer.wrap(Base64.getDecoder.decode(encryptedText)))
        new String(kmsClient.decrypt(req).getPlaintext.array())
    }

Вам просто нужно приложить разрешение на расшифровку к EMR_EC2_DefaultRole. Другой способ - передать файл конфигурации, хранящийся на S3, с паролем.

...