Начало работы с функциями Cloud Run, управляемыми событиями

1. Введение

Обзор

Функции Cloud Run — это новый способ развертывания рабочих нагрузок с использованием знакомых парадигм обработки событий GCF и сигнатур функций. Вместо использования нашего самоуверенного процесса сборки и конфигураций развертывания функции Cloud Run дают вам прямой контроль над базовой Службой, созданной в Cloud Run.

С помощью функций Cloud Run мы предоставляем простой пользовательский интерфейс развертывания исходного кода Cloud Run, предоставляя разработчикам полный контроль над своими рабочими нагрузками с помощью конфигураций Cloud Run.

В этом разделе вы узнаете, как развернуть функцию, управляемую событиями, в Node. Вы развернете функцию, которая срабатывает всякий раз, когда объект завершается в корзине Google Cloud Storage.

В приведенных ниже примерах в этой лаборатории кода используются образцы nodejs. Однако вы можете использовать примеры кода Cloud Functions 2-го поколения на выбранном вами языке:

Что вы узнаете

  • Как развернуть функцию Cloud Run, управляемую событиями, которая срабатывает всякий раз, когда объект загружается в корзину GCS.
  • Как создать учетную запись службы с соответствующими ролями для получения событий из Cloud Storage и вызова функции Cloud Run

2. Настройте переменные среды и включите API.

Обновить интерфейс командной строки gcloud

Для этой лаборатории кода требуется последняя версия установленного интерфейса командной строки gcloud. Вы можете обновить CLI, запустив

gcloud components update

Включить API

Прежде чем вы сможете начать использовать эту кодовую лабораторию, вам необходимо включить несколько API. Для этой лаборатории кода требуется использование следующих API. Вы можете включить эти API, выполнив следующую команду:

gcloud services enable run.googleapis.com \
    cloudbuild.googleapis.com \
    storage.googleapis.com \
    artifactregistry.googleapis.com

Настройка переменных среды

Вы можете установить переменные среды, которые будут использоваться в этой лаборатории кода.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION, e.g. us-central1>

gcloud config set project $PROJECT_ID
SERVICE_NAME=crf-event-codelab
BUCKET_NAME=$PROJECT_ID-$SERVICE_NAME
TRIGGER_NAME=$SERVICE_NAME-trigger

3. Создайте сегмент хранения и учетную запись службы.

Создайте сегмент хранения

Вы можете создать корзину Cloud Storage, выполнив следующую команду:

gsutil mb -l us-central1 gs://$BUCKET_NAME

Создать учетную запись службы

В этом примере вы создадите учетную запись службы с необходимыми разрешениями EventArc и ролью инициатора Cloud Run, чтобы получать события из Cloud Storage и вызывать функцию Cloud Run.

Сначала создайте учетную запись службы.

PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)')

SERVICE_ACCOUNT="cloud-run-functions"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run functions Eventarc service account"

Затем предоставьте роль получателя событий Eventarc (roles/eventarc.eventReceiver) в проекте учетной записи службы, связанной с вашим триггером Eventarc, чтобы триггер мог получать события от поставщиков событий.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/eventarc.eventReceiver

Затем предоставьте учетной записи службы роль инициатора Cloud Run, чтобы она могла вызывать функцию.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

4. Создайте и разверните функцию

Сначала создайте каталог для исходного кода и перейдите в этот каталог.

mkdir ../$SERVICE_NAME && cd $_

Затем создайте файл package.json со следующим содержимым:

{
    "dependencies": {
        "@google-cloud/functions-framework": "^3.0.0"
    }
}

Затем создайте файл index.js со следующим содержимым:

const functions = require("@google-cloud/functions-framework");

// Register a CloudEvent callback with the Functions Framework that will
// be triggered by Cloud Storage.
functions.cloudEvent("helloGCS", (cloudEvent) => {
    console.log(`Event ID: ${cloudEvent.id}`);
    console.log(`Event Type: ${cloudEvent.type}`);

    const file = cloudEvent.data;
    console.log(`Bucket: ${file.bucket}`);
    console.log(`File: ${file.name}`);
    console.log(`Metageneration: ${file.metageneration}`);
    console.log(`Created: ${file.timeCreated}`);
    console.log(`Updated: ${file.updated}`);
});

Теперь вы можете развернуть функцию Cloud Run, выполнив следующую команду:

