Google Cloud 작업 워크플로는 Cloud Functions를 예약하는 좋은 방법입니다.

Google Cloud 작업 워크플로는 Cloud Functions를 예약하는 좋은 방법입니다.

Google Cloud Tasks는 Google Cloud Platform(GCP)에서 제공됩니다. 안정적이고 확장 가능한 방식으로 비동기 작업을 생성, 관리 및 실행할 수 있는 완전 관리형 서비스입니다. 이러한 작업은 사용자가 생성한 핸들러를 사용하여 애플리케이션 흐름 외부에서 처리되는 독립적인 작업입니다. 이러한 핸들러는 본질적으로 작업을 처리하는 엔드포인트 또는 서비스입니다. HTTP, 앱 엔진, 게시/구독 또는 맞춤 백엔드 핸들러까지 사용할 수 있습니다. 이 문서에서는 클라우드 작업 워크플로를 살펴보고 클라우드 작업을 사용하여 클라우드 기능을 효과적으로 예약하는 방법을 살펴보겠습니다.

Google Cloud Tasks의 작동 방식

Google Cloud Task는 기본적으로 높은 수준에서 비동기 작업 실행을 관리하는 데 사용됩니다. 워크플로에 대한 단계별 설명은 다음과 같습니다.

작업 생성:

애플리케이션은 특정 데이터(페이로드)가 포함된 작업을 생성하고 이를 작업 대기열.

다음을 지정할 수 있습니다.

  • 대상 핸들러(HTTP 엔드포인트, App Engine 또는 Pub/Sub)
  • 작업 실행 시간(즉시 또는 지연)
  • 재시도 정책(예: 실패한 작업을 재시도하는 빈도 및 시기)

작업 대기열:

작업은 실행될 준비가 될 때까지 대기열에 저장됩니다. 대기열을 사용하면 우선순위나 기능별로 작업을 구성할 수 있습니다.

작업 실행:

작업을 실행할 준비가 되면(즉시 또는 지정된 지연 후) Google Cloud Tasks는 작업을 지정된 위치로 보냅니다. 매니저.

핸들러는 다음과 같습니다.

  • HTTP(S) 엔드포인트.
  • App Engine 서비스.
  • 게시/구독 주제.

작업 처리:

핸들러는 작업 페이로드에 제공된 데이터를 사용하여 작업을 처리합니다. 처리 후 핸들러는 성공 또는 실패 상태로 응답합니다. 성공하면 작업이 완료된 것으로 표시되고 대기열에서 제거되며, 그렇지 않으면 재시도 정책에 따라 작업이 재시도됩니다.

Google Cloud Console 또는 API를 사용하여 작업 및 큐의 상태를 모니터링할 수 있습니다.

Google Cloud 작업과 Google Cloud Scheduler 비교

Google Cloud Scheduler는 Google Cloud Platform(GCP)에서 제공하는 완전 관리형 크론 작업 서비스입니다. 이를 통해 지정된 시간이나 간격으로 스크립트 실행, API 트리거, Cloud Functions 실행과 같은 작업 실행을 예약하고 자동화할 수 있습니다.

다음은 Google Cloud 작업과 Google Cloud Scheduler에 대한 비교 분석입니다. 이 두 서비스가 무엇을 제공하는지 이해하면 프로젝트에 가장 적합한 서비스를 선택하는 데 도움이 됩니다.

비교 분석: Google Cloud Scheduler와 Google Cloud Tasks

측면

Google 클라우드 스케줄러

Google Cloud 작업

목적

반복 작업 또는 크론 작업을 자동화하고 예약합니다.

제어된 실행을 통해 비동기식 또는 일회성 작업을 관리합니다.

작업 실행

고정된 일정(예: 매시간, 매일)에 따라 작업을 실행합니다.

애플리케이션 이벤트 또는 로직에 의해 트리거된 작업을 실행합니다.

동시성

작업당 한 번에 하나씩 작업을 실행합니다.

대기열 관리를 통해 여러 작업을 동시에 처리할 수 있습니다.

확장성

