1. Введение
Обзор
Cloud Functions — это легковесное вычислительное решение для разработчиков, позволяющее создавать автономные функции, выполняющие одну задачу, которые можно запускать по протоколу HTTPS или которые могут реагировать на события CloudEvents без необходимости управления сервером или средой выполнения.
Существует два основных подхода к управлению вызовами облачных функций: защита доступа на основе идентификации и защита доступа с использованием сетевых средств контроля доступа . В этом практическом занятии мы рассмотрим первый подход и проведем вас через 3 сценария защиты доступа на основе идентификации для вызова функции:
- Используйте свой токен идентификации gcloud для вызова функции в целях локальной разработки и тестирования.
- При локальной разработке и тестировании используйте учетную запись службы, чтобы применять те же учетные данные, что и в рабочей среде.
- Используйте клиентские библиотеки Google для обработки аутентификации к API Google Cloud, например, когда сервису необходимо вызвать функцию.
Что вы узнаете
- Как настроить аутентификацию в облачной функции и проверить правильность ее настройки.
- Вызовите аутентифицированную функцию из локальной среды разработки, предоставив токен для вашей учетной записи gcloud.
- Как создать учетную запись службы и предоставить ей соответствующую роль для вызова функции?
- Как имитировать работу сервиса из локальной среды разработки, имеющей соответствующие роли для вызова функции.
2. Настройка и требования
Предварительные требования
- Вы вошли в облачную консоль.
- Вы ранее развернули облачную функцию второго поколения, запускаемую по протоколу HTTP.
- (необязательно) В третьем сценарии в качестве примера используются Node.js и npm , но вы можете использовать любую среду выполнения, поддерживаемую клиентскими библиотеками Google Auth.
Активировать Cloud Shell
- В консоли Cloud нажмите «Активировать Cloud Shell» .
.

Если вы запускаете Cloud Shell впервые, вам будет показан промежуточный экран с описанием его возможностей. Если вы увидели промежуточный экран, нажмите «Продолжить» .

Подготовка и подключение к Cloud Shell займут всего несколько минут.

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог объемом 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, ваша работа в этом практическом задании может быть выполнена с помощью браузера.
После подключения к Cloud Shell вы увидите, что прошли аутентификацию и что проект настроен на ваш идентификатор проекта.
- Выполните следующую команду в Cloud Shell, чтобы подтвердить свою аутентификацию:
gcloud auth list
вывод команды
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project
вывод команды
[core] project = <PROJECT_ID>
Если это не так, вы можете установить это с помощью следующей команды:
gcloud config set project <PROJECT_ID>
вывод команды
Updated property [core/project].
3. Создайте и протестируйте аутентифицированную облачную функцию.
Данный практический урок следует тем же инструкциям, что и в руководстве по быстрому запуску консоли для облачных функций, за одним важным исключением: вашей функции потребуется аутентификация.
Требование аутентификации означает, что субъект, вызывающий функцию, должен иметь роли Cloud Functions Invoker (и Cloud Run Invoker для 2-го поколения); в противном случае функция вернет ошибку 403 Forbidden. В этом практическом занятии будет показано , как предоставить субъекту соответствующие роли Invoker .
Создайте функцию аутентификации.
Вот пошаговая инструкция по использованию облачной консоли:
- Перейдите на страницу «Обзор облачных функций» и нажмите «Создать функцию».
- В разделе «Окружающая среда» выберите «2-е поколение» .
- Назовите функцию my-authenticated-function
- В поле «Аутентификация» оставьте значение по умолчанию «Требовать аутентификацию».

