BigQuery 결과를 반환하는 함수 만들기

이 튜토리얼에서는 BigQuery에 쿼리를 제출하는 HTTP Cloud Run 함수를 작성하는 방법을 보여줍니다.

시작하기 전에

  1. 설정 페이지에 설명된 대로 Cloud Run용 새 프로젝트를 설정했는지 확인합니다.

  2. Artifact Registry, Cloud Build, Cloud Run Admin API API를 사용 설정합니다.

     gcloud services enable artifactregistry.googleapis.com \
         cloudbuild.googleapis.com \
         run.googleapis.com
    
  3. 프로젝트에서 인증되지 않은 호출을 제한하는 도메인 제한 조직 정책이 적용되는 경우 비공개 서비스 테스트의 설명대로 배포된 서비스에 액세스해야 합니다.

필요한 역할

소스에서 Cloud Run 서비스를 배포하는 데 필요한 권한을 얻으려면 관리자에게 다음 IAM 역할을 부여해 달라고 요청하세요.

Cloud Run과 연결된 IAM 역할 및 권한 목록은 Cloud Run IAM 역할Cloud Run IAM 권한을 참조하세요. Cloud Run 서비스가 Cloud 클라이언트 라이브러리와 같은Google Cloud API와 상호작용하는 경우에는 서비스 ID 구성 가이드를 참고하세요. 역할 부여에 대한 자세한 내용은 배포 권한액세스 관리를 참고하세요.

서비스 계정 역할

  • Cloud Build가 소스를 빌드할 수 있게 하려면 다음을 실행하여 Compute Engine 기본 서비스 계정에 Cloud Build 서비스 계정 역할을 부여합니다.

    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
        --role=roles/cloudbuild.builds.builder

    PROJECT_NUMBER를 Google Cloud프로젝트 번호로, PROJECT_ID를 Google Cloud프로젝트 ID로 바꿉니다. 프로젝트 ID와 프로젝트 번호를 찾는 방법은 프로젝트 만들기 및 관리를 참고하세요.

    Compute Engine 기본 서비스 계정에 Cloud Build 서비스 계정 역할을 부여하려면 전파하는 데 몇 분 정도 걸립니다.

  • 애플리케이션 준비

    1. 샘플 애플리케이션 저장소를 로컬 머신에 클론합니다.

      git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
      

      또는 zip 파일로 샘플을 다운로드하고 압축을 풉니다.

    2. 샘플 코드가 있는 디렉토리로 변경합니다.

      cd nodejs-docs-samples/functions/v2/helloBigQuery
      
    3. 다음 샘플 코드를 살펴봅니다. 이 샘플은 지정된 데이터 세트에서 최소 400회 이상 발생하는 단어에 대한 쿼리를 제출하고 결과를 반환합니다.

      // Import the Google Cloud client library
      const {BigQuery} = require('@google-cloud/bigquery');
      const bigquery = new BigQuery();
      
      const functions = require('@google-cloud/functions-framework');
      
      /**
       * HTTP Cloud Function that returns BigQuery query results
       *
       * @param {Object} req Cloud Function request context.
       * @param {Object} res Cloud Function response context.
       */
      functions.http('helloBigQuery', async (req, res) => {
        // Define the SQL query
        // Queries the public Shakespeare dataset using named query parameter
        const sqlQuery = `
            SELECT word, word_count
                  FROM \`bigquery-public-data.samples.shakespeare\`
                  WHERE corpus = @corpus
                  AND word_count >= @min_word_count
                  ORDER BY word_count DESC`;
      
        const options = {
          query: sqlQuery,
          // Location must match that of the dataset(s) referenced in the query.
          location: 'US',
          params: {corpus: 'romeoandjuliet', min_word_count: 400},
        };
      
        // Execute the query
        try {
          const [rows] = await bigquery.query(options);
          // Send the results
          res.status(200).send(rows);
        } catch (err) {
          console.error(err);
          res.status(500).send(`Error querying BigQuery: ${err}`);
        }
      });

    함수 배포하기

    HTTP 트리거를 사용하여 함수를 배포하려면 다음 단계를 따르세요.

    1. 샘플 코드가 포함된 디렉터리에서 다음 명령어를 실행합니다.

      gcloud beta run deploy FUNCTION \
         --source . \
         --function FUNCTION_ENTRYPOINT \
         --base-image BASE_IMAGE \
         --region REGION \
         --allow-unauthenticated

      다음과 같이 바꿉니다.

      • FUNCTION을 배포하려는 함수의 이름(예: my-bigquery-function)으로 바꿉니다. 이 매개변수를 완전히 생략할 수 있지만 생략하면 이름을 입력하라는 메시지가 표시됩니다.

      • FUNCTION_ENTRYPOINT를 소스 코드에 있는 함수의 진입점으로 바꿉니다. 이는 함수가 실행될 때 Cloud Run이 실행하는 코드입니다. 이 플래그의 값은 소스 코드에 있는 함수 이름 또는 정규화된 클래스 이름이어야 합니다. 샘플 함수에 지정해야 하는 진입점은 helloBigQuery입니다.

      • BASE_IMAGE를 함수의 기본 이미지 환경(예: nodejs22)으로 바꿉니다. 기본 이미지 및 각 이미지에 포함된 패키지에 관한 자세한 내용은 런타임 기본 이미지를 참고하세요.

      • REGION을 함수를 배포하려는 Google Cloud 리전으로 바꿉니다. 예를 들면 us-central1입니다.

      선택사항:

      • 웹훅과 같이 공개 HTTP 함수를 만드는 경우 --allow-unauthenticated 플래그를 지정합니다. 이 플래그는 Cloud Run IAM 호출자 역할을 특수 식별자 allUser에 할당합니다. 서비스를 만든 후 나중에 IAM을 사용하여 이 설정을 수정할 수 있습니다.

    함수 테스트

    1. 함수 배포가 완료되면 uri 속성을 복사합니다.

    2. 브라우저에서 이 URI에 방문합니다.

      쿼리 기준과 일치하는 단어 목록과 각 단어가 대상 데이터 세트에 표시되는 횟수를 볼 수 있습니다.

    삭제

    Cloud Run에서는 서비스를 사용하지 않을 때 비용이 청구되지 않지만 Artifact Registry에 컨테이너 이미지를 저장하는 데 요금이 청구될 수 있습니다. 비용이 청구되지 않도록 컨테이너 이미지를 삭제하거나 Google Cloud 프로젝트를 삭제할 수 있습니다. Google Cloud 프로젝트를 삭제하면 프로젝트 내에서 사용되는 모든 리소스에 대한 비용 청구가 중지됩니다.

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.