적당한 수의 예약된 작업에 적합합니다.

수천 개의 작업을 관리할 수 있는 확장성이 뛰어납니다.

예시 시나리오

매주 일요일 자정에 데이터베이스 정리 스크립트를 실행합니다.

사용자 작업에 의해 트리거된 이미지 업로드를 처리하는 작업을 대기열에 추가합니다.

Cloud Tasks를 사용하여 Cloud 함수 예약

이 예에서는 클라우드 작업을 사용하여 나중에 호출할 클라우드 기능을 생성하는 프로세스를 살펴보겠습니다.

전제 조건

이 튜토리얼을 최대한 활용하려면 다음이 필요합니다.

모든 기본 요건을 확인한 후 Google Cloud 콘솔에서 Google Cloud Tasks API를 활성화하세요.

이것이 성공적으로 활성화되면 대기열을 생성하십시오. Google Cloud(gcloud) CLI를 사용하거나 Google Cloud 콘솔에서 바로 대기열을 만들 수 있습니다. gcloud CLI를 통해 대기열을 만들려면 먼저 gcloud SDK를 설치하고 Firebase 프로젝트에 구성해야 합니다. 구성이 완료되면 터미널에서 이 명령을 실행하여 대기열을 생성하세요.

    gcloud tasks queues create QUEUE_ID --location=LOCATION

바꾸다 QUEUE_ID 그리고 위치 원하는 값으로. gcloud CLI를 통한 대기열 생성에 대한 자세한 내용은 여기를 참조하세요.

Google Console에서 직접 대기열을 만들려면 Cloud Tasks로 이동하여 대기열 만들기 옵션을 클릭하여 대기열을 만듭니다.

이제 Cloud Tasks가 설정되었으므로 함수에서 사용할 수 있습니다. 사용하려면 먼저 Cloud Task 클라이언트를 설치하세요.

npm install @google-cloud/tasks

이 예에서는 Firestore 컬렉션의 이메일 주소로 이메일을 보내는 클라우드 기능을 만듭니다. Google Cloud Task를 사용하여 이 클라우드 기능이 지정된 시간에 호출되도록 예약합니다. 뛰어 들어 봅시다.

설치하다 nodemailer왜냐면 우리는 먼저 sendEmail 기능.

npm install nodemailer

이메일 보내기 기능은 다음과 같습니다.

import * as functions from "firebase-functions";
import * as admin from "firebase-admin";
import * as nodemailer from "nodemailer";
import {OAuth2Client} from "google-auth-library";

admin.initializeApp();

const transporter = nodemailer.createTransport({
  service: "gmail",
  auth: {
    user: "[email protected]",
    pass: "sender pass",
  },
});

/**
 * This function sends emails.
*/
export const sendEmail = functions.https.onRequest(async (req, res) => {
  const projectId = JSON.parse(process.env.FIREBASE_CONFIG!).projectId;
  const location = "us-central1";

  const authorizationHeader = req.headers.authorization;

  if (!authorizationHeader) {
    res.status(401).send("unauthorized token");
    return;
  }

  // if authorizationHeader is not null access the token
  const token = authorizationHeader.split(" ")[1];

  // verify ID token
  try {
    await verifyToken(token, location, projectId);
  } catch (error) {
    console.log(error);
    res.status(401).send("Unauthorized token");
    return;
  }

  try {
    const snapshot = await admin
      .firestore()
      .collection("email_addresses")
      .get();

    if (snapshot.empty) {
      res.status(404).send("No email addresses found in the collection.");
      return;
    }

    const emailAddresses: string[] = [];
    snapshot.forEach((doc) => {
      const data = doc.data();
      if (data.email) {
        emailAddresses.push(data.email);
      }
    });
    if (emailAddresses.length === 0) {
      res.status(404).send("No valid email addresses found.");
      return;
    }

    const promises = emailAddresses.map((email) => {
      const mailOptions = {
        from: "[email protected]",
        to: email,
        subject: "Welcome to Our Service!",
        text: `Hello, ${email}! Welcome to our platform. 
        We're excited to have you on board!`,
      };

      return transporter.sendMail(mailOptions);
    });

    await Promise.all(promises);

    res.status(200).send("Emails sent successfully!");
  } catch (error) {
    console.error("Error sending emails:", error);
    res.status(500).send("An error occurred while sending emails.");
  }
});

