Поддерживает ли AWS Lambda / Firehose декодирование URL-адресов Base64?

Мой конвейер выглядит следующим образом:

Firehose -> Lambda (Java SDK AWS) -> (S3 и Redshift)

Незакодированная (необработанная) запись JSON отправляется в Firehose. Затем он запускает лямбда-функцию, которая его немного преобразует. Затем Firehose помещает преобразованную запись в корзину S3 и Redshift.

Чтобы Firehose добавлял преобразованные данные в S3, необходимо, чтобы данные были закодированы в Base64 (и Firehose декодирует их перед добавлением в S3).

Однако у меня есть URL-адрес в данных, который при декодировании = символы заменяются их эквивалентным символом Unicode (\u003d), поскольку это символ, который декодер Amazon Base64 использует в качестве заполнения.

https://www.[snipped].com/...?returnurl \ u003dnull \ u0026referrer \ u003dnull

Как я могу сохранить эти = символа в декодированных данных?

Примечание. Я пробовал использовать Base64.getUrlEncoder(), но AWS, похоже, поддерживает только Base64.getEncoder().


person Jacob G.    schedule 17.07.2018    source источник
comment
И вы уверены, что это не просто артефакт того, как вы отображаете данные?   -  person Michael - sqlbot    schedule 18.07.2018
comment
@ Michael-sqlbot, я уверен; Я загрузил файл S3 и открыл его с помощью множества различных текстовых редакторов (все из которых были настроены на UTF-8), но все они заменяют = на \u003d. Интересно, что запись S3 также добавляется в Redshift через Firehose, а Redshift действительно показывает символ =.   -  person Jacob G.    schedule 18.07.2018
comment
Вы сказали Firehose - ›S3, но также и Firehose -› Lambda - ›S3. Мне неясно, какую роль может играть лямбда-код, но, похоже, это наиболее вероятное подозрение. \u003d не эквивалентен = в текстовом файле utf-8, но он находится в JSON, и, конечно же, интерфейсом Lambda всегда является JSON (хотя это не имеет значения, если входящие и исходящие данные всегда представлены в base64). На самом деле я недостаточно хорошо понимаю вашу настройку, чтобы знать, является ли это полезным предположением с моей стороны.   -  person Michael - sqlbot    schedule 18.07.2018
comment
@ Michael-sqlbot Прошу прощения за то, что не объяснил лучше. Незакодированная (необработанная) запись JSON отправляется в Firehose. Затем он запускает лямбда-функцию, которая его немного преобразует. Затем Firehose помещает преобразованную запись в корзину S3 и Redshift. Надеюсь, это поможет немного прояснить ситуацию!   -  person Jacob G.    schedule 18.07.2018


Ответы (1)


Оказывается, экранирование HTML было включено в библиотеке JSON (Gson), которую я использовал при (де) сериализации моей записи Lambda. Чтобы исправить это, мне просто нужно было отключить экранирование HTML:

new GsonBuilder().disableHtmlEscaping().create();
person Jacob G.    schedule 18.07.2018