Cloud Functions 이미지 빌드

개요

함수 소스 코드를 Cloud Functions에 배포하면 이 소스가 Cloud Storage 버킷에 저장됩니다. 그러면 Cloud Build가 코드를 컨테이너 이미지로 자동으로 빌드하고 이미지를 Container Registry에 푸시합니다. Cloud Functions는 함수 실행을 위해 컨테이너를 실행해야 할 때 이 이미지에 액세스합니다.

이미지를 빌드하는 프로세스는 완전 자동으로 진행되며 사용자의 직접 입력이 필요하지 않습니다. 하지만 이전 Node.js 8 및 Go 1.11 런타임의 프로세스와 자바 11, Python 3.7, Python 3.8, Node.js 10, Go 1.13 등 다른 모든 런타임의 현재 프로세스에는 약간의 차이가 있습니다.

Node.js 8 및 Go 1.11 런타임

이전 런타임의 경우 빌드 프로세스가 사용자 프로젝트에서 실행되지 않고 테넌트 프로젝트라고 부르는 관련 프로젝트에서 실행됩니다. 테넌트 프로젝트에서 빌드를 실행하면 해당 런타임과 연관된 몇 가지 문제가 해결되었지만, 새로운 문제도 발생했습니다.

  • 빌드가 프로젝트에서 수행되지 않기 때문에 빌드 로그에 액세스하여 발생 가능한 빌드 문제를 정렬할 수 없습니다.

  • 이 프로세스에는 일반 상황에서 쉽게 소진될 수 있는 내부 일일 빌드 시간 할당량이 필요합니다. 그 결과 할당량을 보충하기 전까지 새로운 소스 코드 배포가 제한될 수 있습니다.

  • 함수의 컨테이너 이미지가 저장되는 Container Registry에 액세스할 수 없으므로 사용 가능한 이미지를 확인할 수 없습니다.

최신 런타임

자바 11 이상, Python 3.7 이상, Node.js 10 이상, Go 1.13 이상 등 위에 언급되지 않은 최신 런타임의 경우 이제 빌드 프로세스에 사용된 모든 리소스가 테넌트 프로젝트가 아닌 자체 사용자 프로젝트로 실행됩니다. 이제 이 프로세스가 기본 프로세스입니다.

프로젝트 내에서 빌드 프로세스를 실행하면 다음과 같은 특징이 있습니다.

  • 모든 빌드 로그에 직접 액세스할 수 있습니다.

  • Cloud Build에 고유 기본 동시 실행 할당량이 있더라도 사전 설정된 빌드 시간 할당량이 없습니다.

  • Container Registry에 모두 저장되어 있는 현재 컨테이너 이미지 및 이전에 배포된 컨테이너 이미지를 볼 수 있습니다.

  • Cloud Storage가 프로젝트에 직접 사용되기 때문에 함수의 소스 코드 디렉터리가 gcf-sources-<PROJECT_NUMBER>-<REGION>이라는 버킷에 표시됩니다.

기본 프로세스의 특성

이러한 변경사항으로 인해 기본 프로세스를 사용하는 모든 런타임에는 다음과 같은 특성이 있습니다.

  • 프로젝트에 대해 Cloud Build API를 사용 설정해야 합니다.

    API를 수동으로 사용 설정하려면 위 링크를 클릭하고, 드롭다운 메뉴에서 프로젝트를 선택하고, 계속을 클릭합니다.

  • 전체 빌드 프로세스가 프로젝트의 컨텍스트 내에서 실행되기 때문에 포함된 리소스의 가격 책정에 따라 프로젝트에 영향을 줍니다.

    • Cloud Build 가격 책정은 가격 책정 페이지를 참조하세요. 인스턴스가 사전 워밍되고 빠르게 제공되기 때문에 이 프로세스에는 Cloud Build의 기본 인스턴스 크기가 사용됩니다. Cloud Build는 무료 계층을 제공합니다. 자세한 내용은 가격 책정 문서를 참조하세요.

    • Cloud Storage 가격 책정은 가격 책정 페이지를 참조하세요. Cloud Storage는 무료 계층을 제공합니다. 자세한 내용은 가격 책정 문서를 참조하세요.

    • Container Registry 가격 책정은 가격 책정 페이지를 참조하세요.

  • 빌드 프로세스가 결제 대상이 되므로 프로젝트에 Cloud Billing 계정이 연결되어 있어야 합니다.

빌드 이미지 로그 액세스

사용자 프로젝트에서 빌드 이미지 프로세스가 갖는 주요 이점은 빌드 로그에 액세스할 수 있다는 것입니다. gcloud CLI 또는 Cloud Console을 사용하여 Cloud Logging을 통해 제공되는 로그에 연결할 수 있습니다.

