1. Введение
Обзор
Cloud Run Functions — это легковесное вычислительное решение для разработчиков, позволяющее создавать автономные функции, выполняющие одну задачу, которые можно запускать по протоколу HTTPS или которые могут реагировать на события CloudEvents без необходимости управления сервером или средой выполнения. Подробнее о Cloud Run Functions читайте в нашей статье в блоге .
Существует два основных подхода к управлению вызовами функций Cloud Run: защита доступа на основе идентификации и защита доступа с использованием сетевых средств контроля доступа . В этом практическом занятии мы рассмотрим первый подход и проведем вас через 3 сценария защиты доступа на основе идентификации для вызова функции:
- Используйте свой токен идентификации gcloud для вызова функции в целях локальной разработки и тестирования.
- При локальной разработке и тестировании используйте учетную запись службы, чтобы применять те же учетные данные, что и в рабочей среде.
- Используйте клиентские библиотеки Google для обработки аутентификации к API Google Cloud, например, когда сервису необходимо вызвать функцию.
Что вы узнаете
- Как настроить аутентификацию в функции Cloud Run и проверить правильность ее настройки.
- Вызовите аутентифицированную функцию из локальной среды разработки, предоставив токен для вашей учетной записи gcloud.
- Как создать учетную запись службы и предоставить ей соответствующую роль для вызова функции?
- Как имитировать работу сервиса из локальной среды разработки, имеющей соответствующие роли для вызова функции.
2. Настройка и требования
Предварительные требования
- Вы вошли в облачную консоль.
- Вы ранее развернули функцию Cloud Run, запускаемую по протоколу 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 Run с аутентификацией.
Требование аутентификации означает, что субъект, вызывающий функцию, должен иметь роль Cloud Run Invoker; в противном случае функция вернет ошибку 403 Forbidden. В этом практическом занятии будет показано , как предоставить субъекту соответствующие роли Invoker .
Настройка локальных переменных окружения для упрощения команд gcloud.
Сначала вы создадите несколько переменных окружения, чтобы улучшить читаемость команд gcloud , используемых в этом практическом занятии.
REGION=us-central1 PROJECT_ID=$(gcloud config get-value project)
Создайте исходный код для функции.
Хотя в этом практическом занятии используется Node.js, вы можете использовать любую среду выполнения, поддерживаемую клиентскими библиотеками Google Auth.
Сначала создайте директорию и перейдите в неё с помощью команды `cd`.
mkdir auth-function-codelab && cd $_
Затем создайте файл package.json.
touch package.json
echo '{
"dependencies": {
"@google-cloud/functions-framework": "^3.0.0"
}
}
' > package.json
Далее создайте исходный файл index.js.
touch index.js
echo 'const functions = require("@google-cloud/functions-framework");
functions.http("helloWorld", (req, res) => {
res.send(`Hello ${req.query.name || req.body.name || "World"}!`);
});' > index.js
Создайте функцию аутентификации.
Ниже описаны шаги по созданию аутентифицированной функции для среды выполнения Node.js20. Однако вы можете использовать любую среду выполнения, поддерживаемую клиентскими библиотеками Google Auth .
FUNCTION_NAME=authenticated-function-codelab ENTRY_POINT=helloWorld
Чтобы развернуть функцию Cloud Run непосредственно в Cloud Run, выполните следующую команду:
gcloud beta run deploy $FUNCTION_NAME \
--source . \
--function helloWorld \
--region $REGION \
--no-allow-unauthenticated
Затем вы можете сохранить URL-адрес функции в качестве переменной среды для дальнейшего использования.
FUNCTION_URL="$(gcloud run services describe $FUNCTION_NAME --region $REGION --format 'value(status.url)')"
Если вы предпочитаете развертывание в качестве Cloud Functions 2-го поколения, используйте следующую команду:
gcloud functions deploy nodejs-http-function \ --gen2 \ --runtime=nodejs20 \ --region=$REGION \ --source=. \ --entry-point=helloWorld \ --trigger-http \ --no-allow-unauthenticated
Затем вы можете сохранить URL-адрес функции в качестве переменной среды для дальнейшего использования.
FUNCTION_URL="$(gcloud functions describe $FUNCTION_NAME --gen2 --region us-central1 --format='get(serviceConfig.uri)')"
Убедитесь, что для работы функции требуется аутентификация, попытавшись вызвать её от имени анонимного пользователя.
Вызовите функцию без аутентификации, чтобы убедиться, что получите ожидаемую ошибку 403.
В командной строке выполните следующую команду curl :
curl -i $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`
Более подробную информацию о настройке gcloud init и gcloud auth login можно найти в документации.
Далее вызовите функцию и передайте ей свой токен идентификации.
curl $FUNCTION_URL -H "Authorization: bearer $(gcloud auth print-identity-token)"
Теперь вы увидите результат:
Hello World!
Поиск неисправностей
Если вы получаете ошибку 403 Forbidden, убедитесь, что ваша учетная запись имеет роль 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 Run function Authentication codelab"
И предоставьте учетной записи службы роль вызывающего пользователя Cloud Run:
gcloud run services add-iam-policy-binding $FUNCTION_NAME \ --region=us-central1 \ --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \ --role='roles/run.invoker'
Вызовите функцию, используя учетную запись службы в качестве исполнителя.
Для этого вам потребуется имитировать недавно созданную учетную запись службы, получив ее идентификационный токен.
Добавьте необходимые роли для имитации пользователя.
Для имитации учетной записи службы вашей учетной записи пользователя необходима роль «Создатель токенов учетной записи службы» (roles/iam.serviceAccountTokenCreator) , чтобы сгенерировать идентификационный токен для учетной записи службы.
Для предоставления этой роли вашей активной учетной записи пользователя можно выполнить следующие команды:
ACCOUNT_EMAIL=$(gcloud auth list --filter=status:ACTIVE --format="value(account)") 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:
- Создайте новую директорию.
mkdir local-dev && cd $_
- Создайте новое приложение Node.js
npm init -y
- Установите клиентскую библиотеку Google Auth.
npm install google-auth-library
- Создайте файл
index.js - Получите URL-адрес вашей функции Cloud Run, который вы добавите в свой код на следующем шаге.
echo $FUNCTION_URL
- Добавьте следующий код в файл index.js. Убедитесь, что переменная targetAudience содержит URL-адрес вашей функции Cloud Run.
index.js
// Cloud Functions uses your function's url as the `targetAudience` value
const targetAudience = '<YOUR-CLOUD-RUN-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 Run .
Мы также рекомендуем эту статью в блоге о локальной разработке с использованием функций Cloud Run, чтобы узнать, как разрабатывать и тестировать функции Cloud Run в локальной среде разработки.
Что мы рассмотрели
- Как настроить аутентификацию в функции Cloud Run и проверить правильность ее настройки.
- Вызовите аутентифицированную функцию из локальной среды разработки, предоставив токен для вашей учетной записи gcloud.
- Как создать учетную запись службы и предоставить ей соответствующую роль для вызова функции?
- Как имитировать работу сервиса из локальной среды разработки, имеющей соответствующие роли для вызова функции.
8. Уборка
Чтобы избежать непреднамеренных списаний средств (например, если эта облачная функция будет случайно вызвана больше раз, чем предусмотрено вашим ежемесячным лимитом вызовов облачных функций в бесплатном тарифе ), вы можете либо удалить облачную функцию, либо удалить проект, созданный на шаге 2.
Чтобы прекратить использование учетной записи службы в качестве чужой, вы можете повторно войти в систему, используя свои личные данные:
gcloud auth application-default login
Чтобы удалить функцию Cloud Run, перейдите в консоль Cloud Run по адресу https://console.cloud.google.com/functions/ Убедитесь, что проект, созданный на шаге 2, является текущим выбранным проектом.
Выберите развернутую ранее функцию my-authenticated-function . Затем нажмите «Удалить» .
Если вы решите удалить весь проект, перейдите по ссылке https://console.cloud.google.com/cloud-resource-manager , выберите проект, созданный на шаге 2, и нажмите «Удалить». После удаления проекта вам потребуется изменить проекты в вашем Cloud SDK. Список всех доступных проектов можно просмотреть, выполнив gcloud projects list .