Как динамически загрузить чувствительное значение в процессор из указанного параметра в NiFi

У меня есть поток данных, в котором данные (пример ниже) извлекаются из концентратора событий Azure и отправляются в другие места назначения на основе destination_type. Для например s3

Пример примера:

{
    "client_name": "foo",
    "destination_type": "s3",
    "data": {
        "key1": "foo-value1",
        "key2": "foo-value2",
        "key3": "foo-value3"
    }
}
{
    "client_name": "bar",
    "destination_type": "s3",
    "data": {
        "key1": "bar-value1",
        "key2": "bar-value2",
        "key3": "bar-value3"
    }
}

Я могу получить это client_name и destination_type с помощью EvaluateJsonPath и сделать их атрибутами

Теперь, исходя из client_name и destination_type, мне нужно динамически настроить свойство процессоров.

Я планировал хранить кредиты в параметре с чувствительным значением и форматом вроде

CREDS_<client_name>_S3_ACCESSKEY = <Access Key ID>
CREDS_<client_name>_S3_SECRETACCESSKEY = <Secret Access Key>

Например. Для PutS3Object - Ковш, Access Key ID и Secret Access Key должен быть загружен на основе CLIENT_NAME

#{CREDS_${client_name}_S3_ACCESSKEY}
#{CREDS_${client_name}_S3_SECRETACCESSKEY}

Но это, похоже, не работает, может ли кто-нибудь предложить какой-либо альтернативный способ динамической загрузки чувствительного значения

2 ответа

Параметры разрешаются заранее, поэтому вы не можете использовать переменные для настройки имени параметра во время выполнения.

Кроме того, в документации предполагается, что PutS3Object не поддерживает параметры, а только реестр переменных (https://nifi.apache.org/docs/nifi-docs/components/org.apache.nifi/nifi-aws-nar/1.12.1/org.apache.nifi.processors.aws.s3.PutS3Object/index.html).

Параметры поддерживаются.

Итак, то, что вы пытаетесь сделать, в настоящее время невозможно.

Вместо этого вы можете создать PutS3Object для каждого клиента с их ключом в чувствительном поле, а затем использовать RouteOnAttribute в атрибуте client_name, чтобы перейти к правильному процессору. Не идеальный вариант, но это самый простой для построения процесс.

Эти атрибуты в реестре переменных поддержки PutS3Object, поэтому вы можете использовать комбинацию обновления реестра переменных во время его запуска (это может быть медленным).

Или используйте команду Execute streaming, чтобы передать ключ доступа и секретный ключ в среду выполнения S3 Put в качестве переменной env.

Что-то вроде этого:

         ExecuteStreamingCommand Procesor
  Command Path: /usr/bin/env
  Command Arguments: AWS_ACCESS_KEY_ID=${AccessKeyId} AWS_SECRET_ACCESS_KEY=${SecretAccessKey} aws s3 cp ${source_key} $(target_key)

Второй - взлом, но он работает:)

Другие вопросы по тегам