이 기능은 컬렉션에 있는 이메일 주소 목록을 추출한 다음 nodemailer해당 이메일 주소 모두로 이메일을 보냅니다. 이 함수에는 인증되지 않은 사람이 호출하는 것을 방지하는 인증 가드도 있습니다. 이 인증 가드는 먼저 인증 토큰이 헤더에 포함되어 있는지 확인하고, 그렇지 않은 경우 오류를 발생시킵니다. 그러나 토큰이 포함된 경우 verifyToken 기능을 통해 이를 확인합니다.

verifyToken 기능을 위해 google-auth-library를 설치하세요. 이는 토큰을 확인하는 데 사용됩니다.

npm install google-auth-library


/**
 * This function verifies token
 * @param {string} token
 * @param {string} location
 * @param {string} projectId
 * @return {Promise

이제 재미있는 부분으로 클라우드 작업을 사용하여 이 기능을 예약합니다. Firestore의 email_addresses 컬렉션에 대한 새 문서가 생성되면 이 작업 생성이 트리거됩니다. 사용자 관련 작업을 사용하여 작업 생성을 트리거할 수 있습니다. 트리거 없이는 작업을 생성할 수 없습니다.

다음을 파일로 가져옵니다.

import {CloudTasksClient, protos} from "@google-cloud/tasks";
import * as functions from "firebase-functions";

다음으로 Firestore onCreate 트리거 함수를 정의합니다.

export const onCreateEmail = functions.firestore
  .document("/email_addresses/{emailId}")
  .onCreate(async (snapshot) => {

  });

다음으로 작업을 정의하고 생성하기 위한 논리를 추가합니다.

export const onCreateEmail = functions.firestore
  .document("/email_addresses/{emailId}")
  .onCreate(async (snapshot) => {
    const data = snapshot.data();
    console.log(data);

    const projectId = JSON.parse(process.env.FIREBASE_CONFIG!).projectId;
    const location = "us-central1";
    const queue = "my-scheduler";
    const taskClient = new CloudTasksClient();
    const queuePath: string = taskClient.queuePath(projectId, location, queue);
    const url = `
    const taskName =
    `projects/${projectId}/locations/${location}/queues/${queue}/tasks`;
    const serviceAccountEmail =
      "SERVICE-ACCOUNT-EMAIL";

    const task = {
      name: `${taskName}/myTask-${Date.now()}`,
      httpRequest: {
        httpMethod: protos.google.cloud.tasks.v2.HttpMethod.POST,
        url: url,
        headers: {
          "Content-Type": "application/json",
        },
        oidcToken: {
          serviceAccountEmail,
          audience: `
        },
        body: Buffer.from(JSON.stringify({})).toString("base64"),
      },
      scheduleTime: {
        seconds: Math.floor(Date.now() / 1000) + 2 * 60,
      },
    };
    const request = {parent: queuePath, task: task};
    const [response] = await taskClient.createTask(request);

    functions.logger.info(
      `Task ${response.name} scheduled for 2mins later for user`,
    );
  });

위의 코드 조각을 분석하면 다음을 알 수 있습니다.

  • 먼저 작업을 생성하는 데 필요한 모든 변수를 정의했습니다. 이러한 변수에는 다음이 포함됩니다.
    • 그만큼 projectId Firebase를 나타냅니다. projectId. 위에서 볼 수 있듯이 하드코드하거나 env 값을 사용할 수 있습니다. 이는 동일한 기능을 사용하는 프로젝트가 두 개 이상일 때 이상적입니다.
    • 그만큼 location 그리고 queue 대기열을 생성할 때 정의한 값과 동일합니다.
    • 그만큼 url 실행할 클라우드 기능은 무엇입니까?
    • 그만큼 taskClient 클라우드 작업 SDK의 경우
    • 그만큼 queuePath 에서 얻은 것 taskClient
    • 그만큼 taskName Google Cloud Tasks가 여러 프로젝트, 위치, 대기열에서 작업을 고유하게 식별할 수 있도록 하는 계층적 이름 지정 체계를 사용하여 생성됩니다. 이는 충돌을 방지하는 데 도움이 됩니다.
    • 그만큼 serviceAccountEmail 추가 보안 계층으로 사용됩니다. 이는 선택사항이지만 서비스 계정을 설정하면 sendEmail 함수는 인증된 서비스 계정을 통해서만 호출할 수 있습니다.
      • 서비스 계정 이메일을 받으려면 다음 안내를 따르세요.
        • 다음으로 이동하여 서비스 계정을 만듭니다. IAM 및 관리자 Google 콘솔 프로젝트의 섹션
        • 아래에 모든 옵션이 있는 사이드바에서 서비스 계정 옵션을 선택합니다. IAM 및 관리자
        • 클릭하다 서비스 계정 만들기
        • 서비스 계정 이름을 지정하고 할당 Cloud 함수 호출자, Cloud Tasks 대기열 추가자, 그리고, 서비스 계정 토큰 생성자 그것에 대한 역할
        • 서비스 계정 이메일을 검색하세요
        • 선택하다 그래요 사이드바의 옵션
        • 액세스 권한 부여를 클릭하고 New Principals 필드에 서비스 계정 이메일을 추가하고 위의 역할을 부여합니다.
  • 다음으로 클라우드 작업을 구성했습니다.
    • 작업 이름에 다음을 추가했습니다. Date.now() 생성된 모든 작업 이름이 고유하도록 값을 지정합니다.
    • 에서 oidcToken 필드에는 서비스 계정 이메일과 대상을 전달했습니다. 대상 필드에서는 처음에 정의한 엔드포인트를 전달합니다.
      • 엔드포인트를 대상으로 사용하면 토큰이 올바른 서비스에 사용되는지 확인하는 데 도움이 됩니다.
      • 엔드포인트에 쿼리 매개변수가 있는 경우 쿼리 매개변수를 제거하고 엔드포인트만 대상 필드에 전달하세요.
      • 서비스 계정 이메일은 작업이 실행되려고 할 때 OpenId Connect(OIDC) 토큰을 생성합니다.
      • OIDC 토큰은 인증 헤더의 일부로 전송됩니다. 그런 다음 요청이 인증되고 승인되었는지 확인하는 클라우드 기능에 의해 검증됩니다. 클라우드 기능은 또한 대상 값의 유효성을 검사하여 해당 값이 해당 URL과 일치하는지, 토큰이 이 서비스를 위한 것인지 확인합니다.
    • 본문 필드는 페이로드를 전달하는 데 사용됩니다. 이 경우 페이로드를 전달할 필요가 없으므로 비어 있습니다.
    • 에서 scheduleTime 이 작업을 언제 실행해야 하는지 정의했습니다.
  • 마지막으로 taskClient우리는 createTask 기능.

이제 email_addresses 컬렉션에 새 이메일이 추가되면 새 작업이 생성되어 대기열에 추가됩니다. sendEmail 예정된 시간에 작동합니다.

결론

마침내, 우리는 이 글의 끝 부분에 이르렀습니다. 지금까지 Google Cloud Tasks와 해당 워크플로를 정의했습니다. 또한 유사하지만 서로 다른 서비스를 제공하는 Google Cloud Task와 Google Cloud Scheduler의 차이점도 살펴보았습니다.

이 문서에서 배운 내용을 바탕으로 지정된 시간에 호출되도록 클라우드 기능이나 기타 핸들러를 예약할 수 있으며, 작업 구성에 서비스 계정을 추가하여 보안 등을 보장할 수도 있습니다.

이 글이 도움이 되셨다면 좋아요나 댓글을 남겨주시면 도움을 드릴 수 있습니다. 더 많은 관련 기사를 보려면 나를 팔로우할 수도 있습니다.

출처 참조

Post Comment

당신은 놓쳤을 수도 있습니다