Neste documento, explicamos como exibir conteúdo estático seguro do Cloud Storage usando o Cloud Run e o Identity-Aware Proxy.
O Cloud Run permite hospedar um servidor da Web que disponibiliza conteúdo estático de um bucket particular do Cloud Storage. A adição do IAP ajuda a proteger o serviço do Cloud Run, impedindo o acesso não autorizado e evitando a necessidade de recriar a imagem do contêiner quando o conteúdo muda.
A hospedagem de sites estáticos do Cloud Storage só exibe conteúdo público e exige
a concessão de acesso de leitura a allUsers. Se a organização restringe buckets públicos usando
políticas como prevenção de acesso público ou
compartilhamento restrito de domínio,
o recurso integrado de hospedagem de sites estáticos do Cloud Storage não está disponível.
Em vez disso, mantenha o bucket privado, implante um servidor da Web NGINX no Cloud Run
com o bucket montado como um volume e use o IAP para controlar o acesso ao
serviço do Cloud Run.
Antes de começar
Para seguir as instruções deste documento, você precisa do seguinte:
Um projeto do Google Cloud com o faturamento ativado. Acessar o console do Google Cloud
Um bucket particular do Cloud Storage que contém seus arquivos estáticos (por exemplo,
index.html, CSS e imagens). Verifique se o bucket não é público.A Google Cloud CLI instalada.
Conceder acesso ao bucket do Cloud Storage
O Cloud Run precisa de permissão para ler arquivos do seu bucket privado do Cloud Storage. É preciso conceder à identidade de serviço do Cloud Run
o papel de Leitor de objetos do Storage (roles/storage.objectViewer) no bucket.
Recomendamos que você use uma conta de serviço gerenciado pelo usuário para o serviço do Cloud Run, em vez da conta de serviço padrão do Compute Engine.
Crie uma conta de serviço para usar como identidade de serviço:
gcloud iam service-accounts create RUN_SERVICE_ACCOUNT \ --description="Service account for Cloud Run serving Cloud Storage" \ --display-name="Cloud Run Cloud Storage Reader"Conceda à conta de serviço o papel de Leitor de objetos do Storage (
roles/storage.objectViewer) no bucket:gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member="serviceAccount:RUN_SERVICE_ACCOUNT@PROJECT_ID." \ --role="roles/storage.objectViewer"
Implantar o serviço do Cloud Run
Implante o servidor da Web NGINX no Cloud Run e monte o bucket do Cloud Storage. Use o ambiente de execução de segunda geração para oferecer suporte a montagens de volume.
Para montar o bucket, implante o serviço com flags de volume:
gcloud run deploy SERVICE_NAME \
--image=nginx \
--port=80 \
--execution-environment=gen2 \
--service-account=RUN_SERVICE_ACCOUNT@PROJECT_ID. \
--add-volume=name=static,type=cloud-storage,bucket=BUCKET_NAME,readonly=true \
--add-volume-mount=volume=static,mount-path=/usr/share/nginx/html \
--no-allow-unauthenticated
Substitua:
SERVICE_NAME: o nome do serviço do Cloud Run.RUN_SERVICE_ACCOUNT: a conta de serviço que você criou na etapa anterior.PROJECT_ID: o ID do projeto do Google Cloud .BUCKET_NAME: o nome do bucket do Cloud Storage
O bucket é montado em /usr/share/nginx/html, que é o diretório padrão
em que o NGINX procura recursos estáticos. Isso significa que os arquivos no
bucket são mapeados diretamente para o caminho raiz do serviço. Por exemplo, um arquivo
armazenado em gs://BUCKET_NAME/index.html pode ser acessado em https://SERVICE_URL/index.html.
Para verificar a implantação, confira se o serviço bloqueia o acesso não autenticado
e retorna um status 403 Forbidden quando acessado sem credenciais:
curl -I SERVICE_URL
Como alternativa, é possível testar se o contêiner está renderizando corretamente os arquivos do bucket privado do Cloud Storage antes de configurar o acesso do IAP. Para isso, execute o comando a seguir para enviar uma solicitação autenticada usando suas credenciais de desenvolvedor:
curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" SERVICE_URL
Substitua SERVICE_URL pelo URL do serviço do Cloud Run.
Ativar o IAP
Depois de implantar o serviço do Cloud Run, é possível ativar o IAP para protegê-lo.
Recomendamos que você ative o IAP diretamente no serviço do Cloud Run. Para instruções, consulte Configurar o IAP para o Cloud Run.
Como alternativa, se você usar um balanceador de carga HTTPS externo na frente do serviço do Cloud Run, será possível ativar o IAP no serviço de back-end. Para instruções, consulte Ativar o IAP em um serviço de back-end ou balanceador de carga.
Armazenamento em cache e desempenho
Quando você usa montagens de volume do Cloud Storage, cada arquivo lido pelo Cloud Run é convertido em uma chamada de API do Cloud Storage. Para minimizar a latência e os custos da API, configure o armazenamento em cache no servidor da Web (por exemplo, usando diretivas de armazenamento em cache do NGINX) ou configure as opções de montagem do Cloud Storage FUSE.
Se você usar um balanceador de carga HTTPS externo, também poderá ativar o Cloud CDN no serviço de back-end. O IAP não é compatível com o Cloud CDN no mesmo serviço de back-end. Portanto, talvez seja necessário estruturar sua arquitetura de acordo com isso se você precisar de ambos.
Limitações
A leitura de arquivos de uma montagem de volume do Cloud Storage pode ser mais lenta do que o acesso a um sistema de arquivos local. Para reduzir a latência de leitura, configure o armazenamento em cache.
Outros casos de uso
Também é possível usar montagens de volume do Cloud Storage para outros cenários:
Funções orientadas a eventos: uma função lê os arquivos enviados diretamente do sistema de arquivos.
Aplicativos de IA generativa: um aplicativo carrega um banco de dados vetorial (como o Chroma) de um bucket do Cloud Storage usando leituras padrão do sistema de arquivos.
Alternativa: como montar volumes NFS
Se os arquivos estiverem armazenados no Filestore ou em um servidor NFS auto-hospedado, será possível montar volumes NFS no serviço do Cloud Run, em vez de buckets do Cloud Storage. Para mais informações, consulte Como montar volumes NFS.