āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ Google Cloud Tasks āϏā§āĻŦāĻŋāϧāĻž āĻā§āϰāĻšāĻŖ āĻāϰ⧠āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒāĻā§ āĻāĻĒāύāĻžāϰ āĻĒā§āϰāϧāĻžāύ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ āĻĒā§āϰāĻŦāĻžāĻšā§āϰ āĻŦāĻžāĻāϰ⧠āĻ ā§āϝāĻžāϏāĻŋāĻā§āĻā§āϰā§āύāĻžāϏāĻāĻžāĻŦā§ āϏāĻŽāϝāĻŧ-āϏāĻžāĻĒā§āĻā§āώ, āϏāĻāϏā§āĻĨāĻžāύ-āύāĻŋāĻŦāĻŋāĻĄāĻŧ āĻŦāĻž āĻŦā§āϝāĻžāύā§āĻĄāĻāĻāĻĨ-āϏā§āĻŽāĻŋāϤ āĻāĻžāĻāĻā§āϞāĻŋ āĻāĻžāϞāĻžāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§ā§ˇ
āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻāϞā§āĻĒāύāĻž āĻāϰā§āύ āϝ⧠āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āϰā§āĻ āϏā§āĻŽāĻž āϏāĻš āĻāĻāĻāĻŋ API āĻ āĻšā§āϏā§āĻ āĻāϰāĻž āĻāĻŋāϤā§āϰ āĻĢāĻžāĻāϞāĻā§āϞāĻŋāϰ āĻāĻāĻāĻŋ āĻŦāĻĄāĻŧ āϏā§āĻā§āϰ āĻŦā§āϝāĻžāĻāĻāĻĒ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻāĻžāύ⧎ āϏā§āĻ API-āĻāϰ āĻāĻāĻāύ āĻĻāĻžāϝāĻŧāĻŋāϤā§āĻŦāĻļā§āϞ āĻā§āĻā§āϤāĻž āĻšāĻāϝāĻŧāĻžāϰ āĻāύā§āϝ, āĻāĻĒāύāĻžāĻā§ āϤāĻžāĻĻā§āϰ āĻšāĻžāϰā§āϰ āϏā§āĻŽāĻžāĻā§ āϏāĻŽā§āĻŽāĻžāύ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āĻāĻāĻžāĻĄāĻŧāĻžāĻ, āĻāĻ āϧāϰāύā§āϰ āĻĻā§āϰā§āĻāĻŽā§āϝāĻŧāĻžāĻĻā§ āĻāĻžāĻ āĻāĻžāĻāĻŽāĻāĻāĻ āĻāĻŦāĻ āĻŽā§āĻŽāϰāĻŋ āϏā§āĻŽāĻžāϰ āĻāĻžāϰāĻŖā§ āĻŦā§āϝāϰā§āĻĨāϤāĻžāϰ āĻāύā§āϝ āĻā§āĻāĻāĻŋāĻĒā§āϰā§āĻŖ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻāĻ āĻāĻāĻŋāϞāϤāĻž āĻĒā§āϰāĻļāĻŽāĻŋāϤ āĻāϰāĻžāϰ āĻāύā§āϝ, āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϞāĻŋāĻāϤ⧠āĻĒāĻžāϰā§āύ āϝāĻž scheduleTime
, āĻāĻŦāĻ dispatchDeadline
āĻŽāϤ⧠āĻŽā§āϞāĻŋāĻ āĻāĻžāϏā§āĻ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋ āϏā§āĻ āĻāϰ⧠āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ⧠Cloud Tasks āĻāĻāĻāĻŋ āϏāĻžāϰāĻŋāϤ⧠āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻšāϏā§āϤāĻžāύā§āϤāϰ āĻāϰā§ā§ˇ Cloud Tasks āĻāύāĻāĻžāϝāĻŧāϰāύāĻŽā§āύā§āĻ āĻŦāĻŋāĻļā§āώāĻāĻžāĻŦā§ āĻĄāĻŋāĻāĻžāĻāύ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āĻāĻžāϰā§āϝāĻāϰ āĻāύāĻā§āĻļāύ āĻāύā§āĻā§āϰā§āϞ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŦāĻ āĻāĻ āϧāϰāύā§āϰ āĻā§āϰāĻŋāϝāĻŧāĻžāĻāϞāĻžāĻĒāĻā§āϞāĻŋāϰ āĻāύā§āϝ āĻĒā§āύāϰāĻžāϝāĻŧ āĻā§āώā§āĻāĻž āĻāϰāĻžāϰ āύā§āϤāĻŋāĻā§āϞāĻŋ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāĻžāϰ āĻāύā§āϝ⧎
Cloud Functions for Firebase āĻāύā§āϝ Firebase SDK āĻāĻŦāĻ āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋ āĻĢāĻžāĻāĻļāύ āϏāĻŽāϰā§āĻĨāύ āĻāϰāĻžāϰ āĻāύā§āϝ Firebase Admin SDK v10.2.0 āĻāĻŦāĻ āĻāĻā§āĻāϤāϰ āĻāϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻ āĻĒāĻžāϰā§āĻāĻŋāĻ āĻāϰā§āĨ¤
āĻĢāĻžāϝāĻŧāĻžāϰāĻŦā§āϏā§āϰ āϏāĻžāĻĨā§ āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϞ⧠Cloud Tasks āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāϰāĻŖā§āϰ āĻāύā§āϝ āĻāĻžāϰā§āĻ āĻšāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāϰāĻ āϤāĻĨā§āϝā§āϰ āĻāύā§āϝ Cloud Tasks āĻŽā§āϞā§āϝ āĻĻā§āĻā§āύāĨ¤
āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϤā§āϰāĻŋ āĻāϰā§āύ
āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤā§, āĻāĻ āĻāϝāĻŧāĻžāϰā§āĻāĻĢā§āϞ⧠āĻ āύā§āϏāϰāĻŖ āĻāϰā§āύ:
- Cloud Functions āĻāύā§āϝ Firebase SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϞāĻŋāĻā§āύāĨ¤
- āĻāĻāĻāĻŋ HTTP āĻ āύā§āϰā§āϧā§āϰ āϏāĻžāĻĨā§ āĻāĻāĻŋ āĻā§āϰāĻŋāĻāĻžāϰ āĻāϰ⧠āĻāĻĒāύāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻĒāϰā§āĻā§āώāĻž āĻāϰā§āύāĨ¤
- Firebase CLI āĻāϰ āϏāĻžāĻĨā§ āĻāĻĒāύāĻžāϰ āĻĢāĻžāĻāĻļāύ āϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύāĨ¤ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āĻāĻĒāύāĻžāϰ āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, CLI āĻāĻĒāύāĻžāϰ āϏā§āϰā§āϏ āĻā§āĻĄā§ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋ (āϰā§āĻ āϏā§āĻŽāĻŋāϤ āĻāϰāĻž āĻāĻŦāĻ āĻĒā§āύāϰāĻžāϝāĻŧ āĻā§āώā§āĻāĻž) āϏāĻš Cloud Tasks āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋ āϤā§āϰāĻŋ āĻāϰāĻŦā§āĨ¤
- āϏāĻĻā§āϝ āύāĻŋāϰā§āĻŽāĻŋāϤ āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋāϤ⧠āĻāĻžāĻāĻā§āϞāĻŋ āϝā§āĻ āĻāϰā§āύ, āĻĒā§āϰāϝāĻŧā§āĻāύ⧠āĻāĻāĻāĻŋ āϏāĻŽā§āĻĒāĻžāĻĻāύā§āϰ āϏāĻŽāϝāĻŧāϏā§āĻā§ āϏā§āĻ āĻāĻĒ āĻāϰāϤ⧠āĻĒāϰāĻžāĻŽāĻŋāϤāĻŋāĻā§āϞāĻŋ āĻŦāϰāĻžāĻŦāϰ āĻĒāĻžāϏ āĻāϰā§āύ⧎ āĻāĻĒāύāĻŋ Admin SDK āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻā§āĻĄ āϞāĻŋāĻā§ āĻāĻŦāĻ Cloud Functions for Firebase āϏā§āĻĨāĻžāĻĒāύ āĻāϰ⧠āĻāĻāĻŋ āĻ āϰā§āĻāύ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϞāĻŋāĻā§āύ
āĻāĻ āĻŦāĻŋāĻāĻžāĻā§ āĻā§āĻĄ āύāĻŽā§āύāĻžāĻā§āϞāĻŋ āĻāĻŽāύ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāĻĒā§āϰ āĻāĻĒāϰ āĻāĻŋāϤā§āϤāĻŋ āĻāϰ⧠āϤā§āϰāĻŋ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āϝāĻž āĻāĻāĻāĻŋ āĻĒāϰāĻŋāώā§āĻŦāĻž āϏā§āĻ āĻāĻĒ āĻāϰ⧠āϝāĻž NASA-āĻāϰ Astronomy Picture of the Day āĻĨā§āĻā§ āϏāĻŽāϏā§āϤ āĻāĻŦāĻŋ āĻŦā§āϝāĻžāĻ āĻāĻĒ āĻāϰā§ā§ˇ āĻļā§āϰ⧠āĻāϰāϤā§, āĻĒā§āϰāϝāĻŧā§āĻāύā§āϝāĻŧ āĻŽāĻĄāĻŋāĻāϞ āĻāĻŽāĻĻāĻžāύāĻŋ āĻāϰā§āύ:
Node.js
// Dependencies for task queue functions.
const {onTaskDispatched} = require("firebase-functions/v2/tasks");
const {onRequest, HttpsError} = require("firebase-functions/v2/https");
const {getFunctions} = require("firebase-admin/functions");
const {logger} = require("firebase-functions/v2");
// Dependencies for image backup.
const path = require("path");
const fetch = require("node-fetch");
const {initializeApp} = require("firebase-admin/app");
const {getStorage} = require("firebase-admin/storage");
const {GoogleAuth} = require("google-auth-library");
āĻĒāĻžāĻāĻĨāύ
# Dependencies for task queue functions.
from google.cloud import tasks_v2
import requests
from firebase_functions.options import RetryConfig, RateLimits, SupportedRegion
# Dependencies for image backup.
from datetime import datetime, timedelta
import json
import pathlib
from urllib.parse import urlparse
from firebase_admin import initialize_app, storage, functions
from firebase_functions import https_fn, tasks_fn, params
import google.auth
from google.auth.transport.requests import AuthorizedSession
āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύā§āϰ āĻāύā§āϝ onTaskDispatched
āĻŦāĻž on_task_dispatched
āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āύāĨ¤ āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϞā§āĻāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻŋ āĻĒā§āϰāϤāĻŋ-āϏāĻžāϰāĻŋ āĻĒā§āύāϰāĻžāϝāĻŧ āĻā§āώā§āĻāĻž āĻāĻŦāĻ āϰā§āĻ-āϏā§āĻŽāĻŋāϤ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āϏā§āĻ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤
āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰā§āύ
āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ āϏā§āύāĻŋāϰā§āĻĻāĻŋāώā§āĻāĻāĻžāĻŦā§ āĻšāĻžāϰā§āϰ āϏā§āĻŽāĻž āύāĻŋāϝāĻŧāύā§āϤā§āϰāĻŖ āĻāϰāϤ⧠āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋāϰ āĻāĻāϰāĻŖ āĻĒā§āύāϰāĻžāϝāĻŧ āĻā§āώā§āĻāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āϏā§āĻāĻŋāĻāϏā§āϰ āĻāĻāĻāĻŋ āĻļāĻā§āϤāĻŋāĻļāĻžāϞ⧠āϏā§āĻā§āϰ āϏāĻžāĻĨā§ āĻāϏā§:
Node.js
exports.backupapod = onTaskDispatched(
{
retryConfig: {
maxAttempts: 5,
minBackoffSeconds: 60,
},
rateLimits: {
maxConcurrentDispatches: 6,
},
}, async (req) => {
āĻĒāĻžāĻāĻĨāύ
@tasks_fn.on_task_dispatched(retry_config=RetryConfig(max_attempts=5, min_backoff_seconds=60),
rate_limits=RateLimits(max_concurrent_dispatches=10))
def backupapod(req: tasks_fn.CallableRequest) -> str:
"""Grabs Astronomy Photo of the Day (APOD) using NASA's API."""
retryConfig.maxAttempts=5
: āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋāϤ⧠āĻĨāĻžāĻāĻž āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāĻžāĻ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ 5 āĻŦāĻžāϰ āĻĒāϰā§āϝāύā§āϤ āĻĒā§āύāϰāĻžāϝāĻŧ āĻā§āώā§āĻāĻž āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻāĻŋ āύā§āĻāĻāϝāĻŧāĻžāϰā§āĻ āϤā§āϰā§āĻāĻŋ āĻŦāĻž āύāĻŋāϰā§āĻāϰāĻļā§āϞ, āĻŦāĻžāĻšā§āϝāĻŋāĻ āĻĒāϰāĻŋāώā§āĻŦāĻžāϰ āĻ āϏā§āĻĨāĻžāϝāĻŧā§ āĻĒāϰāĻŋāώā§āĻŦāĻž āĻŦā§āϝāĻžāĻšāϤā§āϰ āĻŽāϤ⧠āĻā§āώāĻŖāϏā§āĻĨāĻžāϝāĻŧā§ āϤā§āϰā§āĻāĻŋāĻā§āϞāĻŋ āĻĒā§āϰāĻļāĻŽāĻŋāϤ āĻāϰāϤ⧠āϏāĻšāĻžāϝāĻŧāϤāĻž āĻāϰā§ā§ˇretryConfig.minBackoffSeconds=60
: āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻāĻžāĻ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻĒā§āϰāĻā§āώā§āĻāĻž āĻĨā§āĻā§ āĻāĻŽāĻĒāĻā§āώ⧠60 āϏā§āĻā§āύā§āĻĄā§āϰ āĻŽāϧā§āϝ⧠āĻĒā§āύāϰāĻžāϝāĻŧ āĻā§āώā§āĻāĻž āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻāĻŋ āĻĒā§āϰāϤāĻŋāĻāĻŋ āĻĒā§āϰāĻā§āώā§āĻāĻžāϰ āĻŽāϧā§āϝ⧠āĻāĻāĻāĻŋ āĻŦāĻĄāĻŧ āĻŦāĻžāĻĢāĻžāϰ āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠āϤāĻžāĻ āĻāĻŽāϰāĻž āĻā§āĻŦ āĻĻā§āϰā§āϤ 5āĻāĻŋ āĻĒā§āύāĻāĻĒā§āϰāĻā§āώā§āĻāĻž āĻļā§āώ āĻāϰāĻžāϰ āĻāύā§āϝ āϤāĻžāĻĄāĻŧāĻžāĻšā§āĻĄāĻŧā§ āĻāϰāĻŋ āύāĻžāĨ¤rateLimits.maxConcurrentDispatch=6
: āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϏāĻŽāϝāĻŧā§ āϏāϰā§āĻŦāĻžāϧāĻŋāĻ 6āĻāĻŋ āĻāĻžāĻ āĻĒāĻžāĻ āĻžāύ⧠āĻšāϝāĻŧāĨ¤ āĻāĻāĻŋ āĻ āύā§āϤāϰā§āύāĻŋāĻšāĻŋāϤ āĻĢāĻžāĻāĻļāύ⧠āĻ āύā§āϰā§āϧā§āϰ āĻāĻāĻāĻŋ āϏā§āĻĨāĻŋāϰ āĻĒā§āϰāĻŦāĻžāĻš āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰ⧠āĻāĻŦāĻ āϏāĻā§āϰāĻŋāϝāĻŧ āĻĻā§āώā§āĻāĻžāύā§āϤ āĻāĻŦāĻ āĻ āĻžāύā§āĻĄāĻž āĻļā§āϰā§āϰ āϏāĻāĻā§āϝāĻž āĻāĻŽāĻžāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰā§āĨ¤
āĻā§āϏā§āĻ āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋ āĻĢāĻžāĻāĻļāύ
āĻŦā§āĻļāĻŋāϰāĻāĻžāĻ āĻā§āώā§āϤā§āϰā§, Cloud Functions āĻāĻŽā§āϞā§āĻāϰ āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋ āĻĢāĻžāĻāĻļāύ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻžāϰ āϏāϰā§āĻŦā§āϤā§āϤāĻŽ āĻāĻĒāĻžāϝāĻŧāĨ¤ āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āĻāĻŽā§āϞā§āĻļāύā§āϰ āĻāύā§āϝ āĻāĻĒāύāĻžāϰ āĻ ā§āϝāĻžāĻĒāĻā§ āĻā§āĻāĻžāĻŦā§ āĻāĻĒāĻāϰāĻŖ āϤā§āϰāĻŋ āĻāϰāĻŦā§āύ āϤāĻž āĻļāĻŋāĻāϤ⧠āĻāĻŽā§āϞā§āĻāϰ āϏā§āϝā§āĻ āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻĻā§āĻā§āύāĨ¤
āĻ āϤāĻŋāϰāĻŋāĻā§āϤāĻāĻžāĻŦā§, āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ Firebase Local Emulator Suite āϏāĻžāϧāĻžāϰāĻŖ HTTP āĻĢāĻžāĻāĻļāύ āĻšāĻŋāϏāĻžāĻŦā§ āĻāύā§āĻŽā§āĻā§āϤ āĻāϰāĻž āĻšāϝāĻŧāĨ¤ āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ JSON āĻĄā§āĻāĻž āĻĒā§āϞā§āĻĄ āϏāĻš āĻāĻāĻāĻŋ HTTP POST āĻ āύā§āϰā§āϧ āĻĒāĻžāĻ āĻŋāϝāĻŧā§ āĻāĻāĻāĻŋ āĻ āύā§āĻāϰāĻŖ āĻāϰāĻž āĻāĻžāϏā§āĻ āĻĢāĻžāĻāĻļāύ āĻĒāϰā§āĻā§āώāĻž āĻāϰāϤ⧠āĻĒāĻžāϰā§āύ:
# start the Local Emulator Suite
firebase emulators:start
# trigger the emulated task queue function
curl \
-X POST # An HTTP POST request...
-H "content-type: application/json" \ # ... with a JSON body
http://localhost:$PORT/$PROJECT_ID/$REGION/$NAME \ # ... to function url
-d '{"data": { ... some data .... }}' # ... with JSON encoded data
āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύ
Firebase CLI āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύ:
$ firebase deploy --only functions:backupapod
āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ, CLI āĻāĻĒāύāĻžāϰ āϏā§āϰā§āϏ āĻā§āĻĄā§ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āĻŦāĻŋāĻāϞā§āĻĒāĻā§āϞāĻŋ (āϰā§āĻ āϏā§āĻŽāĻŋāϤ āĻāϰāĻž āĻāĻŦāĻ āĻĒā§āύāϰāĻžāϝāĻŧ āĻā§āώā§āĻāĻž) āϏāĻš Cloud Tasks āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋ āϤā§āϰāĻŋ āĻāϰā§āĨ¤
āĻĢāĻžāĻāĻļāύ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ āĻ āύā§āĻŽāϤāĻŋ āϤā§āϰā§āĻāĻŋāϰ āϏāĻŽā§āĻŽā§āĻā§āύ āĻšāύ, āϤāĻžāĻšāϞ⧠āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰā§āύ āϝ⧠āϝāĻĨāĻžāϝāĻĨ IAM āĻā§āĻŽāĻŋāĻāĻžāĻā§āϞāĻŋ āϏā§āĻĨāĻžāĻĒāύāĻžāϰ āĻāĻŽāĻžāύā§āĻĄ āĻāĻžāϞāĻžāĻā§āĻā§āύ āĻāĻŽāύ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰā§āĻā§ āĻŦāϰāĻžāĻĻā§āĻĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§āĨ¤
āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋ āĻĢāĻžāĻāĻļāύ
āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ Cloud Tasks āĻāĻāĻāĻŋ āĻŦāĻŋāĻļā§āĻŦāϏā§āϤ āϏāĻžāϰā§āĻāĻžāϰ āĻĒāϰāĻŋāĻŦā§āĻļ āĻĨā§āĻā§ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰ⧠āϝā§āĻŽāύ Cloud Functions for Firebase Node.js-āĻāϰ āĻāύā§āϝ Firebase Admin SDK āĻŦāĻž Python-āĻāϰ āĻāύā§āϝ Google āĻā§āϞāĻžāĻāĻĄ āϞāĻžāĻāĻŦā§āϰā§āϰāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§ā§ˇ āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ Admin SDK āĻ āύāϤā§āύ āĻšāύ, āĻļā§āϰ⧠āĻāϰāϤ⧠āĻāĻāĻāĻŋ āϏāĻžāϰā§āĻāĻžāϰ⧠Firebase āϝā§āĻ āĻāϰā§āύ āĻĻā§āĻā§āύāĨ¤
āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻĒā§āϰāĻŦāĻžāĻš āĻāĻāĻāĻŋ āύāϤā§āύ āĻāĻžāϏā§āĻ āϤā§āϰāĻŋ āĻāϰā§, āĻāĻāĻŋāĻā§ Cloud Tasks āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻāϰ⧠āĻāĻŦāĻ āĻāĻžāϏā§āĻā§āϰ āĻāύā§āϝ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āϏā§āĻ āĻāϰā§:
Node.js
exports.enqueuebackuptasks = onRequest(
async (_request, response) => {
const queue = getFunctions().taskQueue("backupapod");
const targetUri = await getFunctionUrl("backupapod");
const enqueues = [];
for (let i = 0; i <= BACKUP_COUNT; i += 1) {
const iteration = Math.floor(i / HOURLY_BATCH_SIZE);
// Delay each batch by N * hour
const scheduleDelaySeconds = iteration * (60 * 60);
const backupDate = new Date(BACKUP_START_DATE);
backupDate.setDate(BACKUP_START_DATE.getDate() + i);
// Extract just the date portion (YYYY-MM-DD) as string.
const date = backupDate.toISOString().substring(0, 10);
enqueues.push(
queue.enqueue({date}, {
scheduleDelaySeconds,
dispatchDeadlineSeconds: 60 * 5, // 5 minutes
uri: targetUri,
}),
);
}
await Promise.all(enqueues);
response.sendStatus(200);
});
āĻĒāĻžāĻāĻĨāύ
@https_fn.on_request()
def enqueuebackuptasks(_: https_fn.Request) -> https_fn.Response:
"""Adds backup tasks to a Cloud Tasks queue."""
task_queue = functions.task_queue("backupapod")
target_uri = get_function_url("backupapod")
for i in range(BACKUP_COUNT):
batch = i // HOURLY_BATCH_SIZE
# Delay each batch by N hours
schedule_delay = timedelta(hours=batch)
schedule_time = datetime.now() + schedule_delay
dispatch_deadline_seconds = 60 * 5 # 5 minutes
backup_date = BACKUP_START_DATE + timedelta(days=i)
body = {"data": {"date": backup_date.isoformat()[:10]}}
task_options = functions.TaskOptions(schedule_time=schedule_time,
dispatch_deadline_seconds=dispatch_deadline_seconds,
uri=target_uri)
task_queue.enqueue(body, task_options)
return https_fn.Response(status=200, response=f"Enqueued {BACKUP_COUNT} tasks")
āύāĻŽā§āύāĻž āĻā§āĻĄāĻāĻŋ Nth āĻāĻžāϏā§āĻā§āϰ āĻāύā§āϝ Nth āĻŽāĻŋāύāĻŋāĻā§āϰ āĻŦāĻŋāϞāĻŽā§āĻŦ āϝā§āĻā§āϤ āĻāϰ⧠āĻāĻžāϰā§āϝ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻā§ āĻāĻĄāĻŧāĻŋāϝāĻŧā§ āĻĻā§āĻāϝāĻŧāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰā§āĨ¤ āĻāĻāĻŋ āĻā§āϰāĻŋāĻāĻžāϰāĻŋāĻ ~ 1 āĻāĻžāϏā§āĻ/āĻŽāĻŋāύāĻŋāĻ āĻ āύā§āĻŦāĻžāĻĻ āĻāϰā§ā§ˇ āĻŽāύ⧠āϰāĻžāĻāĻŦā§āύ āϝ⧠āĻāĻĒāύāĻŋ āϝāĻĻāĻŋ Cloud Tasks āĻāĻāĻāĻŋ āύāĻŋāϰā§āĻĻāĻŋāώā§āĻ āϏāĻŽāϝāĻŧā§ āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻ āĻā§āϰāĻŋāĻāĻžāϰ āĻāϰāϤ⧠āĻāĻžāύ āϤāĻŦā§ āĻāĻĒāύāĻŋ
scheduleTime
(Node.js) āĻŦāĻžschedule_time
(Python) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĨ¤āύāĻŽā§āύāĻž āĻā§āĻĄāĻāĻŋ Cloud Tasks āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻ āϏāĻŽā§āĻĒā§āϰā§āĻŖ āĻšāĻāϝāĻŧāĻžāϰ āĻāύā§āϝ āϏāϰā§āĻŦā§āĻā§āĻ āĻāϤ āϏāĻŽāϝāĻŧ āĻ āĻĒā§āĻā§āώāĻž āĻāϰāĻŦā§ āϤāĻž āϏā§āĻ āĻāϰā§āĨ¤ Cloud Tasks āϏāĻžāϰāĻŋāϰ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύā§āϰ āĻĒāϰ⧠āĻŦāĻž āĻāĻ āϏāĻŽāϝāĻŧāϏā§āĻŽāĻžāϝāĻŧ āύāĻž āĻĒā§āĻāĻāĻžāύ⧠āĻĒāϰā§āϝāύā§āϤ āĻāĻžāϏā§āĻāĻāĻŋ āĻĒā§āύāϰāĻžāϝāĻŧ āĻā§āώā§āĻāĻž āĻāϰāĻŦā§āĨ¤ āύāĻŽā§āύāĻžāϝāĻŧ, āϏāĻžāϰāĻŋāĻāĻŋ 5 āĻŦāĻžāϰ āĻĒāϰā§āϝāύā§āϤ āĻāĻžāϏā§āĻāĻāĻŋ āĻĒā§āύāϰāĻžāϝāĻŧ āĻā§āώā§āĻāĻž āĻāϰāĻžāϰ āĻāύā§āϝ āĻāύāĻĢāĻŋāĻāĻžāϰ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§, āϤāĻŦā§ āĻĒā§āϰ⧠āĻĒā§āϰāĻā§āϰāĻŋāϝāĻŧāĻžāĻāĻŋ (āĻĒā§āύāϰāĻžāϝāĻŧ āĻā§āώā§āĻāĻž āϏāĻš) 5 āĻŽāĻŋāύāĻŋāĻā§āϰ āĻŦā§āĻļāĻŋ āϏāĻŽāϝāĻŧ āϞāĻžāĻāϞ⧠āĻāĻžāϏā§āĻāĻāĻŋ āϏā§āĻŦāϝāĻŧāĻāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āĻŦāĻžāϤāĻŋāϞ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧāĨ¤
āϏāĻŽāϏā§āϝāĻž āϏāĻŽāĻžāϧāĻžāύ
Cloud Tasks āϞāĻāĻŋāĻ āĻāĻžāϞ⧠āĻāϰā§āύ
Cloud Tasks āϞāĻāĻā§āϞāĻŋāϤ⧠āĻāĻāĻāĻŋ āĻāĻžāϏā§āĻā§āϰ āϏāĻžāĻĨā§ āϏāĻŽā§āĻĒāϰā§āĻāĻŋāϤ āĻ āύā§āϰā§āϧā§āϰ āϏā§āĻĨāĻŋāϤāĻŋāϰ āĻŽāϤ⧠āĻĻāϰāĻāĻžāϰ⧠āĻĄāĻžāϝāĻŧāĻāύāĻŋāϏā§āĻāĻŋāĻ āϤāĻĨā§āϝ āĻĨāĻžāĻā§āĨ¤ āĻĄāĻŋāĻĢāϞā§āĻāϰā§āĻĒā§, Cloud Tasks āĻĨā§āĻā§ āϞāĻāĻā§āϞāĻŋ āĻŦāύā§āϧ āĻšāϝāĻŧā§ āϝāĻžāϝāĻŧ āĻāĻžāϰāĻŖ āĻāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻĒā§āϰā§āĻā§āĻā§āĻā§ āĻĒā§āϰāĻā§āϰ āĻĒāϰāĻŋāĻŽāĻžāĻŖā§ āϞāĻ āϤā§āϰāĻŋ āĻāϰāϤ⧠āĻĒāĻžāϰā§ā§ˇ āĻāĻĒāύāĻŋ āϝāĻāύ āĻāĻĒāύāĻžāϰ āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋ āĻĢāĻžāĻāĻļāύ āϏāĻā§āϰāĻŋāϝāĻŧāĻāĻžāĻŦā§ āĻŦāĻŋāĻāĻžāĻļ āĻāĻŦāĻ āĻĄāĻŋāĻŦāĻžāĻ āĻāϰāĻā§āύ āϤāĻāύ āĻāĻŽāϰāĻž āĻāĻĒāύāĻžāĻā§ āĻĄāĻŋāĻŦāĻžāĻ āϞāĻ āĻāĻžāϞ⧠āĻāϰāĻžāϰ āĻĒāϰāĻžāĻŽāϰā§āĻļ āĻĻāĻŋāĻāĨ¤ āϞāĻāĻŋāĻ āĻāĻžāϞ⧠āĻāϰāĻž āĻĻā§āĻā§āύāĨ¤
āĻāĻāĻāĻāĻŽ āĻ āύā§āĻŽāϤāĻŋ
āĻāĻžāĻāĻā§āϞāĻŋ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻŦāĻž Cloud Tasks āĻāĻĒāύāĻžāϰ āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύāĻā§āϞāĻŋ āĻāĻžāϞ⧠āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻžāϰ āϏāĻŽāϝāĻŧ āĻāĻĒāύāĻŋ PERMISSION DENIED
āϤā§āϰā§āĻāĻŋ āĻĻā§āĻāϤ⧠āĻĒāĻžāϰā§āύ⧎ āύāĻŋāĻļā§āĻāĻŋāϤ āĻāϰā§āύ āϝ⧠āĻāĻĒāύāĻžāϰ āĻĒā§āϰāĻāϞā§āĻĒā§ āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ IAM āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ āĻāĻā§:
Cloud Tasks āĻāĻžāϏā§āĻ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻāϰāĻžāϰ āĻāύā§āϝ āĻŦā§āϝāĻŦāĻšā§āϤ āĻāĻāĻĄā§āύā§āĻāĻŋāĻāĻŋāϰ āĻāύā§āϝ
cloudtasks.tasks.create
IAM āĻ āύā§āĻŽāϤāĻŋ āĻĒā§āϰāϝāĻŧā§āĻāύāĨ¤āύāĻŽā§āύāĻžāϝāĻŧ, āĻāĻāĻŋ App Engine āĻĄāĻŋāĻĢāϞā§āĻ āĻĒāϰāĻŋāώā§āĻŦāĻž āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ
gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudtasks.enqueuer
Cloud Tasks āĻāĻžāϏā§āĻāĻā§āϞāĻŋ āϏāĻžāϰāĻŋāĻŦāĻĻā§āϧ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻĒāϰāĻŋāĻāϝāĻŧāĻāĻŋāϰ āĻāύā§āϝ Cloud Tasks āĻā§āύāĻ āĻāĻžāϏā§āĻā§āϰ āϏāĻžāĻĨā§ āϝā§āĻā§āϤ āĻĒāϰāĻŋāώā§āĻŦāĻž āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻžāϰ āĻ āύā§āĻŽāϤāĻŋ āĻĒā§āϰāϝāĻŧā§āĻāύ⧎
āύāĻŽā§āύāĻžāϝāĻŧ, āĻāĻāĻŋ App Engine āĻĄāĻŋāĻĢāϞā§āĻ āĻĒāϰāĻŋāώā§āĻŦāĻž āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĨ¤
App Engine āĻĄāĻŋāĻĢāϞā§āĻ āĻĒāϰāĻŋāώā§āĻŦāĻž āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰāĻāĻžāϰ⧠āĻšāĻŋāϏāĻžāĻŦā§ App Engine āĻĄāĻŋāĻĢāϞā§āĻ āĻĒāϰāĻŋāώā§āĻŦāĻž āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻā§āĻāĻžāĻŦā§ āϝā§āĻā§āϤ āĻāϰāĻŦā§āύ āϤāĻžāϰ āύāĻŋāϰā§āĻĻā§āĻļāĻžāĻŦāϞā§āϰ āĻāύā§āϝ Google āĻā§āϞāĻžāĻāĻĄ IAM āĻĄāĻā§āĻŽā§āύā§āĻā§āĻļāύ āĻĻā§āĻā§āύāĨ¤
āĻāĻžāϏā§āĻ āĻāĻŋāĻ āĻĢāĻžāĻāĻļāύāĻāĻŋ āĻā§āϰāĻŋāĻāĻžāϰ āĻāϰāϤ⧠āĻŦā§āϝāĻŦāĻšā§āϤ āĻĒāϰāĻŋāĻāϝāĻŧāĻāĻŋāϰ āĻāύā§āϝ
cloudfunctions.functions.invoke
āĻ āύā§āĻŽāϤāĻŋ āĻĒā§āϰāϝāĻŧā§āĻāύ⧎āύāĻŽā§āύāĻžāϝāĻŧ, āĻāĻāĻŋ App Engine āĻĄāĻŋāĻĢāϞā§āĻ āĻĒāϰāĻŋāώā§āĻŦāĻž āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ
gcloud functions add-iam-policy-binding $FUNCTION_NAME \
--region=us-central1 \
--member=serviceAccount:${PROJECT_ID}@appspot.gserviceaccount.com \
--role=roles/cloudfunctions.invoker