- Нажмите Далее
- Для этого практического занятия вы можете выбрать любой язык.
- Затем нажмите «Развернуть».
Развертывание вашей функции занимает приблизительно 1 минуту.
Настройка локальных переменных окружения для упрощения команд gcloud.
Сначала вы создадите несколько переменных окружения, чтобы улучшить читаемость команд gcloud , используемых в этом практическом занятии.
Вам потребуется указать регион для вашей функции. В этом примере используется us-central1 .
REGION="us-central1"
Затем вы можете сохранить URL-адрес функции в качестве переменной среды для дальнейшего использования.
PROJECT_ID=$(gcloud config get-value project) FUNCTION_URL="$(gcloud functions describe my-authenticated-function --gen2 --region us-central1 --format='get(serviceConfig.uri)')"
Убедитесь, что для работы функции требуется аутентификация, попытавшись вызвать её от имени анонимного пользователя.
Вызовите функцию без аутентификации, чтобы убедиться, что получите ожидаемую ошибку 403.
В командной строке выполните следующую команду curl :
curl $FUNCTION_URL
Вы увидите следующий результат:
<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>
Теперь вы готовы рассмотреть 3 сценария, в которых можно вызвать вашу функцию, предоставив аутентификацию.
4. Сценарий 1: Используйте свой токен идентификации gcloud.
Как разработчику, вам понадобится способ тестирования вашей функции во время локальной разработки . В этом разделе вы проведете быструю проверку, чтобы убедиться, что функция правильно аутентифицирована с использованием вашей собственной учетной записи.
Убедитесь, что вы авторизованы в gcloud , выполнив следующую команду:
gcloud auth list
Рядом с вашей активной учетной записью должна стоять звездочка, например:
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
После того, как вы убедитесь, что используете правильную учетную запись, сохраните адрес электронной почты учетной записи в переменную среды.
ACCOUNT_EMAIL=$(gcloud auth list --filter=status:ACTIVE --format="value(account)")
Более подробную информацию о настройке gcloud init и gcloud auth login можно найти в документации.
Далее вызовите функцию и передайте ей свой токен идентификации.
curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token)"
Теперь вы увидите результат:
Hello World!
Поиск неисправностей
Если вы получаете ошибку 403 Forbidden, убедитесь, что ваша учетная запись имеет роль Cloud Functions Invoker или Cloud Run Invoker для функций второго поколения. Вы можете использовать консоль IAM для проверки ролей, назначенных субъекту.
Хотя использование собственного токена идентификации — это бысткий способ протестировать вашу функцию во время разработки, вызывающей стороне вашей аутентифицированной функции потребуются соответствующие роли; в противном случае вызывающая сторона получит ошибку 403 Forbidden.
Следует придерживаться принципа минимальных привилегий , ограничив количество учетных записей и сервисных аккаунтов, которым разрешен вызов данной функции.
создание новой учетной записи службы и предоставление ей необходимых ролей, что.
5. Сценарий 2: Выдача себя за служебный аккаунт
В этом сценарии вы будете использовать учетную запись службы (то есть, принимать на себя права доступа) для вызова функции при локальной разработке и тестировании. Используя учетную запись службы, вы сможете тестировать свою функцию с теми же учетными данными, что и в рабочей среде.
Таким образом, вы не только проверите роли, но и будете следовать принципу минимальных привилегий, избегая необходимости предоставлять роль Cloud Function Invoker другим учетным записям только для целей локального тестирования.
Для выполнения этого практического задания вам потребуется создать новую учетную запись службы, которая будет иметь только роли, позволяющие вызывать функцию, созданную вами в этом задании.
Создайте новую учетную запись службы.
Сначала вам нужно будет создать несколько дополнительных переменных среды для представления учетных записей служб, используемых в командах gcloud.
SERVICE_ACCOUNT_NAME="invoke-functions-codelab" SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT_NAME@$PROJECT_ID.iam.gserviceaccount.com
Далее вам нужно будет создать учетную запись службы.
gcloud iam service-accounts create $SERVICE_ACCOUNT_NAME \ --display-name="Cloud Function Authentication codelab"
И предоставьте учетной записи службы роль вызывающего пользователя облачной функции.
gcloud functions add-iam-policy-binding my-authenticated-function \ --region=us-central1 --gen2 \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role='roles/cloudfunctions.invoker'
Вызовите функцию, используя учетную запись службы в качестве исполнителя.
Для этого вам потребуется имитировать недавно созданную учетную запись службы, получив ее идентификационный токен.
Добавьте необходимые роли для имитации пользователя.
Для имитации учетной записи службы вашей учетной записи пользователя необходима роль «Создатель токенов учетной записи службы» (roles/iam.serviceAccountTokenCreator) , чтобы сгенерировать идентификационный токен для учетной записи службы.
gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT_ADDRESS \ --member user:$ACCOUNT_EMAIL \ --role='roles/iam.serviceAccountTokenCreator'
Используйте идентификационный токен учетной записи службы.
Теперь вы можете вызвать функцию, передав идентификационный токен учетной записи службы.
curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token --impersonate-service-account $SERVICE_ACCOUNT_ADDRESS)"
И вы увидите следующее:
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. Сценарий 3: Использование клиентских библиотек Google.
В заключительной части практического занятия вы запустите небольшой сервис локально для генерации токена идентификации для учетной записи сервиса, а затем программно вызовете функцию, используя клиентские библиотеки Google Auth и учетные данные приложения по умолчанию (ADC) . Подробнее о клиентских библиотеках Google можно прочитать в разделе «Объяснение клиентских библиотек» документации.
Использование ADC особенно важно, когда вы хотите писать и тестировать свои функции локально (например, на ноутбуке, в Cloud Shell и т. д.), взаимодействуя при этом с другими ресурсами Google Cloud (например, Cloud Storage, Vision API и т. д.). В этом примере вы увидите, как сервис вызывает другую функцию, требующую аутентификации. Для получения дополнительной информации об ADC и локальной разработке см. статью в блоге «Как разрабатывать и тестировать облачные функции локально | Блог Google Cloud».
Выполните команду gcloud, чтобы имитировать учетную запись службы.
ADC автоматически находит учетные данные на основе среды приложения и использует их для аутентификации в API Google Cloud. Флаг –impersonate-service-account позволяет имитировать учетную запись службы, используя ее идентификационные данные для аутентификации в API Google Cloud.
Для имитации учетной записи службы можно выполнить следующую команду:
gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS
Теперь вы выполняете команды gcloud от имени этой учетной записи службы, а не от имени своей учетной записи.
Создайте и запустите сервис для вызова аутентифицированной функции.
Каждая среда выполнения имеет собственную библиотеку клиента Google Auth , которую вы можете установить. В этом практическом занятии вы узнаете, как создать и запустить приложение Node.js локально.
Вот шаги для работы с Node.js:
- Создайте новое приложение Node.js
npm init
- Установите клиентскую библиотеку Google Auth.
npm install google-auth-library
- Создайте файл
index.js - Получите URL-адрес вашей облачной функции, которую вы добавите в свой код на следующем шаге.
echo $FUNCTION_URL
- Добавьте следующий код в файл index.js. Убедитесь, что вы изменили переменную targetAudience на URL-адрес вашей облачной функции.
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;
});
- Запустите приложение
node index.js
И вы бы видели получившийся в результате "Привет, мир!"
Поиск неисправностей
Если вы видите ошибку «Доступ к ресурсу запрещен (или он может не существовать)» (Permission 'iam.serviceAccounts.getOpenIdToken' denied), подождите несколько минут, пока роль «Создатель токена учетной записи службы» будет применена.
Если вы получили ошибку "Невозможно получить токен ID в этой среде, используйте GCE или установите переменную среды GOOGLE_APPLICATION_CREDENTIALS на JSON-файл с учетными данными сервисной учетной записи", возможно, вы забыли выполнить команду.
gcloud auth application-default login --impersonate-service-account=$SERVICE_ACCOUNT_ADDRESS
7. Поздравляем!
Поздравляем с завершением практического занятия!
Мы рекомендуем ознакомиться с документацией по обеспечению безопасности облачных функций .
Мы также рекомендуем эту статью в блоге о локальной разработке с использованием Cloud Functions , чтобы узнать, как разрабатывать и тестировать ваши Cloud Function в локальной среде разработки.
Что мы рассмотрели
- Как настроить аутентификацию в облачной функции и проверить правильность ее настройки.
- Вызовите аутентифицированную функцию из локальной среды разработки, предоставив токен для вашей учетной записи gcloud.
- Как создать учетную запись службы и предоставить ей соответствующую роль для вызова функции?
- Как имитировать работу сервиса из локальной среды разработки, имеющей соответствующие роли для вызова функции.
8. Уборка
Чтобы избежать непреднамеренных списаний средств (например, если эта облачная функция будет случайно вызвана больше раз, чем предусмотрено вашим ежемесячным лимитом вызовов облачных функций в бесплатном тарифе ), вы можете либо удалить облачную функцию, либо удалить проект, созданный на шаге 2.
Чтобы прекратить использование учетной записи службы в качестве чужой, вы можете повторно войти в систему, используя свои личные данные:
gcloud auth application-default login
Чтобы удалить облачную функцию, перейдите в консоль облачных функций по адресу https://console.cloud.google.com/functions/ Убедитесь, что проект, созданный на шаге 2, является текущим выбранным проектом.
Выберите развернутую ранее функцию my-authenticated-function . Затем нажмите «Удалить» .
Если вы решите удалить весь проект, перейдите по ссылке https://console.cloud.google.com/cloud-resource-manager , выберите проект, созданный на шаге 2, и нажмите «Удалить». После удаления проекта вам потребуется изменить проекты в вашем Cloud SDK. Список всех доступных проектов можно просмотреть, выполнив gcloud projects list .