1. Introduction
Présentation
Cloud Functions est une solution de calcul légère permettant aux développeurs de créer des fonctions autonomes à usage spécifique qui peuvent être déclenchées à l'aide de HTTPS ou répondre aux CloudEvents sans avoir à gérer de serveur ni d'environnement d'exécution.
Il existe deux approches principales pour contrôler les appels à Cloud Functions : sécuriser l'accès en fonction de l'identité et sécuriser l'accès à l'aide de contrôles d'accès basés sur le réseau. Cet atelier de programmation se concentre sur la première approche et vous présente trois scénarios pour sécuriser l'accès en fonction de l'identité afin d'appeler une fonction :
- Utiliser votre jeton d'identité gcloud pour appeler une fonction à des fins de développement et de test locaux
- Emprunter l'identité d'un compte de service lors du développement et des tests locaux pour utiliser les mêmes identifiants qu'en production
- Utiliser les bibliothèques clientes Google pour gérer l'authentification auprès des API Google Cloud, par exemple lorsqu'un service doit appeler une fonction
Points abordés
- Configurer l'authentification sur une fonction Cloud et vérifier qu'elle a été correctement configurée
- Appeler une fonction authentifiée à partir d'un environnement de développement local en fournissant le jeton de votre identité gcloud
- Créer un compte de service et lui attribuer le rôle approprié pour appeler une fonction
- Emprunter l'identité d'un service à partir d'un environnement de développement local disposant des rôles appropriés pour appeler une fonction
2. Préparation
Prérequis
- Vous êtes connecté à Cloud Console.
- Vous avez déjà déployé une fonction Cloud de 2e génération déclenchée par HTTP.
- (facultatif) Pour le troisième scénario, cet atelier de programmation utilise Node.js et npm comme exemple, mais vous pouvez utiliser n'importe quel environnement d'exécution compatible avec les bibliothèques clientes Google Auth client libraries.
Activer Cloud Shell
- Dans Cloud Console, cliquez sur Activer Cloud Shell
.

Si vous démarrez Cloud Shell pour la première fois, un écran intermédiaire s'affiche pour vous expliquer de quoi il s'agit. Si cet écran s'affiche, cliquez sur Continuer.

Le provisionnement et la connexion à Cloud Shell ne devraient pas prendre plus de quelques minutes.

Cette machine virtuelle est chargée avec tous les outils de développement nécessaires. Elle comprend un répertoire d'accueil persistant de 5 Go et s'exécute sur Google Cloud, ce qui améliore nettement les performances du réseau et l'authentification. Vous pouvez réaliser une grande partie, voire la totalité, des activités de cet atelier de programmation dans un navigateur.
Une fois connecté à Cloud Shell, vous êtes en principe authentifié, et le projet est défini avec votre ID de projet.
- Exécutez la commande suivante dans Cloud Shell pour vérifier que vous êtes authentifié :
gcloud auth list
Résultat de la commande
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Exécutez la commande suivante dans Cloud Shell pour vérifier que la commande gcloud reconnaît votre projet :
gcloud config list project
Résultat de la commande
[core] project = <PROJECT_ID>
Si vous obtenez un résultat différent, exécutez cette commande :
gcloud config set project <PROJECT_ID>
Résultat de la commande
Updated property [core/project].
3. Créer et tester une fonction Cloud authentifiée
Cet atelier de programmation suit les mêmes instructions que le guide de démarrage rapide de la console pour Cloud Functions, à une exception notable : votre fonction nécessitera une authentification.
L'authentification obligatoire signifie que le compte principal qui appelle la fonction doit disposer des rôles Demandeur Cloud Functions (et Demandeur Cloud Run pour la 2e génération). Sinon, la fonction renverra une erreur 403 Interdit. Cet atelier de programmation explique comment attribuer les rôles de demandeur appropriés à un compte principal.
Créer la fonction authentifiée
Voici les étapes à suivre pour utiliser Cloud Console :
- Accédez à la page Présentation de Cloud Functions, puis cliquez sur Créer une fonction
- Sous l'option Environment (Environnement), sélectionnez 2nd gen (2e génération).
- Nommez la fonction my-authenticated-function.
- Dans le champ Authentification, conservez la valeur par défaut Exiger l'authentification.

