Saiba como implantar um aplicativo Rails de exemplo no Cloud Run e como integrar bancos de dados gerenciados, armazenamento de objetos, secrets criptografados e pipelines de compilação com computação sem servidor.
A implantação de aplicativos do Rails envolve a integração de vários serviços para formar um projeto coeso. Para usar este tutorial, é necessário ter familiaridade com o desenvolvimento da Web com Rails.
Este tutorial requer o Ruby 3.0 ou mais recente e o Rails 8 ou mais recente.
Objetivos
- Criar e conectar um banco de dados do Cloud SQL ao Active Record
- Criar e usar o Secret Manager para armazenar e acessar uma chave mestra do Rails com segurança
- Hospedar mídia e arquivos enviados pelo usuário do Active Storage no Cloud Storage
- Usar o Cloud Build para automatizar migrações de builds e bancos de dados
- Implantar um app Rails no Cloud Run
Custos
Antes de começar
- Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a gcloud CLI, execute o seguinte comando:
gcloud init -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
Instale a CLI do Google Cloud.
-
Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.
-
Para inicializar a gcloud CLI, execute o seguinte comando:
gcloud init - Verifique se as permissões suficientes estão disponíveis para a conta usada neste tutorial.
Preparar o ambiente
Neste tutorial, usamos vários serviços do Google Cloud para fornecer o banco de dados, o armazenamento de mídia e o armazenamento de secrets compatíveis com o aplicativo Rails implantado. Prepare seu ambiente configurando uma região para implantar os serviços e clonando o app Rails.
Definir o projeto e a região padrão
Defina a configuração padrão do projeto para a CLI gcloud executando o seguinte comando:
gcloud config set project PROJECT_IDSubstitua
PROJECT_IDpelo ID do projeto Google Cloud.Configure sua região:
export REGION=REGIONSubstitua
REGIONpor um local adequado. Para eficiência entre serviços, todos eles precisam ser implantados na mesma região. Para mais informações sobre a região mais próxima de você, consulte Produtos disponíveis por local.
Clonar o app Rails
O código do app de exemplo Rails está no repositório
GoogleCloudPlatform/ruby-docs-samples
no GitHub.
Clone o repositório:
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.gitAcesse o diretório com o exemplo de código e execute os seguintes comandos para garantir que o aplicativo esteja configurado corretamente com gems e dependências necessárias:
Linux/macOS
cd ruby-docs-samples/run/rails bundle installWindows
cd ruby-docs-samples\run\rails bundle install
Preparar os serviços de apoio
Neste tutorial, usamos vários serviços do Google Cloud para fornecer o banco de dados, o armazenamento de mídia e o armazenamento de secrets compatíveis com o projeto Rails implantado. Esses serviços são implantados em uma região específica. Para a eficácia entre serviços, é melhor que todos os serviços sejam implantados na mesma região. Para mais informações sobre a região mais próxima de você, consulte Produtos disponíveis por local.
Configurar uma instância do Cloud SQL para PostgreSQL
O Rails é compatível com vários bancos de dados relacionais, incluindo vários oferecidos pelo Cloud SQL. Neste tutorial, usamos o PostgreSQL, um banco de dados de código aberto muito usado por apps Rails.
Nas seções a seguir, descrevemos como criar uma instância, banco de dados e usuário de banco de dados do PostgreSQL para seu app Rails.
Criar uma instância do PostgreSQL
Console
No console Google Cloud , acesse a página Instâncias do Cloud SQL.
Clique em Criar instância.
Clique em Escolher PostgreSQL.
No campo ID da instância, digite um nome para a instância (
INSTANCE_NAME).No campo Senha, insira uma senha para o usuário postgres.
Use os valores padrão dos outros campos.
Clique em Criar instância.
gcloud
Crie a instância do PostgreSQL:
gcloud sql instances create INSTANCE_NAME \ --database-version POSTGRES_12 \ --tier db-f1-micro \ --region REGIONSubstitua:
INSTANCE_NAME: o novo nome da instância do Cloud SQLREGION: a regiãoGoogle Cloud
A instância leva alguns minutos para ser criar e para estar pronta para uso.
Crie um banco de dados
Console
No console Google Cloud , acesse a página Instâncias do Cloud SQL.
Selecione a instância INSTANCE_NAME.
Acesse a guia Bancos de dados.
Clique em Create database.
Na caixa de diálogo Nome do banco de dados, insira
DATABASE_NAME.Clique em Criar.
gcloud
Crie o banco de dados na instância recém-criada:
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAMESubstitua
DATABASE_NAMEpor um nome para o banco de dados dentro da instância.
Criar um usuário
Gere uma senha aleatória para o usuário do banco de dados e grave-a em um arquivo chamado dbpassword:
cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1 > dbpassword
Console
No console Google Cloud , acesse a página Instâncias do Cloud SQL.
Selecione a instância INSTANCE_NAME.
Acesse a guia Usuários.
Clique em Adicionar conta de usuário.
Na caixa de diálogo Autenticação integrada:
- Digite o nome de usuário
DATABASE_USERNAME. - Insira o conteúdo do arquivo
dbpasswordcomo a senhaPASSWORD.
- Digite o nome de usuário
Clique em Adicionar.
gcloud
Crie o usuário na instância recém-criada e defina a senha como o conteúdo do dbpassword:
gcloud sql users create DATABASE_USERNAME \ --instance=INSTANCE_NAME --password=$(cat dbpassword)Substitua
DATABASE_USERNAMEpor um nome para o usuário dentro da instância.
Configurar um repositório do Artifact Registry
Use o Artifact Registry para criar um repositório e armazenar a imagem do contêiner.
Console
No console do Google Cloud , acesse a página Artifact Registry.
Clique em Criar repositório.
Digite o seguinte:
- Em Nome, digite "cloud-run-source-deploy".
- Em Formato, selecione "Docker".
- Em Região, selecione REGION.
Mantenha os valores padrão dos outros campos.
Clique em Criar.
gcloud
Crie um repositório do Artifact Registry:
gcloud artifacts repositories create cloud-run-source-deploy \ --repository-format docker \ --location REGION
Configurar um bucket do Cloud Storage
É possível usar o Cloud Storage para hospedar recursos estáticos e mídia do Rails enviados pelo usuário em um armazenamento de objeto altamente disponível.
Console
- No console do Google Cloud , acesse a página Buckets do Cloud Storage.
- Clique em Criar.
- Na página Criar um bucket, insira as informações do seu bucket. Para ir à próxima
etapa, clique em Continuar.
-
Na seção Começar, faça o seguinte:
- Insira um nome globalmente exclusivo que atenda aos requisitos de nomeação de bucket.
- Para adicionar um
rótulo de bucket,
abra a seção Rótulos (),
clique em add_box
Adicionar rótulo e especifique um
keye umvaluepara o rótulo.
- Em Local, selecione o seguinte: us-central1
-
Na seção Escolha como armazenar seus dados, faça o seguinte:
- Na seção Definir uma classe padrão, selecione o seguinte: Padrão.
- Para ativar o namespace hierárquico, na seção Otimizar o armazenamento para cargas de trabalho com uso intensivo de dados, selecione Ativar namespace hierárquico neste bucket.
- Na seção Escolha como controlar o acesso a objetos, selecione se o bucket aplica ou não a prevenção de acesso público e selecione um método de controle de acesso para os objetos do bucket.
-
Na seção Escolha como proteger os dados do objeto, faça o
seguinte:
- Selecione qualquer uma das opções em Proteção de dados que
você quer definir para o bucket.
- Para ativar a exclusão reversível, clique na caixa de seleção Política de exclusão reversível (para recuperação de dados) e especifique o número de dias que você quer reter os objetos após a exclusão.
- Para definir o controle de versões de objetos, clique na caixa de seleção Controle de versões de objetos (para controle de versões) e especifique o número máximo de versões por objeto e o número de dias após os quais as versões não atuais expiram.
- Para ativar a política de retenção em objetos e buckets, clique na caixa de seleção Retenção (para compliance) e faça o seguinte:
- Para ativar o bloqueio de retenção de objetos, clique na caixa de seleção Ativar retenção de objetos.
- Para ativar o Bloqueio de buckets, clique na caixa de seleção Definir política de retenção de buckets e escolha uma unidade e um período de armazenamento para a retenção.
- Para escolher como os dados do objeto serão criptografados, expanda a seção Criptografia de dados () e selecione um método de Criptografia de dados.
- Selecione qualquer uma das opções em Proteção de dados que
você quer definir para o bucket.
-
Na seção Começar, faça o seguinte:
- Clique em Criar.
gcloud
Criar um bucket do Cloud Storage. Para criar um nome exclusivo de bucket do Cloud Storage, use PROJECT_ID e um sufixo de sua escolha,
MEDIA_BUCKET_SUFFIX. No Cloud Storage, os nomes de buckets precisam ser exclusivos globalmente.gcloud storage buckets create gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX \ --location=REGION
Depois de criar um bucket, para tornar públicas as imagens enviadas, altere as permissões dos objetos de imagem para que possam ser lidas por todos.
Console
- No console do Google Cloud , acesse a página Buckets do Cloud Storage.
Na lista de buckets, clique no nome do bucket que você quer tornar público.
Selecione a guia Permissões na parte superior da página.
Clique no botão Adicionar membros.
A caixa de diálogo Adicionar membros é exibida.
No campo Novos membros, insira
allUsers.No campo Selecionar uma função, selecione o submenu Cloud Storage e clique na opção Visualizador do objeto de armazenamento.
Clique em Salvar.
Depois que o intervalo for compartilhado publicamente, aparecerá um ícone de link para cada objeto na coluna de acesso público. Clique nesse ícone para ver o URL do objeto.
Para saber como acessar informações detalhadas de erro sobre operações do Ruby com falha no Google Cloud console, consulte Solução de problemas.
gcloud
Use o comando
gcloud storage buckets add-iam-policy-bindingpara tornar todos os objetos públicos. Use o valor deMEDIA_BUCKET_SUFFIXque você usou ao criar o bucket.gcloud storage buckets add-iam-policy-binding gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX \ --member=allUsers --role=roles/storage.objectViewer
Armazenar valores do secret no Secret Manager
Agora que os serviços de backup estão configurados, o Rails precisa de informações seguras, como senhas, para acessar esses serviços. Em vez de colocar esses valores diretamente no código-fonte do Rails, este tutorial usa o Rails Credentials e o Secret Manager para armazenar essas informações com segurança.
Criar um arquivo de credenciais criptografado e armazenar a chave como secret do Secret Manager
O Rails armazena secrets em um arquivo criptografado chamado "config/credentials.yml.enc".
O arquivo pode ser descriptografado com o local config/master.key ou a variável
de ambiente ENV["RAILS_MASTER_KEY"]. Nesse arquivo, é possível armazenar
a senha do banco de dados da instância do Cloud SQL e outras chaves de acesso para APIs externas.
É possível armazenar essa chave com segurança no Secret Manager. Em seguida, conceda ao Cloud Run e ao Cloud Build acesso à chave que permite acessar as respectivas contas de serviço. As contas de serviço são identificadas por um endereço de e-mail que contém o número do projeto.
Gere o arquivo
config/credentials.yml.enccom o seguinte comando:bin/rails credentials:editO comando criará um
config/master.keyse nenhuma chave mestra for definida, e um arquivoconfig/credentials.yml.encse o arquivo não existir. Um arquivo temporário será aberto no$EDITORpadrão com o conteúdo descriptografado para adicionar os secrets.Copie e cole a senha do banco de dados da instância PostgreSQL recém-criada do arquivo
dbpasswordno arquivo de credenciais:secret_key_base: GENERATED_VALUE gcp: db_password: PASSWORDOs secrets podem ser acessados com
Rails.application.credentials. Por exemplo,Rails.application.credentials.secret_key_baseretorna a base da chave secreta do aplicativo eRails.application.credentials.gcp[:db_password]retorna a senha do banco de dados.O
config/credentials/yml.encé armazenado criptografado, masconfig/master.keypode ser armazenado no Secret Manager.Console
No console do Google Cloud , acesse a página do Secret Manager.
Clique em Criar secret.
No campo Nome, insira um nome para o secret
RAILS_SECRET_NAME.Na caixa de diálogo Valor secreto, cole o valor mater.key na caixa.
Clique em Criar secret.
Na página "Detalhes do secret", anote o número do projeto:
projects/PROJECTNUM/secrets/RAILS_SECRET_NAME
Na guia Permissões, clique em Adicionar membro.
No campo Novos membros, digite
PROJECTNUM-compute@developer.gserviceaccount.come pressioneEnter.No campo Novos membros, digite
PROJECTNUM@cloudbuild.gserviceaccount.come pressioneEnter.No menu suspenso Papel, selecione Acessador de secrets do Secret Manager.
Clique em Salvar.
gcloud
Crie um novo secret com o valor de config/master.key:
gcloud secrets create RAILS_SECRET_NAME --data-file config/master.keySubstitua
RAILS_SECRET_NAMEpor um nome para o novo secret.Para confirmar a criação do secret, verifique-o:
gcloud secrets describe RAILS_SECRET_NAME gcloud secrets versions access latest --secret RAILS_SECRET_NAMEEncontre o valor do número do projeto:
gcloud projects describe PROJECT_ID --format='value(projectNumber)'Conceda acesso ao secret para a conta de serviço do Cloud Run:
gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \ --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \ --role roles/secretmanager.secretAccessorSubstitua
PROJECTNUMpelo valor do número do projeto.Conceda acesso ao secret para a conta de serviço do Cloud Build:
gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/secretmanager.secretAccessorNa saída, confirme se
bindingslista as duas contas de serviço como membros.
Conectar o app Rails ao armazenamento e ao banco de dados produção
Neste tutorial, uma instância do PostgreSQL é usada como banco de dados de produção e o
Cloud Storage como back-end de armazenamento. Para que o Rails se conecte ao
banco de dados e ao bucket de armazenamento recém-criados, é necessário
especificar todas as informações necessárias para acessá-los no arquivo .env. O arquivo .env contém
a configuração das variáveis de ambiente do aplicativo. O aplicativo lerá
esse arquivo usando a gem dotenv. Como os secrets são armazenados no
credentials.yml.enc e no Secret Manager, o .env não
precisa ser criptografado porque não contém nenhuma credencial confidencial.
- Para configurar o app Rails e se conectar ao banco de dados e ao bucket de armazenamento,
abra o arquivo
.env. Modifique a configuração do arquivo
.envpara o seguinte: Use o valor deMEDIA_BUCKET_SUFFIXque você usou ao criar o bucket.PRODUCTION_DB_NAME: DATABASE_NAME PRODUCTION_DB_USERNAME: DATABASE_USERNAME CLOUD_SQL_CONNECTION_NAME: PROJECT_ID:REGION:INSTANCE_NAME GOOGLE_PROJECT_ID: PROJECT_ID STORAGE_BUCKET_NAME: PROJECT_ID-MEDIA_BUCKET_SUFFIXAgora o app Rails está configurado para usar o Cloud SQL e o Cloud Storage na implantação no Cloud Run.
implantar o app no Cloud Run
Agora que os serviços de backup estão configurados, implante o app como um serviço do Cloud Run.
Usando o
cloudbuild.yamlfornecido, use o Cloud Build para criar a imagem, executar as migrações do banco de dados e preencher os recursos estáticos:gcloud builds submit --config cloudbuild.yaml \ --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAMESubstitua
SERVICE_NAMEpelo nome do serviço. A primeira versão leva alguns minutos para ser concluída. Se o tempo limite da compilação expirou, aumente a duração do tempo limite inserindo --timeout=2000s no comando de compilação.Quando a criação for bem-sucedida, implante o serviço Cloud Run pela primeira vez, definindo a região de serviço, a imagem de base e a instância do Cloud SQL conectada:
gcloud run deploy SERVICE_NAME \ --region REGION \ --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/SERVICE_NAME \ --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME \ --allow-unauthenticatedSerá exibida a resposta que mostra a implantação bem-sucedida, com o URL de serviço.
Para ver o serviço implantado, acesse o URL do serviço.
Se o URL do serviço mostrar Álbum de fotos de gatos, você estará na página inicial do app. Tente fazer o upload de uma nova foto. Se o upload da foto for concluído, o aplicativo Rails foi implantado.
Se o URL do serviço mostrar Álbum de fotos de gatos, você estará na página inicial do app.
Atualizar o aplicativo
Embora as etapas iniciais de provisionamento e implantação tenham sido complexas, fazer atualizações é um processo mais simples:
Execute o script de criação e migração do Cloud Build:
gcloud builds submit --config cloudbuild.yaml \ --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAMEImplante o serviço, especificando apenas a região e a imagem:
gcloud run deploy SERVICE_NAME \ --region REGION \ --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/SERVICE_NAME
entenda o código
O app de exemplo do Rails foi criado usando comandos padrão do Rails. Os comandos a seguir criam o app cat_album e usam o comando scaffold para gerar um modelo, controlador e visualizações para o recurso de fotos:
rails new cat_album
rails generate scaffold Photo caption:text
Conexão com o banco de dados
O arquivo config/database.yml contém a configuração necessária para acessar
seus bancos de dados em diferentes ambientes (desenvolvimento, teste, produção). Por
exemplo, o banco de dados de produção é configurado para ser executado no Cloud SQL
para PostgreSQL. O nome do banco de dados e o nome de usuário são definidos por meio de variáveis
de ambiente no arquivo .env, enquanto a senha do banco de dados está armazenada no
arquivo config/credentials.yml.enc, que requer o RAILS_MASTER_KEY para ser
descriptografado.
Quando o aplicativo é executado no Cloud Run (totalmente gerenciado), ele se conecta à instância do PostgreSQL usando um soquete fornecido pelo ambiente do Cloud Run. Quando o aplicativo é executado na máquina local, ele se conecta à instância do PostgreSQL usando o proxy do Cloud SQL Auth.
Mídia enviada pelo usuário e armazenada na nuvem
O Rails usa o
Active Storage para
fazer upload de arquivos para provedores de armazenamento. Os arquivos config/storage.yml e
config/environments/production.rb especificam o Cloud Storage como
o provedor de serviços no ambiente de produção.
Automação com o Cloud Build
O arquivo cloudbuild.yaml executa não apenas as etapas comuns de criação de imagem (criação da imagem do contêiner e envio para o Artifact Registry), mas também as migrações de banco de dados do Rails. Essa migração é realizada usando jobs do Cloud Run, em que um comando personalizado é usado para que o contêiner faça a migração, em vez do servidor da Web padrão.
Variáveis de substituição são usadas nessa configuração. Se você alterar os valores no arquivo, significa que a sinalização --substitutions pode ser descartada no momento da migração.
Nesta configuração, somente as migrações atuais do diretório db/migrate
são aplicadas. Para criar arquivos de migração, consulte
Migrações do Active Record.
Para criar a imagem e aplicar migrações, a
configuração do Cloud Build
precisa acessar o secret RAILS_MASTER_KEY do Secret Manager. O campo availableSecrets define a versão do secret e as variáveis de ambiente a serem usadas. O secret da chave mestra é transmitido como um argumento na etapa de imagem do build e, em seguida, é definido como o RAILS_MASTER_KEY no Dockerfile durante a criação da imagem.
Para estender a configuração do Cloud Build para incluir a implantação em uma configuração sem precisar executar dois comandos, consulte Implantação contínua do git usando o Cloud Build. Isso exige alterações no IAM, conforme descrito.
Limpeza
- No console Google Cloud , acesse a página Gerenciar recursos.
- Na lista de projetos, selecione o projeto que você quer excluir e clique em Excluir .
- Na caixa de diálogo, digite o ID do projeto e clique em Encerrar para excluí-lo.