При создании расширения вы пишете его логику с помощью Cloud Functions, во многом так же, как если бы вы писали функцию, которая будет использоваться только в вашем собственном проекте. Вы объявляете функции в файле extension.yaml, и когда пользователи устанавливают расширение, эти функции развертываются в их проекте.
Общую информацию об использовании Cloud Functions можно найти в документации по Cloud Functions.
Cloud Functions первого и второго поколения
Firebase поддерживает Cloud Functions первого и второго поколения. Однако в настоящее время в Firebase Extensions есть некоторые ограничения на то, какое поколение функций Cloud Functions можно использовать с определенными типами триггеров. По этой причине многие расширения включают в себя сочетание функций первого и второго поколения.
Поддержка генерации функций указана ниже для каждого типа триггера.
Важные замечания
В некоторых определениях функций требуется указать информацию, которая также указана в файле
extension.yaml. Например, в Cloud Firestore есть методdocument(), который указывает шаблон документа для отслеживания, а в соответствующем объявлении вextension.yamlесть полеresource, которое указывает то же самое.В таких случаях используется конфигурация, указанная в файле
extension.yaml, а конфигурация, указанная в определении функции, игнорируется.Однако в целях документирования рекомендуется указывать настроенное значение в определении функции. Примеры на этой странице соответствуют этому шаблону.
В SDK Cloud Functions первого поколения есть метод
functions.config()и команда CLIfunctions:config:set, которые можно использовать для работы со значениями параметров в функциях первого поколения. Этот метод не поддерживается в Cloud Functions и не будет работать в расширении. Вместо этого используйте модульfunctions.params(рекомендуется) илиprocess.env.
TypeScript
Большая часть документации по разработке собственных расширений описывает рабочие процессы с использованием JavaScript для Cloud Functions for Firebase. Однако вы можете писать функции на TypeScript.
На самом деле все официальные расширения Firebase написаны на TypeScript. Вы можете изучить эти расширения, чтобы узнать, как использовать TypeScript в своем расширении.
Если вы пишете функции расширения на TypeScript, перед установкой расширения необходимо сделать следующее:
Скомпилируйте исходный код функций расширения в JavaScript.
Команда
firebase ext:dev:initпозволяет выбрать TypeScript для написания функций. Эта команда создает готовое к установке расширение, а также скрипт сборки, который можно запустить с помощьюnpm run build.Убедитесь, что в файле
package.jsonполеmainуказывает на сгенерированный код JavaScript.Если вы устанавливаете или загружаете расширение из локального источника, сначала скомпилируйте файлы TypeScript.
Поддерживаемые триггеры функций
HTTP-триггеры
Функция, вызываемая по HTTP, развертывается в общедоступной конечной точке https и выполняется при обращении к ней.
Информацию о том, как создавать функции, активируемые по HTTP, можно найти в статье Вызов функций с помощью HTTP-запросов в документации Cloud Functions.
Определение функции (только для первого поколения)
import { https } from "firebase-functions/v1";
export const yourFunctionName = https.onRequest(async (req, resp) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
runtime: nodejs16
httpsTrigger: {}
- name: anotherFunction
type: ...
Вызываемые функции
Вызываемые функции похожи на функции, активируемые по HTTP, но они реализуют протокол, который позволяет удобно вызывать их из клиентского кода.
Информацию о том, как использовать вызываемые функции, можно найти в статье Вызов функций из приложения в документации Cloud Functions.
Определение функции (только для первого поколения)
import { https } from "firebase-functions/v1";
export const yourFunctionName = https.onCall(async (data, context) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
runtime: nodejs16
httpsTrigger: {}
- name: anotherFunction
type: ...
Триггеры запланированных функций
Запланированная функция выполняется повторно по настраиваемому расписанию.
Информацию о том, как создавать функции по расписанию, можно найти в документации Cloud Functions.
Определение функции (только для первого поколения)
import { pubsub } from "firebase-functions/v1";
export const yourFunctionName = pubsub.schedule("every 6 hours").onRun((context) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
scheduleTrigger:
schedule: 'every 5 minutes'
- name: anotherFunction
type: ...
Доступные подполя для scheduleTrigger:
| Поле | Описание |
|---|---|
schedule(обязательно) |
Частота выполнения функции. В этом поле можно использовать строки с любым синтаксисом (обязательно заключенные в одинарные кавычки):
|
timeZone(необязательно) |
Часовой пояс, в котором будет выполняться расписание.
|
Если вы хотите, чтобы пользователи могли настраивать расписание при установке расширения, добавьте новый параметр в файл extension.yaml и укажите его в объявлении resource функции:
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
scheduleTrigger:
schedule: ${SCHEDULE_FREQUENCY}
- name: anotherFunction
type: ...
params:
- param: SCHEDULE_FREQUENCY
label: Schedule
description: How often do you want to run yourFunctionName()?
type: string
default: 'every 5 minutes' # Specifying a default is optional.
required: true
Триггеры очереди задач
Функция очереди задач запускается либо при событиях жизненного цикла расширения, либо при добавлении вручную в очередь задач расширения с помощью метода TaskQueue.enqueue() Admin SDK.
Информацию о том, как писать функции, обрабатывающие события жизненного цикла, можно найти в разделе Обработка событий жизненного цикла расширения.
Информацию о том, как писать функции очереди задач, можно найти в статье Добавление функций в очередь с помощью Cloud Tasks в документации Cloud Functions.
Определение функции (только для первого поколения)
import { tasks } from "firebase-functions/v1";
export const yourFunctionName = tasks.taskQueue().onDispatch(async (data, context) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: myTaskFunction
type: firebaseextensions.v1beta.function
description: >-
Perform a task when triggered by a lifecycle event
properties:
taskQueueTrigger: {}
Для свойства taskQueueTrigger задайте значение {} или набор параметров, которые настраивают ограничения частоты запросов и поведение очереди задач при повторных попытках (см. раздел Настройка очереди задач).
Если вы хотите, чтобы функция запускалась при событиях жизненного цикла расширения, добавьте записи lifecycleEvents с названием функции и необязательным сообщением об обработке, которое будет показываться в консоли Firebase при начале обработки.
lifecycleEvents:
onInstall:
function: myTaskFunction
processingMessage: Resizing your existing images
onUpdate:
function: myOtherTaskFunction
processingMessage: Setting up your extension
onConfigure:
function: myOtherTaskFunction
processingMessage: Setting up your extension
Analytics
Функция, активируемая Аналитикой, выполняется, когда регистрируется определенное событие Аналитики.
Информацию о том, как писать функции, активируемые Аналитикой, можно найти в разделе Триггеры Google Аналитики документации Cloud Functions.
Определение функции (только для первого поколения)
import { analytics } from "firebase-functions/v1";
export const yourFunctionName = analytics.event("event_name").onLog((event, context) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: providers/google.firebase.analytics/eventTypes/event.log
resource: projects/${PROJECT_ID}/events/ga_event
- name: anotherFunction
type: ...
Если вы хотите, чтобы пользователи могли настроить событие Analytics, которое будет отслеживать установку расширения, добавьте новый параметр в файл extension.yaml и укажите его в объявлении resource функции:
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: providers/google.firebase.analytics/eventTypes/event.log
resource: projects/${PROJECT_ID}/events/${EVENT_NAME}
- name: anotherFunction
type: ...
params:
- param: EVENT_NAME
label: Analytics event
description: What event do you want to respond to?
type: string
default: ga_event # Specifying a default is optional.
required: true
Authentication
Функция, активируемая аутентификацией, выполняется при создании или удалении пользователя.
Информацию о том, как писать функции, активируемые аутентификацией, можно найти в разделе Триггеры Firebase Authentication документации Cloud Functions.
Определение функции (только для первого поколения)
import { auth } from "firebase-functions/v1";
export const yourFunctionName = auth.user().onCreate((user, context) => {
// ...
});
export const yourFunctionName2 = auth.user().onDelete((user, context) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: providers/firebase.auth/eventTypes/user.create
resource: projects/${PROJECT_ID}
- name: anotherFunction
type: ...
В таблице ниже показано, как указать каждый из поддерживаемых типов событий Authentication.
| Триггер события Cloud Functions | eventType |
Описание |
|---|---|---|
onCreate() |
providers/firebase.auth/eventTypes/user.create |
Новый пользователь создан |
onDelete() |
providers/firebase.auth/eventTypes/user.delete |
Удаление аккаунта пользователя. |
Cloud Firestore
Функция, активируемая Cloud Firestore, запускается при создании, обновлении или удалении документа.
Информацию о написании функций, активируемых триггерами Firestore, можно найти в разделе Триггеры Cloud Firestore документации Cloud Functions.
Определение функции (только для первого поколения)
import { firestore } from "firebase-functions/v1";
export const yourFunctionName = firestore.document("collection/{doc_id}")
.onCreate((snapshot, context) => {
// ...
});
export const yourFunctionName2 = firestore.document("collection/{doc_id}")
.onUpdate((change, context) => {
// ...
});
export const yourFunctionName3 = firestore.document("collection/{doc_id}")
.onDelete((snapshot, context) => {
// ...
});
export const yourFunctionName4 = firestore.document("collection/{doc_id}")
.onWrite((change, context) => {
// onWrite triggers on creation, update, and deletion.
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: providers/cloud.firestore/eventTypes/document.write
resource: projects/${PROJECT_ID}/databases/(default)/documents/collection/{documentID}
- name: anotherFunction
type: ...
В таблице ниже показано, как указать каждый из поддерживаемых типов событий Cloud Firestore.
| Триггер события Cloud Functions | eventType |
Описание |
|---|---|---|
onCreate() |
providers/cloud.firestore/eventTypes/document.create |
Документ создан. |
onDelete() |
providers/cloud.firestore/eventTypes/document.delete |
Документ удален |
onUpdate() |
providers/cloud.firestore/eventTypes/document.update |
Документ обновлен |
onWrite() |
providers/cloud.firestore/eventTypes/document.write |
Документ создан, удален или обновлен. |
Если вы хотите, чтобы пользователи могли настраивать путь к документу при установке расширения, добавьте новый параметр в файл extension.yaml и укажите его в объявлении функции resource:
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: providers/cloud.firestore/eventTypes/document.write
resource: projects/${PROJECT_ID}/databases/(default)/documents/${YOUR_DOCUMENT_PATH}
- name: anotherFunction
type: ...
params:
- param: YOUR_DOCUMENT_PATH
label: Cloud Firestore path
description: Where do you want to watch for changes?
type: string
default: path/to/{documentID} # Specifying a default is optional.
required: true
Pub/Sub
Функция, активируемая Pub/Sub, запускается, когда сообщение публикуется в определенной теме.
Информацию о том, как писать функции, активируемые триггерами Pub/Sub, можно найти в разделе Триггеры Pub/Sub документации Cloud Functions.
Определение функции (только для первого поколения)
import { pubsub } from "firebase-functions/v1";
export const yourFunctionName = pubsub.topic("topic_name").onPublish((message, context) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: google.pubsub.topic.publish
resource: projects/${PROJECT_ID}/topics/topic-name
- name: anotherFunction
type: ...
Если вы хотите, чтобы пользователи могли настраивать тему Pub/Sub при установке расширения, добавьте новый параметр в файл extension.yaml и укажите его в объявлении функции resource:
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: google.pubsub.topic.publish
resource: projects/${PROJECT_ID}/topics/${PUBSUB_TOPIC}
- name: anotherFunction
type: ...
params:
- param: PUBSUB_TOPIC
label: Pub/Sub topic
description: Which Pub/Sub topic do you want to watch for messages?
type: string
default: topic-name # Specifying a default is optional.
required: true
Realtime Database
Функция, активируемая Realtime Database, запускается, когда создается, обновляется или удаляется путь, соответствующий указанному шаблону.
Информацию о том, как создавать функции, активируемые триггерами RTDB, можно найти в разделе Триггеры Realtime Database документации Cloud Functions.
Определение функции (только для первого поколения)
import { database } from "firebase-functions/v1";
export const yourFunctionName = database.ref("path/to/{item}")
.onCreate((snapshot, context) => {
// ...
});
export const yourFunctionName2 = database.ref("path/to/{item}")
.onUpdate((change, context) => {
// ...
});
export const yourFunctionName3 = database.ref("path/to/{item}")
.onDelete((snapshot, context) => {
// ...
});
export const yourFunctionName4 = database.ref("path/to/{item}")
.onWrite((change, context) => {
// onWrite triggers on creation, update, and deletion.
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: providers/google.firebase.database/eventTypes/ref.create
# DATABASE_INSTANCE (project's default instance) is an auto-populated
# parameter value. You can also specify an instance.
resource: projects/_/instances/${DATABASE_INSTANCE}/refs/path/to/{itemId}
- name: anotherFunction
type: ...
В таблице ниже показано, как указать каждый из поддерживаемых типов событий Cloud Firestore.
| Триггер события Cloud Functions | eventType |
Описание |
|---|---|---|
onCreate() |
providers/google.firebase.database/eventTypes/ref.create |
Данные созданы |
onDelete() |
providers/google.firebase.database/eventTypes/ref.delete |
Данные удалены. |
onUpdate() |
providers/google.firebase.database/eventTypes/ref.update |
Данные обновлены |
onWrite() |
providers/google.firebase.database/eventTypes/ref.write |
Данные созданы, удалены или обновлены. |
Если вы хотите, чтобы пользователи могли настраивать путь для отслеживания при установке расширения, добавьте новый параметр в файл extension.yaml и укажите его в объявлении функции resource:
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: providers/google.firebase.database/eventTypes/ref.create
# DATABASE_INSTANCE (project's default instance) is an auto-populated
# parameter value. You can also specify an instance.
resource: projects/_/instances/${DATABASE_INSTANCE}/refs/${DB_PATH}
- name: anotherFunction
type: ...
params:
- param: DB_PATH
label: Realtime Database path
description: Where do you want to watch for changes?
type: string
default: path/to/{itemId} # Specifying a default is optional.
required: true
Remote Config
Функция, активируемая Remote Config, запускается при обновлении шаблона параметров проекта.
Информацию о том, как писать функции, активируемые Remote Config, можно найти в разделе Триггеры Remote Config документации Cloud Functions.
Определение функции (только для первого поколения)
import { remoteConfig } from "firebase-functions/v1";
export const yourFunctionName = remoteConfig.onUpdate((version, context) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: google.firebase.remoteconfig.update
resource: projects/${PROJECT_ID}
- name: anotherFunction
type: ...
Cloud Storage
Функция, активируемая Cloud Storage, выполняется, когда объект создается, архивируется или удаляется, а также когда изменяются его метаданные.
Информацию о том, как писать функции, активируемые триггерами Cloud Storage, можно найти в документации по триггерам Cloud Storage для Cloud Functions.
Определение функции (только для первого поколения)
import { storage } from "firebase-functions/v1";
export const yourFunctionName = storage.object().onFinalize((object, context) => {
// ...
});
export const yourFunctionName2 = storage.object().onMetadataUpdate((object, context) => {
// ...
});
export const yourFunctionName3 = storage.object().onArchive((object, context) => {
// ...
});
export const yourFunctionName4 = storage.object().onDelete((object, context) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: google.storage.object.finalize
# STORAGE_BUCKET (project's default bucket) is an auto-populated
# parameter. You can also specify a bucket.
resource: projects/_/buckets/${STORAGE_BUCKET}
- name: anotherFunction
type: ...
В таблице ниже показано, как указать каждый из поддерживаемых типов событий Cloud Storage.
| Триггер события Cloud Functions | eventType |
Описание |
|---|---|---|
onFinalize() |
google.storage.object.finalize |
Объект создан |
onMetadataUpdate() |
google.storage.object.metadataUpdate |
Метаданные объекта обновлены |
onArchive() |
google.storage.object.archive |
Объект отправлен в архив. |
onDelete() |
google.storage.object.delete |
Объект удален. |
Если вы хотите, чтобы пользователи могли настраивать сегмент хранилища при установке расширения, добавьте новый параметр в файл extension.yaml и укажите его в объявлении resource функции:
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: google.storage.object.finalize
resource: projects/_/buckets/${YOUR_BUCKET}
- name: anotherFunction
type: ...
params:
- param: YOUR_BUCKET
label: Cloud Storage bucket
description: Which bucket do you want to watch for changes?
type: selectResource
resourceType: storage.googleapis.com/Bucket
default: ${STORAGE_BUCKET} # Specifying a default is optional.
required: true
Test Lab
Функция, активируемая Test Lab, запускается, когда матрица тестов завершает тестирование.
Информацию о том, как писать функции, активируемые Test Lab, можно найти в разделе Триггеры Firebase Test Lab документации Cloud Functions.
Определение функции (только для первого поколения)
import { testLab } from "firebase-functions/v1";
export const yourFunctionName = testLab.testMatrix().onComplete((matrix, context) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourFunctionName
type: firebaseextensions.v1beta.function
properties:
eventTrigger:
eventType: google.testing.testMatrix.complete
resource: projects/${PROJECT_ID}/testMatrices/{matrixId}
- name: anotherFunction
type: ...
Crashlytics триггер оповещений
Функция, активируемая Crashlytics, запускается, когда Crashlytics публикует оповещение.
Информацию о том, как писать функции, активируемые оповещениями, можно найти в разделе Триггеры оповещений Firebase документации Cloud Functions.
Определение функции (только для 2-го поколения)
import {
onNewFatalIssuePublished,
onNewNonfatalIssuePublished,
onNewAnrIssuePublished,
onRegressionAlertPublished,
onVelocityAlertPublished,
onStabilityDigestPublished,
} from "firebase-functions/v2/alerts/crashlytics";
export const yourFunctionName = onNewFatalIssuePublished((event) => {
// ...
});
export const yourFunctionName2 = onNewNonfatalIssuePublished((event) => {
// ...
});
export const yourFunctionName3 = onNewAnrIssuePublished((event) => {
// ...
});
export const yourFunctionName4 = onRegressionAlertPublished((event) => {
// ...
});
export const yourFunctionName5 = onVelocityAlertPublished((event) => {
// ...
});
export const yourFunctionName6 = onStabilityDigestPublished((event) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourfunctionname
type: firebaseextensions.v1beta.v2function
properties:
buildConfig:
runtime: nodejs16
serviceConfig:
availableMemory: 512M
eventTrigger:
eventType: google.firebase.firebasealerts.alerts.v1.published
triggerRegion: global
eventFilters:
- attribute: alerttype
value: crashlytics.newFatalIssue
- name: anotherFunction
type: ...
Для alerttype можно использовать следующие значения:
crashlytics.newFatalIssuecrashlytics.newNonfatalIssuecrashlytics.regressioncrashlytics.stabilityDigestcrashlytics.velocitycrashlytics.newAnrIssue
Performance Monitoring триггер оповещений
Функция, активируемая Performance Monitoring, запускается, когда Performance Monitoring публикует оповещение.
Информацию о том, как писать функции, активируемые оповещениями, можно найти в разделе Триггеры оповещений Firebase документации Cloud Functions.
Определение функции (только для 2-го поколения)
import { onThresholdAlertPublished } from "firebase-functions/v2/alerts/performance";
export const yourFunctionName = onThresholdAlertPublished((event) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourfunctionname
type: firebaseextensions.v1beta.v2function
properties:
buildConfig:
runtime: nodejs16
serviceConfig:
availableMemory: 512M
eventTrigger:
eventType: google.firebase.firebasealerts.alerts.v1.published
triggerRegion: global
eventFilters:
- attribute: alerttype
value: performance.threshold
- name: anotherFunction
type: ...
App Distribution триггер оповещений
Функция, активируемая App Distribution, запускается, когда App Distribution публикует оповещение.
Информацию о том, как писать функции, активируемые оповещениями, можно найти в разделе Триггеры оповещений Firebase документации Cloud Functions.
Определение функции (только для 2-го поколения)
import {
onNewTesterIosDevicePublished,
onInAppFeedbackPublished
} from "firebase-functions/v2/alerts/appDistribution";
export const yourFunctionName = onNewTesterIosDevicePublished((event) => {
// ...
});
export const yourFunctionName2 = onInAppFeedbackPublished((event) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourfunctionname
type: firebaseextensions.v1beta.v2function
properties:
buildConfig:
runtime: nodejs16
serviceConfig:
availableMemory: 512M
eventTrigger:
eventType: google.firebase.firebasealerts.alerts.v1.published
triggerRegion: global
eventFilters:
- attribute: alerttype
value: appDistribution.inAppFeedback
- name: anotherFunction
type: ...
Для alerttype можно использовать следующие значения:
appDistribution.newTesterIosDeviceappDistribution.inAppFeedback
Триггеры пользовательских событий (Eventarc)
Функция, активируемая Eventarc, выполняется, когда событие определенного типа публикуется в определенном канале.
Информацию о том, как создавать функции, активируемые Eventarc, можно найти в статье Создание и обработка триггеров специальных событий в документации Cloud Functions.
Вы также можете публиковать события из расширений, чтобы пользователи могли вставлять в них собственную логику. Подробнее о том, как использовать в расширении специальную логику, предоставленную разработчиком…
Определение функции (только для 2-го поколения)
import { onCustomEventPublished } from "firebase-functions/v2/eventarc";
export const yourFunctionName = onCustomEventPublished((event) => {
// ...
});
Декларация ресурса (extension.yaml)
resources:
- name: yourfunctionname
type: firebaseextensions.v1beta.v2function
properties:
# LOCATION is a user-configured parameter value specified by the user
# during installation.
location: ${param:LOCATION}
buildConfig:
runtime: nodejs16
serviceConfig:
availableMemory: 512M
timeoutSeconds: 60
eventTrigger:
eventType: firebase.extensions.storage-resize-images.v1.complete
channel: projects/${param:PROJECT_ID}/locations/us-central1/channels/firebase
- name: anotherFunction
type: ...
Канал должен существовать на момент установки расширения. Например, если вы зависите от специальных событий из другого расширения, которое создает канал, попросите пользователей сначала установить это расширение.
В примере выше создается триггер специального события для канала Firebase по умолчанию в регионе us-central1. Вы можете сделать название канала и регион настраиваемыми с помощью параметров. Пример:
params:
- param: EVENTARC_CHANNEL_NAME
label: Eventarc channel name
description: What is the name of the Eventarc channel.
default: firebase
type: string
required: true
resources:
- name: yourfunctionname
type: firebaseextensions.v1beta.v2function
properties:
location: ${param:LOCATION}
eventTrigger:
eventType: firebase.extensions.storage-resize-images.v1.complete
channel: projects/${param:PROJECT_ID}/locations/${param:LOCATION}/channels/${param:EVENTARC_CHANNEL_NAME}