- Cliquez sur Suivant.
- Pour cet atelier de programmation, vous pouvez choisir n'importe quel langage.
- Cliquez ensuite sur Déployer.
Le déploiement de votre fonction prend environ une minute.
Configurer des variables d'environnement locales pour simplifier les commandes gcloud
Vous allez d'abord créer quelques variables d'environnement pour améliorer la lisibilité des commandes gcloud utilisées dans cet atelier de programmation.
Vous devez spécifier la région de votre fonction. Cet exemple utilise us-central1.
REGION="us-central1"
Vous pouvez ensuite enregistrer l'URL de la fonction en tant que variable d'environnement pour l'utiliser ultérieurement.
PROJECT_ID=$(gcloud config get-value project) FUNCTION_URL="$(gcloud functions describe my-authenticated-function --gen2 --region us-central1 --format='get(serviceConfig.uri)')"
Vérifier que la fonction nécessite une authentification en tentant de l'appeler en tant qu'appelant anonyme
Vous allez appeler la fonction sans authentification pour vérifier que vous recevez une erreur 403 attendue.
À partir d'une ligne de commande, exécutez la commande curl suivante :
curl $FUNCTION_URL
Le résultat suivant s'affiche :
<html><head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>403 Forbidden</title> </head> <body text=#000000 bgcolor=#ffffff> <h1>Error: Forbidden</h1> <h2>Your client does not have permission to get URL <code>/</code> from this server.</h2> <h2></h2> </body></html>
Vous êtes maintenant prêt à découvrir trois scénarios dans lesquels vous pouvez appeler votre fonction en fournissant une authentification.
4. Scénario 1 : Utiliser votre jeton d'identité gcloud
En tant que développeur, vous aurez besoin d'un moyen de tester votre fonction pendant que vous la développez localement. Dans cette section, vous allez effectuer un test rapide pour vérifier que la fonction est correctement authentifiée à l'aide de votre propre identité.
Vérifiez que vous êtes authentifié à l'aide de gcloud en exécutant la commande suivante :
gcloud auth list
Un astérisque doit s'afficher à côté de votre identité active, par exemple :
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
Une fois que vous avez vérifié que vous utilisez la bonne identité, enregistrez l'adresse e-mail du compte dans une variable d'environnement.
ACCOUNT_EMAIL=$(gcloud auth list --filter=status:ACTIVE --format="value(account)")
Pour en savoir plus sur la configuration de gcloud init et gcloud auth login, consultez la documentation.
Ensuite, appelez la fonction et transmettez-lui votre jeton d'identité.
curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token)"
Le résultat suivant s'affiche :
Hello World!
Dépannage
Si vous recevez une erreur 403 Interdit, assurez-vous que votre identité dispose du rôle Demandeur Cloud Functions ou du rôle Demandeur Cloud Run pour les fonctions de 2e génération. Vous pouvez utiliser la console IAM pour vérifier les rôles attribués à un compte principal.
Bien que l'utilisation de votre propre jeton d'identité soit un moyen rapide de tester votre fonction pendant le développement, l'appelant de votre fonction authentifiée aura besoin des rôles appropriés. Sinon, il recevra une erreur 403 Interdit.
Vous devez suivre le principe du moindre privilège en limitant le nombre d'identités et de comptes de service disposant de rôles pour appeler la fonction.
créer un compte de service et lui attribuer les rôles nécessaires, ce qui.
5. Scénario 2 : Emprunter l'identité d'un compte de service
Dans ce scénario, vous allez emprunter l'identité d'un compte de service (c'est-à-dire assumer ses autorisations) pour appeler une fonction lors du développement et des tests locaux. En empruntant l'identité d'un compte de service, vous pouvez tester votre fonction avec les mêmes identifiants qu'en production.
Vous vérifierez ainsi non seulement les rôles, mais vous suivrez également le principe du moindre privilège en n'ayant pas à attribuer le rôle Demandeur Cloud Functions à d'autres identités uniquement à des fins de test local.
Pour les besoins de cet atelier de programmation, vous allez créer un compte de service qui ne dispose que des rôles permettant d'appeler la fonction que vous avez créée dans cet atelier de programmation.
Créer un compte de service
Vous allez d'abord créer quelques variables d'environnement supplémentaires pour représenter les comptes de service utilisés dans les commandes gcloud.
SERVICE_ACCOUNT_NAME="invoke-functions-codelab" SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
Ensuite, vous allez créer le compte de service.
gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \ --display-name="Cloud Function Authentication codelab"
Et attribuer le rôle Demandeur Cloud Functions au compte de service
gcloud functions add-iam-policy-binding my-authenticated-function \ --region=us-central1 --gen2 \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role='roles/cloudfunctions.invoker'
Appeler la fonction en empruntant l'identité du compte de service
Pour ce faire, vous allez emprunter l'identité du compte de service que vous venez de créer en obtenant son jeton d'ID.
Ajouter les rôles requis pour l'emprunt d'identité
Pour emprunter l'identité d'un compte de service, votre compte utilisateur doit disposer du rôle Créateur de jetons du compte de service (roles/iam.serviceAccountTokenCreator) afin de générer un jeton d'ID pour le compte de service.
gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT_ADDRESS \ --member user:$ACCOUNT_EMAIL \ --role='roles/iam.serviceAccountTokenCreator'
Utiliser le jeton d'ID du compte de service
Vous pouvez maintenant appeler la fonction en transmettant le jeton d'ID du compte de service.
curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token --impersonate-service-account $SERVICE_ACCOUNT_ADDRESS)"
Le résultat suivant s'affiche :
WARNING: This command is using service account impersonation. All API calls will be executed as [invoke-functions-codelab@<project-id>.iam.gserviceaccount.com]. Hello World!
6. Scénario 3 : Utiliser les bibliothèques clientes Google
Pour cette dernière partie de l'atelier de programmation, vous allez exécuter un petit service localement afin de générer un jeton d'ID pour un compte de service, puis appeler la fonction par programmation à l'aide des bibliothèques clientes Google Auth et des identifiants par défaut de l'application. Pour en savoir plus sur les bibliothèques clientes Google, consultez la section Présentation des bibliothèques clientes de la documentation.
L'utilisation des identifiants par défaut de l'application est particulièrement importante lorsque vous souhaitez écrire et tester votre fonction localement (par exemple, sur votre ordinateur portable, dans Cloud Shell, etc.) tout en interagissant avec d'autres ressources Google Cloud (par exemple, Cloud Storage, Vision API, etc.). Dans cet exemple, vous allez voir comment un service peut appeler une autre fonction nécessitant une authentification. Pour en savoir plus sur les identifiants par défaut de l'application et le développement local, consultez l'article de blog Développer et tester vos fonctions Cloud localement | Blog Google Cloud.
Exécuter la commande gcloud pour emprunter l'identité d'un compte de service
Les identifiants par défaut de l'application trouvent automatiquement les identifiants en fonction de l'environnement de l'application et les utilisent pour s'authentifier auprès des API Google Cloud. Le flag –impersonate-service-account vous permet d'emprunter l'identité d'un compte de service en utilisant son identité pour l'authentification auprès des API Google Cloud.
Pour emprunter l'identité d'un compte de service, vous pouvez exécuter la commande suivante :
gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS
Vous exécutez maintenant les commandes gcloud en tant que compte de service, au lieu de votre identité.
Créer et exécuter un service pour appeler une fonction authentifiée
Chaque environnement d'exécution possède sa propre bibliothèque cliente Google Auth que vous pouvez installer. Cet atelier de programmation vous explique comment créer et exécuter une application Node.js localement.
Voici les étapes à suivre pour Node.js :
- Créer une application Node.js
npm init
- Installer la bibliothèque cliente Google Auth
npm install google-auth-library
- Créer un fichier
index.js - Récupérer l'URL de votre fonction Cloud, que vous ajouterez à votre code à l'étape suivante.
echo $FUNCTION_URL
- Ajoutez le code suivant à index.js. Veillez à remplacer la variable targetAudience par l'URL de votre fonction Cloud.
index.js
// Cloud Functions uses your function's url as the `targetAudience` value
const targetAudience = '<YOUR-CLOUD-FUNCTION-URL>';
// For Cloud Functions, endpoint(`url`) and `targetAudience` should be equal
const url = targetAudience;
const { GoogleAuth } = require('google-auth-library');
const auth = new GoogleAuth();
async function request() {
console.info(`request ${url} with target audience ${targetAudience}`);
// this call retrieves the ID token for the impersonated service account
const client = await auth.getIdTokenClient(targetAudience);
const res = await client.request({ url });
console.info(res.data);
}
request().catch(err => {
console.error(err.message);
process.exitCode = 1;
});
- Exécuter l'application
node index.js
Le résultat "Hello World!" doit s'afficher.
Dépannage
Si vous voyez l'erreur Permission ‘iam.serviceAccounts.getOpenIdToken' denied on resource (or it may not exist)., veuillez patienter quelques minutes pour que le rôle Créateur de jetons du compte de service se propage.
Si vous avez reçu l'erreur Cannot fetch ID token in this environment, use GCE or set the GOOGLE_APPLICATION_CREDENTIALS environment variable to a service account credentials JSON file, vous avez peut-être oublié d'exécuter la commande.
gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS
7. Félicitations !
Bravo ! Vous avez terminé cet atelier de programmation.
Nous vous recommandons de consulter la documentation sur la manière de sécuriser les fonctions Cloud.
Nous vous recommandons également cet article de blog sur le développement local avec Cloud Functions pour découvrir comment développer et tester votre fonction Cloud dans votre environnement de développement local.
Points abordés
- Configurer l'authentification sur une fonction Cloud et vérifier qu'elle a été correctement configurée
- Appeler une fonction authentifiée à partir d'un environnement de développement local en fournissant le jeton de votre identité gcloud
- Créer un compte de service et lui attribuer le rôle approprié pour appeler une fonction
- Emprunter l'identité d'un service à partir d'un environnement de développement local disposant des rôles appropriés pour appeler une fonction
8. Effectuer un nettoyage
Pour éviter des frais involontaires (par exemple, si cette fonction Cloud est appelée par inadvertance plus de fois que votre allocation mensuelle d'appels de fonctions Cloud dans le niveau sans frais), vous pouvez supprimer la fonction Cloud ou le projet que vous avez créé à l'étape 2.
Pour arrêter d'emprunter l'identité du compte de service, vous pouvez vous reconnecter avec votre identité :
gcloud auth application-default login
Pour supprimer la fonction Cloud, accédez à la console Cloud Functions à l'adresse https://console.cloud.google.com/functions/. Assurez-vous que le projet que vous avez créé à l'étape 2 est le projet actuellement sélectionné.
Sélectionnez la my-authenticated-function que vous avez déployée précédemment. Cliquez ensuite sur Supprimer.
Si vous choisissez de supprimer l'ensemble du projet, vous pouvez accéder à https://console.cloud.google.com/cloud-resource-manager, sélectionner le projet que vous avez créé à l'étape 2, puis choisir Supprimer. Si vous supprimez le projet, vous devrez modifier les projets dans votre SDK Cloud. Vous pouvez afficher la liste de tous les projets disponibles en exécutant gcloud projects list.