Se você não usar HTTPS, o CloudFront retornará o erro 400 Bad Request
porque o Gateway da API não oferece suporte a HTTP.
Ao adicionar ssl verify none
habilita o HTTPS para o back-end, o CloudFront apenas fecha a conexão, fazendo com que o HAProxy registre o estado da sessão na desconexão como SC--
e retorna o erro 503 Service Unavailable
local.
A solução está, de fato, enviando o Server Name Identification (SNI). Caso contrário, o front-end do CloudFront não saberá qual certificado SSL oferecer a você - o certificado genérico *.cloudfront.net
curinga ou aquele para *.execute-api.ap-southeast-2.amazonaws.com
ou provavelmente uma dentre centenas de milhares de outras possibilidades. Isso é o que a SNI faz neste caso - diz ao servidor qual nome você está conectando.
A solução - esta é uma linha única, mostrada como várias linhas para maior clareza:
server api-gateway
xxxxx.execute-api.ap-southeast-2.amazonaws.com:443
ssl
verify none
sni str(xxxxx.execute-api.ap-southeast-2.amazonaws.com)
Você precisa usar a str()
string busca de amostra aqui, porque a sni
server keyword espera uma expressão de busca de amostra (para casos em que você queria usar o SNI da solicitação recebida, por exemplo).
O problema na pergunta no formulário não estava realmente relacionado ao SNI - essa parte da configuração estava correta. O problema foi que eles falharam em fazer o que você já fez corretamente - http-request set-header host ...
para que o CloudFront veja o cabeçalho Host:
correto.
Note também que o conselho no fórum de que esta é uma "idéia muito ruim" parece claramente equivocado. Ainda não estou usando o API Gateway em produção, mas isso é exatamente do jeito que vou fazer, quando faço isso.