Apprenez à déployer un exemple d'application Rails sur Cloud Run et à intégrer des bases de données gérées, un espace de stockage d'objets, des secrets chiffrés et des pipelines de compilation avec une solution de calcul sans serveur.
Le déploiement d'applications Rails implique l'intégration de plusieurs services pour former un projet cohérent. Dans ce tutoriel, nous partons du principe que vous connaissez bien le développement Web avec Rails.
Ce tutoriel nécessite Ruby 3.0 ou une version ultérieure et Rails 8 ou une version ultérieure.
Objectifs
- Créer une base de données Cloud SQL et l'associer à Active Record
- Créer et utiliser Secret Manager pour stocker une clé principale Rails et y accéder en toute sécurité
- Héberger des fichiers et des fichiers multimédias importés par les utilisateurs sur Cloud Storage à partir d'Active Storage
- Automatiser les migrations de compilations et de bases de données à l'aide de Cloud Build
- Déployer une application Rails sur Cloud Run
Coûts
Avant de commencer
- Connectez-vous à votre compte Google Cloud . Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $de crédits sans frais pour exécuter, tester et déployer des charges de travail.
-
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.-
Installez la Google Cloud CLI.
-
Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.
-
Pour initialiser la gcloud CLI, exécutez la commande suivante :
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.-
Installez la Google Cloud CLI.
-
Si vous utilisez un fournisseur d'identité (IdP) externe, vous devez d'abord vous connecter à la gcloud CLI avec votre identité fédérée.
-
Pour initialiser la gcloud CLI, exécutez la commande suivante :
gcloud init - Assurez-vous que le compte utilisé pour ce tutoriel dispose des autorisations suffisantes.
Préparer votre environnement
Ce tutoriel utilise plusieurs services Google Cloud pour fournir la base de données, le stockage multimédia et le stockage des secrets compatibles avec l'application Rails déployée. Préparez votre environnement en configurant une région dans laquelle déployer les services et en clonant l'application Rails.
Définir le projet et la région par défaut
Définissez la configuration du projet par défaut pour la gcloud CLI en exécutant la commande suivante :
gcloud config set project PROJECT_IDRemplacez
PROJECT_IDpar l'ID de votre projet Google Cloud.Configurez votre région :
export REGION=REGIONRemplacez
REGIONpar un emplacement approprié. Pour plus d'efficacité entre les services, tous les services doivent être déployés dans la même région. Pour plus d'informations sur la région la plus proche de vous, consultez la section Produits disponibles par emplacement.
Cloner l'application Rails
Le code de l'exemple d'application Rails se trouve dans le dépôt GoogleCloudPlatform/ruby-docs-samples sur GitHub.
Clonez le dépôt :
git clone https://github.com/GoogleCloudPlatform/ruby-docs-samples.gitAccédez au répertoire qui contient l'exemple de code et exécutez les commandes suivantes pour vous assurer que l'application est correctement configurée avec les gems et dépendances nécessaires :
Linux/macOS
cd ruby-docs-samples/run/rails bundle installWindows
cd ruby-docs-samples\run\rails bundle install
Préparer les services externes
Ce tutoriel utilise un certain nombre de services Google Cloud pour fournir la base de données, le stockage multimédia et le stockage des secrets compatibles avec le projet Rails déployé. Ces services sont déployés dans une région spécifique. Pour plus d'efficacité entre les services, il est préférable que tous les services soient déployés dans la même région. Pour plus d'informations sur la région la plus proche de vous, consultez la section Produits disponibles par emplacement.
Configurer une instance Cloud SQL pour PostgreSQL
Rails est compatible avec plusieurs bases de données relationnelles, dont plusieurs proposées par Cloud SQL. Ce tutoriel utilise PostgreSQL, une base de données Open Source couramment utilisée par les applications Rails.
Les sections suivantes décrivent la création d'une instance PostgreSQL, d'une base de données et d'un utilisateur de base de données pour votre application Rails.
Créer une instance PostgreSQL
Console
Dans la console Google Cloud , accédez à la page Instances Cloud SQL.
Cliquez sur Create Instance (Créer une instance).
Cliquez sur Choisir PostgreSQL.
Dans le champ ID d'instance, saisissez un nom pour l'instance (
INSTANCE_NAME).Dans le champ Mot de passe, entrez le mot de passe de l'utilisateur Postgres.
Utilisez les valeurs par défaut dans les autres champs.
Cliquez sur Create Instance (Créer une instance).
gcloud
Créez l'instance PostgreSQL :
gcloud sql instances create INSTANCE_NAME \ --database-version POSTGRES_12 \ --tier db-f1-micro \ --region REGIONRemplacez les éléments suivants :
INSTANCE_NAME: nom de votre nouvelle instance Cloud SQLREGION: Google Cloud région
La création de l'instance et la préparation à son utilisation prennent quelques minutes.
Créer une base de données
Console
Dans la console Google Cloud , accédez à la page Instances Cloud SQL.
Sélectionnez l'instance INSTANCE_NAME.
Accédez à l'onglet Bases de données.
Cliquez sur Create database.
Dans la boîte de dialogue Nom de la base de données, saisissez
DATABASE_NAME.Cliquez sur Create (Créer).
gcloud
Créez la base de données dans l'instance récemment créée :
gcloud sql databases create DATABASE_NAME \ --instance INSTANCE_NAMERemplacez
DATABASE_NAMEpar le nom de la base de données dans l'instance.
Créer un compte utilisateur
Générez un mot de passe aléatoire pour l'utilisateur de la base de données, puis écrivez-le dans un fichier nommé dbpassword :
cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n1 > dbpassword
Console
Dans la console Google Cloud , accédez à la page Instances Cloud SQL.
Sélectionnez l'instance INSTANCE_NAME.
Accédez à l'onglet Utilisateurs.
Cliquez sur Ajouter un compte utilisateur.
Sous la boîte de dialogue Authentification intégrée :
- Saisissez le nom d'utilisateur
DATABASE_USERNAME. - Saisissez le contenu du fichier
dbpassworden tant que mot de passePASSWORD.
- Saisissez le nom d'utilisateur
Cliquez sur Ajouter.
gcloud
Créez l'utilisateur dans l'instance récemment créée et définissez son mot de passe sur le contenu de dbpassword :
gcloud sql users create DATABASE_USERNAME \ --instance=INSTANCE_NAME --password=$(cat dbpassword)Remplacez
DATABASE_USERNAMEpar le nom de la base de données dans l'instance.
Configurer un dépôt Artifact Registry
Utilisez Artifact Registry pour créer un dépôt afin de stocker votre image de conteneur.
Console
Dans la console Google Cloud , accédez à la page Artifact Registry.
Cliquez sur Créer un dépôt.
Saisissez ce qui suit :
- Dans le champ Nom, saisissez "cloud-run-source-deploy".
- Pour Format, sélectionnez "Docker".
- Pour Région, sélectionnez REGION.
Conservez les valeurs par défaut des autres champs.
Cliquez sur Créer.
gcloud
Créer un dépôt Artifact Registry :
gcloud artifacts repositories create cloud-run-source-deploy \ --repository-format docker \ --location REGION
Configurer un bucket Cloud Storage
Vous pouvez héberger des éléments statiques et des fichiers multimédias Rails importés par les utilisateurs dans un espace de stockage d'objets à disponibilité élevée à l'aide de Cloud Storage.
Console
- Dans la console Google Cloud , accédez à la page Buckets Cloud Storage.
- Cliquez sur Créer.
- Sur la page Créer un bucket, saisissez les informations concernant votre bucket. Pour passer à l'étape suivante, cliquez sur Continuer.
-
Dans la section Premiers pas, procédez comme suit :
- Saisissez un nom unique qui répond aux exigences relatives aux noms des buckets.
- Pour ajouter une étiquette de bucket, développez la section Étiquettes (), cliquez sur add_box
Ajouter une étiquette, puis spécifiez un élément
keyetvaluepour votre étiquette.
- Pour Emplacement, sélectionnez ce qui suit : us-central1
-
Dans la section Choisir comment stocker vos données, procédez comme suit :
- Dans la section Définir une classe par défaut, sélectionnez Standard.
- Pour activer l'espace de noms hiérarchique, dans la section Optimiser l'espace de stockage pour les charges de travail utilisant beaucoup de données, sélectionnez Activer l'espace de noms hiérarchique sur ce bucket.
- Dans la section Choisir comment contrôler l'accès aux objets, indiquez si votre bucket applique ou non la protection contre l'accès public et sélectionnez une méthode de contrôle des accès pour les objets de votre bucket.
-
Dans la section Choisir comment protéger les données d'objet, procédez comme suit :
- Sous Protection des données, sélectionnez les options que vous souhaitez définir pour votre bucket.
- Pour activer la suppression réversible, cochez la case Règle de suppression réversible (pour la récupération de données), puis spécifiez le nombre de jours pendant lesquels vous souhaitez conserver les objets après leur suppression.
- Pour configurer la gestion des versions d'objets, cochez la case Gestion des versions des objets (pour le contrôle des versions), puis spécifiez le nombre maximal de versions par objet et le nombre de jours après lesquels les versions obsolètes expirent.
- Pour activer la règle de conservation sur les objets et les buckets, cochez la case Conservation (pour la conformité), puis procédez comme suit :
- Pour activer le verrou de conservation des objets, cochez la case Activer la conservation des objets.
- Pour activer le verrou de bucket, cochez la case Définir une règle de conservation du bucket, puis choisissez une unité de temps et une durée pour votre période de conservation.
- Pour choisir comment vos données d'objet seront chiffrées, développez la section Chiffrement des données (), puis sélectionnez une méthode de chiffrement des données.
- Sous Protection des données, sélectionnez les options que vous souhaitez définir pour votre bucket.
-
Dans la section Premiers pas, procédez comme suit :
- Cliquez sur Créer.
gcloud
créer un bucket Cloud Storage ; Pour créer un nom de bucket Cloud Storage unique, utilisez PROJECT_ID et le suffixe de votre choix,
MEDIA_BUCKET_SUFFIX. Dans Cloud Storage, les noms de buckets doivent être uniques.gcloud storage buckets create gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX \ --location=REGION
Après avoir créé un bucket, pour rendre les images importées publiques, modifiez les autorisations des objets "Image" afin qu'ils soient lisibles par tous.
Console
- Dans la console Google Cloud , accédez à la page Buckets de Cloud Storage.
Dans la liste des buckets, cliquez sur le nom de celui que vous souhaitez rendre public.
Sélectionnez l'onglet Autorisations en haut de la page.
Cliquez sur le bouton Ajouter des membres.
La boîte de dialogue Ajouter des membres s'affiche.
Dans le champ Nouveaux membres, saisissez
allUsers.Dans la liste déroulante Sélectionner un rôle, sélectionnez le sous-menu Cloud Storage, puis cliquez sur l'option Lecteur des objets Storage.
Cliquez sur Enregistrer.
Une fois le partage public effectué, une icône de lien s'affiche pour chaque objet dans la colonne Accès public. Vous pouvez cliquer sur cette icône pour obtenir l'URL de l'objet.
Pour savoir comment obtenir des informations détaillées sur les erreurs liées à l'échec des opérations Ruby dans la console Google Cloud , consultez Dépannage.
gcloud
Utilisez la commande
gcloud storage buckets add-iam-policy-bindingpour rendre tous les objets publics. Utilisez la valeur deMEDIA_BUCKET_SUFFIXque vous avez utilisée lors de la création du bucket.gcloud storage buckets add-iam-policy-binding gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX \ --member=allUsers --role=roles/storage.objectViewer
Stocker les valeurs du secret dans Secret Manager
Maintenant que les services externes sont configurés, Rails nécessite des informations sécurisées, telles que des mots de passe, pour accéder à ces services. Au lieu de placer ces valeurs directement dans le code source Rails, ce tutoriel utilise les identifiants Rails et Secret Manager pour stocker ces informations en toute sécurité.
Créer un fichier d'identifiants chiffrés et stocker la clé en tant que secret Secret Manager
Rails stocke les secrets dans un fichier chiffré nommé "config/credentials.yml.enc".
Le fichier peut être déchiffré à l'aide de la clé config/master.key locale ou de la variable d'environnement ENV["RAILS_MASTER_KEY"]. Dans le fichier d'identifiants, vous pouvez stocker le mot de passe de la base de données d'instance Cloud SQL ainsi que d'autres clés d'accès pour les API externes.
Vous pouvez stocker cette clé en toute sécurité dans Secret Manager. Ensuite, vous pouvez autoriser Cloud Run et Cloud Build à accéder à la clé en accordant l'accès à leurs comptes de service respectifs. Les comptes de service sont identifiés par une adresse e-mail contenant le numéro de projet.
Générez le fichier
config/credentials.yml.encà l'aide de la commande suivante :bin/rails credentials:editLa commande crée une clé
config/master.keysi aucune clé principale n'est définie, ainsi qu'un fichierconfig/credentials.yml.encsi le fichier n'existe pas. Cela ouvre un fichier temporaire dans votre fichier$EDITORpar défaut avec le contenu déchiffré pour les secrets à ajouter.Copiez et collez le mot de passe de la base de données d'instance PostgreSQL que vous venez de créer depuis le fichier
dbpasswordvers le fichier d'identifiants :secret_key_base: GENERATED_VALUE gcp: db_password: PASSWORDLes secrets sont accessibles avec
Rails.application.credentials. Par exemple,Rails.application.credentials.secret_key_basedoit renvoyer la base de clé secrète de l'application etRails.application.credentials.gcp[:db_password]doit renvoyer le mot de passe de votre base de données.Le dossier
config/credentials/yml.encest stocké de manière chiffrée, maisconfig/master.keypeut être stocké dans Secret Manager.Console
Dans la console Google Cloud , accédez à la page Secret Manager.
Cliquez sur Créer un secret.
Dans le champ Nom, saisissez un nom pour le secret
RAILS_SECRET_NAME.Dans la boîte de dialogue Valeur du secret, collez la valeur "master.key" dans la zone.
Cliquez sur Créer un secret.
Sur la page "Informations détaillées sur le secret" de votre secret, notez le numéro du projet :
projects/PROJECTNUM/secrets/RAILS_SECRET_NAME
Dans l'onglet Autorisations, cliquez sur Ajouter un membre.
Dans le champ Nouveaux membres, saisissez
PROJECTNUM-compute@developer.gserviceaccount.com, puis appuyez surEnter.Dans le champ Nouveaux membres, saisissez
PROJECTNUM@cloudbuild.gserviceaccount.com, puis appuyez surEnter.Dans le menu déroulant Rôle, sélectionnez Accesseur de secrets de Secret Manager.
Cliquez sur Enregistrer.
gcloud
Créez un secret avec la valeur de config/master.key :
gcloud secrets create RAILS_SECRET_NAME --data-file config/master.keyRemplacez
RAILS_SECRET_NAMEpar le nom du nouveau secret.Pour confirmer la création du secret, vérifiez-le :
gcloud secrets describe RAILS_SECRET_NAME gcloud secrets versions access latest --secret RAILS_SECRET_NAMEObtenez la valeur du numéro de projet :
gcloud projects describe PROJECT_ID --format='value(projectNumber)'Accordez l'accès au secret au compte de service Cloud Run :
gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \ --member serviceAccount:PROJECTNUM-compute@developer.gserviceaccount.com \ --role roles/secretmanager.secretAccessorRemplacez
PROJECTNUMpar la valeur du numéro de projet.Accordez l'accès au secret au compte de service Cloud Build :
gcloud secrets add-iam-policy-binding RAILS_SECRET_NAME \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/secretmanager.secretAccessorDans le résultat, confirmez que
bindingsidentifie les deux comptes de service en tant que membres.
Connecter l'application Rails à la base de données et à l'espace de stockage de production
Dans ce tutoriel, nous utilisons une instance PostgreSQL comme base de données de production et Cloud Storage comme backend de stockage. Pour que Rails puisse se connecter à la base de données et au bucket de stockage nouvellement créés, vous devez spécifier toutes les informations nécessaires pour y accéder dans le fichier .env. Le fichier .env contient la configuration des variables d'environnement d'application. L'application lit ce fichier à l'aide du gem dotenv. Comme les secrets sont stockés dans credentials.yml.enc et Secret Manager, le fichier .env n'a pas besoin d'être chiffré, car il ne contient aucun identifiant sensible.
- Pour configurer l'application Rails afin qu'elle se connecte à la base de données et au bucket de stockage, ouvrez le fichier
.env. Modifiez la configuration du fichier
.envcomme suit. Utilisez la valeurMEDIA_BUCKET_SUFFIXque vous avez utilisée lors de la création du 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_SUFFIXL'application Rails est désormais configurée de manière à utiliser Cloud SQL et Cloud Storage lors du déploiement sur Cloud Run.
Déployer l'application sur Cloud Run
Une fois les services externes configurés, vous pouvez déployer l'application en tant que service Cloud Run.
À l'aide du fichier
cloudbuild.yamlfourni, utilisez Cloud Build pour créer l'image, exécuter les migrations de la base de données et renseigner les éléments statiques :gcloud builds submit --config cloudbuild.yaml \ --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAMERemplacez
SERVICE_NAMEpar le nom de votre service. Cette première compilation prend quelques minutes. Si le délai de compilation est dépassé, augmentez-le en insérant "--timeout=2000s" dans la commande de compilation.Une fois la compilation réussie, déployez le service Cloud Run pour la première fois en définissant la région du service, l'image de base et l'instance Cloud SQL connectée :
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-unauthenticatedVous devriez obtenir un résultat indiquant que le déploiement a réussi, avec une URL de service.
Pour afficher le service déployé, accédez à l'URL du service.
Si l'URL du service affiche Cat Photo Album (Album photo de chats), vous êtes sur la page d'accueil de l'application. Essayez d'importer une nouvelle photo. Si la photo a bien été importée, l'application Rails a bien été déployée.
Si l'URL du service affiche Cat Photo Album (Album photo de chats), vous êtes sur la page d'accueil de l'application.
Mettre à jour l'application
Alors que la procédure initiale de création et de déploiement était complexe, la mise à jour est un processus plus simple :
Exécutez le script de compilation et de migration Cloud Build :
gcloud builds submit --config cloudbuild.yaml \ --substitutions _SERVICE_NAME=SERVICE_NAME,_INSTANCE_NAME=INSTANCE_NAME,_REGION=REGION,_SECRET_NAME=RAILS_SECRET_NAMEDéployez le service en spécifiant uniquement la région et l'image :
gcloud run deploy SERVICE_NAME \ --region REGION \ --image REGION-docker.pkg.dev/PROJECT_ID/cloud-run-source-deploy/SERVICE_NAME
Comprendre le code
L'exemple d'application Rails a été créé à l'aide des commandes Rails standards. Les commandes suivantes créent l'application "cat_album" et utilisent la commande scaffold pour générer un modèle, un contrôleur et des vues pour la ressource Photo :
rails new cat_album
rails generate scaffold Photo caption:text
Connexion à une base de données
Le fichier config/database.yml contient la configuration nécessaire pour accéder à vos bases de données dans différents environnements (développement, test, production). Par exemple, la base de données de production est configurée de manière à s'exécuter dans Cloud SQL pour PostgreSQL. Le nom de la base de données et le nom de l'utilisateur sont définis via des variables d'environnement dans le fichier .env, tandis que le mot de passe de la base de données est stocké dans le fichier config/credentials.yml.enc, ce qui nécessite l'élément RAILS_MASTER_KEY pour le déchiffrement.
Lorsque l'application s'exécute sur Cloud Run (entièrement géré), elle se connecte à l'instance PostgreSQL à l'aide d'un socket fourni par l'environnement Cloud Run. Lorsque l'application s'exécute sur votre ordinateur local, elle se connecte à l'instance PostgreSQL à l'aide du proxy Cloud SQL Auth.
Fichiers multimédias importés par les utilisateurs dans le cloud
Rails vous permet d'importer des fichiers dans Cloud Storage à l'aide d'Active Storage. Les fichiers config/storage.yml et config/environments/production.rb spécifient Cloud Storage en tant que fournisseur de services dans l'environnement de production.
Automatisation avec Cloud Build
Le fichier cloudbuild.yaml exécute non seulement les étapes de compilation d'images classiques (création d'une image de conteneur et transfert de celle-ci vers Artifact Registry), mais aussi les migrations de bases de données Rails. Cette migration est effectuée à l'aide de jobs Cloud Run, où une commande personnalisée est utilisée pour que le conteneur effectue la migration, plutôt que le serveur Web par défaut.
Des variables de substitution sont utilisées dans cette configuration. Modifier les valeurs directement dans le fichier signifie que l'option --substitutions peut être supprimée au moment de la migration.
Dans cette configuration, seules les migrations existantes dans le répertoire db/migrate sont appliquées. Pour créer des fichiers de migration, consultez la page Migrations Active Record.
Pour créer l'image et appliquer des migrations, la configuration Cloud Build doit disposer d'un accès au secret RAILS_MASTER_KEY à partir de Secret Manager. Le champ availableSecrets définit la version du secret et les variables d'environnement à utiliser pour ce secret. Le secret de la clé principale est transmis en tant qu'argument à l'étape de compilation de l'image, puis est défini comme étant RAILS_MASTER_KEY dans le fichier Dockerfile lors de la compilation de l'image.
Pour étendre la configuration Cloud Build afin d'inclure le déploiement dans une seule configuration sans avoir à exécuter deux commandes, consultez la page Déploiement continu à partir de Git à l'aide de Cloud Build. Cela nécessite des modifications IAM, comme décrit dans cette page.
Nettoyage
- Dans la console Google Cloud , accédez à la page Gérer les ressources.
- Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
- Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez sur Arrêter pour supprimer le projet.