gcloud beta run deploy $SERVICE_NAME \
 --source . \
      --function helloGCS \
      --region $REGION \
      --no-allow-unauthenticated

Обратите внимание на следующее:

  • флаг –source используется, чтобы сообщить Cloud Run о необходимости создания функции в работоспособном сервисе на основе контейнера.
  • флаг –function (новый) используется для установки точки входа новой службы в качестве сигнатуры функции, которую вы хотите вызвать.
  • (необязательно) –no-allow-unauthenticated, чтобы предотвратить публичный вызов вашей функции.

Вы можете просмотреть новую службу crf-nodejs-event выполнив следующую команду:

gcloud beta run services describe $SERVICE_NAME

5. Создайте мероприятие

Мы можем создать триггер Eventarc для отправки сообщений в нашу функцию каждый раз, когда объект завершается в Google Cloud Storage:

BUCKET_REGION=$REGION

gcloud eventarc triggers create $TRIGGER_NAME \
     --location=$REGION \
     --destination-run-service=crf-nodejs-event \
  --destination-run-region=$BUCKET_REGION \
     --event-filters="type=google.cloud.storage.object.v1.finalized" \
     --event-filters="bucket=$BUCKET_NAME" \
     --service-account=$SERVICE_ACCOUNT_ADDRESS

Обратите внимание на следующее:

  • gcs-function-trigger — имя триггера
  • crf-nodejs-event — это имя службы Cloud Run, где развернута наша функция.
  • для флага –event-filters не используйте префикс gs:// в имени корзины.

Подробное руководство по настройке службы Trigger из облачного хранилища с помощью Eventarc можно найти в документации Cloud Run здесь: https://cloud.google.com/run/docs/tutorials/eventarc.

6. Проверьте функцию

Когда развертывание будет завершено, вы увидите URL-адрес службы. Чтобы вызвать эту функцию, вам необходимо отправить аутентифицированный запрос с вашим токеном удостоверения или жетокеном удостоверения принципала, имеющего роль Cloud Run Invoker, как показано ниже:

# get the Service URL
SERVICE_URL="$(gcloud run services describe crf-nodejs-event --region us-central1 --format 'value(status.url)')"

# invoke the service
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" -X GET $SERVICE_URL

Когда наша функция развернута и создан триггер, мы готовы вызвать функцию.

Создайте файл и загрузите его в корзину Cloud Storage. Вы можете сделать это через веб-интерфейс Cloud Console или с помощью инструмента CLI gsutil, например

echo "hello world" > test.txt
gsutil cp test gs://$BUCKET_NAME

Когда файл будет успешно загружен, будет сгенерировано событие, и ваша функция выведет некоторую базовую информацию об объекте, например имя файла. Этот вывод можно найти в записях журнала функции в Cloud Console. Альтернативно вы можете запросить эти выходные данные с помощью интерфейса командной строки gcloud:

gcloud logging read "resource.labels.service_name=crf-nodejs-event AND textPayload: File" --format=json 

и вы должны увидеть следующий вывод

"textPayload": "File: test.txt"

7. Поздравляем!

Поздравляем с завершением работы над кодом!

Рекомендуем просмотреть документацию по функциям Cloud Run.

Что мы рассмотрели

  • Как развернуть функцию Cloud Run, управляемую событиями, которая срабатывает всякий раз, когда объект загружается в корзину GCS.
  • Как создать учетную запись службы с соответствующими ролями для получения событий из Cloud Storage и вызова функции Cloud Run

8. Очистка

Чтобы избежать непреднамеренных расходов (например, если эта услуга Cloud Run случайно вызывается больше раз, чем выделено ежемесячное количество вызовов Cloud Run на уровне бесплатного пользования ), вы можете либо удалить службу Cloud Run, либо удалить проект, созданный на шаге 2.

Чтобы удалить службы Cloud Run, перейдите в облачную консоль Cloud Run по адресу https://console.cloud.google.com/run/ и удалите службу crf-event-codelab созданную в этой лаборатории кода.

Если вы решите удалить весь проект, вы можете перейти на https://console.cloud.google.com/cloud-resource-manager , выбрать проект, созданный на шаге 2, и нажать «Удалить». Если вы удалите проект, вам придется изменить проекты в Cloud SDK. Вы можете просмотреть список всех доступных проектов, запустив gcloud projects list .