Expondo várias portas de dentro de um ManagedVM
Estou usando a funcionalidade de VM gerenciada para executar um servidor WebSocket que gostaria de expor à Internet em qualquer porta (de preferência a porta 80) por meio de uma URL como: mvm.mydomain.com
Ainda não estou tendo muito sucesso. Aqui estão as partes relevantes dos vários arquivos que estou usando para fazer isso:
Dockerfile:
EXPOSE 8080 8081
No final do Dockerfile, um aplicativo Python é iniciado: responde às verificações de integridade na porta 8080 (posso verificar se isso funciona) e responde às solicitações do WebSocket na porta 8081.
app.yaml:
module: mvm
version: 1
runtime: custom
vm: true
api_version: 1
network:
forwarded_ports: ["8081"]
Implantei este aplicativo na nuvem usando:
$ gcloud preview app deploy .
No console da nuvem, asseguro-me de que as portas TCP 8080 e 8081 sejam aceitas para o tráfego recebido. Também observo que o endereço IP atribuído à instância do GCE (mvm: 1) é: x.y.z.z.
$ curl http://x.y.z.z:8080/_ah/health
$ curl http://mvm.my-app-id.appspot.com/_ah/health
Reponha ambos com200 OK
.
A conexão do servidor WebSocket usando JavaScript também funciona:
new WebSocket('ws://x.y.z.z:8081');
Por enquanto, tudo bem. Exceto que isso não funcionou (tempo limite):
new WebSocket('ws://mvm.my-app-id.appspot.com:8081');
Gostaria de saber por que o comando WebSocket acima não funciona. Talvez algo que eu não entenda na interação de encaminhamento de porta do GAE / GCE?
Se isso pudesse funcionar de alguma forma, imagino que os seguintes passos seriam os últimos a concluir.
dispatch.yaml:
dispatch:
# Send all websocket traffic to the ManagedVM module.
- url: "mvm.mydomain.com/*"
module: mvm
Também configurei o domínio personalizado do GAE CNAME em mvm.mydomain.com.
A conexão do servidor WebSocket usando JavaScript deve funcionar como:
new WebSocket('ws://mvm.mydomain.com:8081');