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 (Ruby 2.7 est également compatible, consultez la section "Comprendre le code") et Rails 6 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 gratuits 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.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Cloud SQL, Cloud Build, Secret Manager, and Compute Engine APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Assurez-vous que le compte utilisé pour ce tutoriel dispose des autorisations suffisantes.
Préparer l'environnement
Définir le projet par défaut
Définissez la configuration de projet par défaut pour la CLI gcloud en exécutant la commande suivante:
gcloud config set project PROJECT_ID
Remplacez PROJECT_ID
par votre ID de projet Google Cloud nouvellement créé.
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.git
Accé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 install
Windows
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 région.
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 Google Cloud Console, 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 REGION
Remplacez les éléments suivants :
INSTANCE_NAME
: nom de votre nouvelle instance Cloud SQLREGION
: région Google Cloud
La création de l'instance et la préparation à son utilisation prennent quelques minutes.
Créer une base de données
Console
Dans Google Cloud Console, 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 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_NAME
Remplacez
DATABASE_NAME
par 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 Google Cloud Console, 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
dbpassword
en 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_USERNAME
par le nom de la base de données dans l'instance.
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
- In the Google Cloud console, go to the Cloud Storage Buckets page.
- Click Create bucket.
- On the Create a bucket page, enter your bucket information. To go to the next
step, click Continue.
- For Name your bucket, enter a name that meets the bucket naming requirements.
- For Location, select the following: us-central1
- For Choose a default storage class for your data, select the following: Standard.
- For Choose how to control access to objects, select an Access control option.
- For Advanced settings (optional), specify an encryption method, a retention policy, or bucket labels.
- Click Create.
gcloud
L'outil de ligne de commande gsutil
a été installé lors de l'installation de la CLI gcloud.
Créer un bucket Cloud Storage Pour créer un nom de bucket Cloud Storage unique, utilisez le PROJECT_ID et le suffixe de votre choix,
MEDIA_BUCKET_SUFFIX
. Dans Cloud Storage, les noms de buckets doivent être uniques.gsutil mb -l REGION gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX
Après avoir créé un bucket, modifiez les autorisations des objets d'image pour que tout le monde puisse les lire.
Console
- Dans Google Cloud Console, 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 Save (Enregistrer).
Une fois le partage public effectué, un 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 concernant les opérations Ruby ayant échoué dans la console Google Cloud, consultez la page Dépannage.
gcloud
Exécutez la commande
gsutil iam ch
pour rendre tous les objets publics. Utilisez la valeurMEDIA_BUCKET_SUFFIX
que vous avez utilisée lors de la création du bucket.gsutil iam ch allUsers:objectViewer gs://PROJECT_ID-MEDIA_BUCKET_SUFFIX
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:edit
La commande crée une clé
config/master.key
si aucune clé principale n'est définie, ainsi qu'un fichierconfig/credentials.yml.enc
si le fichier n'existe pas. Cela ouvre un fichier temporaire dans votre fichier$EDITOR
par 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
dbpassword
vers le fichier d'identifiants :secret_key_base: GENERATED_VALUE gcp: db_password: PASSWORD
Les secrets sont accessibles avec
Rails.application.credentials
. Par exemple,Rails.application.credentials.secret_key_base
doit renvoyer la base de clé secrète de l'application etRails.application.credentials.gcp[:db_passsword]
doit renvoyer le mot de passe de votre base de données.Le dossier
config/credentials/yml.enc
est stocké de manière chiffrée, maisconfig/master.key
peut être stocké dans Secret Manager.Console
Dans Google Cloud Console, 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 Save (Enregistrer).
gcloud
Créez un secret avec la valeur de config/master.key :
gcloud secrets create RAILS_SECRET_NAME --data-file config/master.key
Remplacez
RAILS_SECRET_NAME
par 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_NAME
Obtenez 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.secretAccessor
Remplacez
PROJECTNUM
par la valeur du numéro de projet ci-dessus.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.secretAccessor
Dans le résultat, confirmez que
bindings
identifie 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
.env
comme suit. Utilisez la valeurMEDIA_BUCKET_SUFFIX
que 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_SUFFIX
L'application Rails est désormais configurée de manière à utiliser Cloud SQL et Cloud Storage lors du déploiement sur Cloud Run.
Autoriser Cloud Build à accéder à Cloud SQL
Pour que Cloud Build puisse appliquer les migrations de base de données, vous devez autoriser Cloud Build à accéder à Cloud SQL.
Console
Dans Google Cloud Console, accédez à la page Identity and Access Management.
Pour modifier l'entrée du membre
PROJECTNUM@cloudbuild.gserviceaccount.com
, cliquez sur Modifier le membre.Cliquez sur Ajouter un autre rôle.
Dans la boîte de dialogue Sélectionner un rôle, sélectionnez Client Cloud SQL.
Cliquez sur Enregistrer.
gcloud
Autorisez Cloud Build à accéder à Cloud SQL :
gcloud projects add-iam-policy-binding PROJECT_ID \ --member serviceAccount:PROJECTNUM@cloudbuild.gserviceaccount.com \ --role roles/cloudsql.client
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.yaml
fourni, 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_NAME
Remplacez
SERVICE_NAME
par 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 ci-dessus.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 \ --platform managed \ --region REGION \ --image gcr.io/PROJECT_ID/SERVICE_NAME \ --add-cloudsql-instances PROJECT_ID:REGION:INSTANCE_NAME \ --allow-unauthenticated
Vous devriez obtenir un résultat indiquant que le déploiement a réussi, avec une URL de service :
Service [SERVICE_NAME] revision [SERVICE_NAME-00001-tug] has been deployed and is serving 100 percent of traffic at https://SERVICE_NAME-
HASH
-uc.a.run.appPour afficher le service déployé, accédez à l'URL du service.
Essayez d'importer une nouvelle photo. Si la photo a bien été importée, l'application Rails a bien été déployée.
Mettre à jour de 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_NAME
Déployez le service en spécifiant uniquement la région et l'image :
gcloud run deploy SERVICE_NAME \ --platform managed \ --region REGION \ --image gcr.io/PROJECT_ID/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 Container Registry), mais aussi les migrations de bases de données Rails. Celles-ci nécessitent un accès à la base de données, rendu possible par app-engine-exec-wrapper, un outil d'aide pour le proxy d'authentification Cloud SQL :
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.
Compatibilité avec Ruby 2.7
Bien que ce tutoriel utilise Ruby 3.0, Ruby 2.7 est également compatible. Pour utiliser Ruby 2.7, définissez l'image de base Ruby dans le fichier Dockerfile sur 2.7.
Nettoyage
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.