Do ponto de vista da conexão, "algo" precisa responder às suas solicitações (GET, POST, PUT, tudo). Primeiro de tudo, você tem uma conexão TCP e "algo" precisa ter certeza de que está entendendo a camada 7 e fazendo sentido com os bytes que o cliente está enviando. Somente neste momento é possível lidar com solicitações GET de maneira diferente das solicitações POST ou com um URL que outro URL. Portanto, no final, você precisa de um serviço capaz de entender e encaminhar o HTTP. Os seguintes serviços são capazes de fazer isso: Gateway de API CloudFront ELB / ALB (a limitação vem depois)
O API Gateway usa o CloudFront internamente (sem dar a você a chance de realmente configurar qualquer coisa no nível do CloudFront) - isso significa que não há como executar o CloudFront e o API Gateway lado a lado, pois no final isso significa que você executa o CloudFront com o CloudFront lado a lado.
O CloudFront oferece a chance de selecionar origens diferentes com base em padrões - mas você só pode selecionar S3 ou ELB / ALBs como origem - não as funções Lambda (além da funcionalidade Lambda @ Edge).
O ALB / ELB pode usar apenas instâncias do EC2 como back-end - sem Lambda ou S3 aqui.
As únicas maneiras pelas quais consigo pensar que podem fazer o que você quer fazer são:
- Você usa o API Gateway e roteia um caminho específico de "ativo" para uma função do Lambda que faz um tipo de proxy reverso para o S3 (canalizando os ativos estáticos pelo lambda) - esteja ciente dos custos do Lambda aqui!
- Você pode fazer o mesmo, mas, em vez de canalizar o recurso pelo Lambda, basta gerar um URL assinado no Lambda e redirecionar diretamente para o S3 para veiculação (pode ser mais econômico)
- Usando subdomínios diferentes para seus ativos do que o restante do aplicativo - esse é um padrão muito comum, pois você pode facilmente dividir no nível DNS e usar serviços diferentes para os diferentes casos de uso (CloudFront para ativos e API Gateway para os não estáticos) partes)
Portanto, minha ligação seria a última opção - mas isso significa que você precisa apontar os clientes / navegadores para um subdomínio separado para todos os ativos estáticos (ou para todas as solicitações POST).
Parece que você deseja dar uma olhada em tecnologias como AngularJS ou React para criar um aplicativo verdadeiramente orientado a API no navegador. Com essa abordagem, você está executando uma API real, que lida com todas as solicitações "dinâmicas" com um Gateway de API e entrega o próprio aplicativo do S3 como um ativo estático. Talvez olhar para eles possa ajudá-lo a encontrar o caminho - mesmo que você não os use, o padrão arquitetural de como construir coisas como esta é o que você está pedindo.