Acho que acompanhei de perto a documentação e os tutoriais que encontrei até agora, mas ainda assim consigo fazer isso funcionar. Eu simplesmente não consigo convencer a AWS a não tocar nos dados binários que estou postando no corpo.
No meu aplicativo, estou definindo os cabeçalhos Content-Type e Accept da solicitação da API original para application / x-msgpack, que defini como um tipo de mídia binário em Suporte binário:
Eunãodefininadanasolicitaçãodemétodo:

Nasolicitaçãodeintegração,nãoativeioproxyehabiliteiapassagemdocorpodasolicitação:

EuhabiliteioslogsdoCloudWatchparaaexecuçãodoGatewaydeAPIevejoqueaAWSaindaestácodificandonabase64meusdadosbinários:
17:30:29Startingexecutionforrequest:...17:30:29HTTPMethod:POST,ResourcePath:/...17:30:29Methodrequestpath:{}17:30:29Methodrequestquerystring:{}17:30:29Methodrequestheaders:{Accept=application/x-msgpack,Content-Type=application/x-msgpack,...}17:30:29Methodrequestbodybeforetransformations:[BinaryData]17:30:29EndpointrequestURI:https://...17:30:29Endpointrequestheaders:{Accept=application/x-msgpack,...[TRUNCATED-Idon'tseetherestoftheheaders]}17:30:29Endpointrequestbodyaftertransformations:[Base-64encodedbinarydata]17:30:29Sendingrequesttohttps://...ObservequeoscabeçalhosdesolicitaçãodeterminalforamtruncadosnoslogsdoCloudWatch(nãoostruncouparaessapergunta).Portanto,nãovejoqualéocabeçalhoContent-Type.
Observeaslinhascom"Corpo da solicitação do método antes das transformações" e "Corpo da solicitação do terminal após as transformações". Por que ainda estaria transformando os dados binários para base-64?
As fontes que usei até agora são:
Eu verifiquei a configuração de integração por meio do AWS CLI e entendi:
> aws apigateway get-integration \
--rest-api-id ... \
--resource-id ... \
--http-method POST
{
"integrationResponses": {
"200": {
"selectionPattern": "",
"statusCode": "200"
}
},
"contentHandling": "CONVERT_TO_TEXT",
"cacheKeyParameters": [],
"uri": "...",
"httpMethod": "POST",
"passthroughBehavior": "WHEN_NO_TEMPLATES",
"cacheNamespace": "...",
"type": "AWS"
}
Percebi o "contentHandling": "CONVERT_TO_TEXT" bit e tentei substituí-lo por "" (valor vazio, que por sua vez removeu a propriedade completamente) e "CONVERT_TO_BINARY" fazendo:
> aws apigateway update-integration \
--rest-api-id ... \
--resource-id ... \
--http-method POST \
--patch-operations '[{"op":"replace","path":"/contentHandling","value":""}]'
Agora vejo a solicitação de terminal sendo preservada como binária:
10:32:21 Endpoint request body after transformations: [Binary Data]
No entanto, recebo este erro:
10:32:21 Endpoint response body before transformations: {"Type":"User","message":"Could not parse request body into json: Unexpected character ((CTRL-CHAR, code 129))...
E eu não recebo nenhuma atividade nos registros do CloudWatch para minha função do Lambda. E minha função Lambda não é aquela tentando analisar os dados recebidos como JSON. Portanto, ainda em algum lugar ao longo do caminho de integração API-Lambda, os dados estão sendo analisados como JSON, em vez de serem deixados sozinhos como binários.