gcloud

  1. gcloud functions deploy 명령어를 사용하여 함수를 배포합니다.

  2. 로그 URL은 터미널 창에 응답의 일부로 표시됩니다. 예를 들면 다음과 같습니다.

    Deploying function (may take a while - up to 2 minutes)...⠹
    **For Cloud Build Stackdriver Logs**, visit:
    https://console.cloud.google.com/logs/viewer?project=&advancedFilter=resource.type%
    3Dbuild%0Aresource.labels.build_id%3D38d5b662-2315-45dd-8aa2-
    380d50d4f5e8%0AlogName%3Dprojects%2F%
    2Flogs%2Fcloudbuild
    Deploying function (may take a while - up to 2 minutes)...done.
    

Cloud Console

  1. 함수 화면에서 관심 있는 함수의 이름을 클릭합니다. 함수 세부정보 페이지가 열립니다.

  2. 아래로 스크롤하여 컨테이너 빌드 섹션을 표시합니다. 빌드에 오류가 없으면 빌드 로그를 표시할 수 있는 링크가 표시됩니다. 빌드에 오류가 있으면, 아래 표시된 것처럼 컨테이너 빌드 섹션에 오류가 인라인으로 표시됩니다. 빌드 로그를 직접 표시하려면 자세히 알아보기를 클릭합니다.

    컨테이너 빌드 섹션의 출력을 보여주는 스크린샷

  3. 로그 뷰어 화면이 열립니다. 관심 있는 항목을 클릭합니다.

  4. 전체 빌드 로그 항목이 열리고, 해당 파일과 오류 설명(여기에서는 pom.xml에서 누락된 브래킷) 그리고 오류 줄 및 열이 표시됩니다.

    빌드 로그 항목을 보여주는 스크린샷

비공개 풀로 빌드 보호

npm 패키지와 같이 함수가 종속 항목을 사용하도록 허용하기 위해 Cloud Build는 기본적으로 빌드 프로세스 중에 무제한으로 인터넷에 액세스할 수 있습니다. VPC 서비스 제어(VPC SC) 경계를 설정했고 빌드의 액세스를 경계 내부에 저장된 종속 항목으로만 제한하려면 Cloud Build 비공개 작업자 풀 기능을 사용하면 됩니다.

일반적으로 다음 단계에 따라 비공개 풀을 설정합니다.

  1. 비공개 작업자 풀을 만듭니다. 비공개 풀 만들기 및 관리를 참조하세요.
  2. VPC 서비스 제어 경계를 구성합니다. VPC 서비스 제어 사용을 참조하세요.

  3. 비공개 작업자 풀이 함수와 다른 프로젝트에 있는 경우 Cloud Functions 서비스 에이전트 서비스 계정(service-FUNCTION_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com)에 cloudbuild.workerPoolUser 역할을 부여하여 Cloud Build 서비스가 작업자 풀에 액세스할 수 있도록 합니다.

    gcloud projects add-iam-policy-binding PRIVATE_POOL_PROJECT_ID \
        --member serviceAccount:service-FUNCTION_PROJECT_NUMBER@gcf-admin-robot.iam.gserviceaccount.com
        --role roles/cloudbuild.workerPoolUser
    

    여기서 FUNCTION_PROJECT_NUMBER는 함수가 실행되는 프로젝트의 번호이고 PRIVATE_POOL_PROJECT_ID는 작업자 풀이 있는 프로젝트의 ID입니다. 자세한 내용은 비공개 풀에서 빌드 실행을 참조하세요.

  4. 비공개 풀을 사용하여 빌드할 함수를 배포합니다.

    gcloud

    gcloud functions deploy FUNCTION_NAME \
       --runtime RUNTIME \
       --build-worker-pool PRIVATE_POOL_NAME
       [FLAGS...]
    

    여기서 FUNCTION_NAME은 함수의 이름이고 RUNTIME은 사용 중인 런타임이며 PRIVATE_POOL_NAME은 풀의 이름입니다.

    지정된 비공개 풀 사용을 중지하고 대신 기본 Cloud Build 풀을 사용하려면 다시 배포할 때 --clear-build-worker-pool 플래그를 사용합니다.

    gcloud functions deploy FUNCTION_NAME \
       --runtime RUNTIME \
       --clear-build-worker-pool
       [FLAGS...]
    

    여기서 FUNCTION_NAME은 함수의 이름이고 RUNTIME은 사용 중인 런타임입니다.

    Cloud Console

    Create function 페이지의 Runtime, build and connections settings 섹션에서 Build 탭을 선택하고 Build worker pools Selected environment 텍스트 상자에 PRIVATE_POOL_NAME을 입력합니다. 여기서 PRIVATE_POOL_NAME은 풀 이름입니다.

    Cloud Console 스크린샷