Как динамически загрузить чувствительное значение в процессор из указанного параметра в 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)
Второй - взлом, но он работает:)