앱 호스팅 구성

환경 변수와 같은 고급 구성이나 동시 실행, CPU, 메모리 제한과 같은 런타임 설정의 경우 앱의 루트 디렉터리에서 apphosting.yaml 파일을 만들고 수정해야 합니다. 이 파일은 Cloud Secret Manager로 관리되는 보안 비밀에 대한 참조도 지원하므로 소스 제어에 안전하게 체크인할 수 있습니다.

백엔드의 Cloud Run 서비스 설정, 일부 환경 변수, Cloud Secret Manager에서 관리하는 보안 비밀에 대한 참조가 포함된 일반적인 apphosting.yaml 파일은 다음과 같습니다.

# Settings for Cloud Run
runConfig:
  minInstances: 2
  maxInstances: 100
  concurrency: 100
  cpu: 2
  memoryMiB: 1024

# Environment variables and secrets
env:
  - variable: STORAGE_BUCKET
    value: mybucket.appspot.com
    availability:
      - BUILD
      - RUNTIME

  - variable: API_KEY
    secret: myApiKeySecret

    # Same as API_KEY above but with a pinned version.
  - variable: PINNED_API_KEY
    secret: myApiKeySecret@5

    # Same as API_KEY above but with the long form secret reference as defined by Cloud Secret Manager.
  - variable: VERBOSE_API_KEY
    secret: projects/test-project/secrets/secretID

    # Same as API_KEY above but with the long form secret reference with pinned version.
  - variable: PINNED_VERBOSE_API_KEY
    secret: projects/test-project/secrets/secretID/versions/5

이 가이드의 나머지 부분에서는 이러한 설정 예에 대한 자세한 정보와 컨텍스트를 제공합니다.

Cloud Run 서비스 설정 구성

apphosting.yaml 설정을 사용하면 Cloud Run 서비스가 프로비저닝되는 방식을 구성할 수 있습니다. Cloud Run 서비스에 사용할 수 있는 설정은 runConfig 객체에 제공됩니다.

  • cpu – 각 제공 인스턴스에 사용되는 CPU 수입니다 (기본값 0).
  • memoryMiB – 각 제공 인스턴스에 할당된 메모리 양(MiB)(기본값: 512)
  • maxInstances – 한 번에 실행할 수 있는 최대 컨테이너 수입니다. 기본값은 100이며 할당량으로 관리됩니다.
  • minInstances – 항상 활성 상태로 유지할 컨테이너의 수입니다 (기본값 0).
  • concurrency – 각 제공 인스턴스가 수신할 수 있는 최대 요청 수입니다 (기본값: 80).

cpumemoryMiB의 중요한 관계에 유의하세요. 메모리는 128~32768 사이의 정수 값으로 설정할 수 있지만 메모리 한도를 늘리려면 CPU 한도를 늘려야 할 수 있습니다.

  • 4GiB를 초과하면 2개 이상의 CPU 필요
  • 8GiB를 초과하면 4개 이상의 CPU 필요
  • 16GiB를 초과하면 6개 이상의 CPU 필요
  • 24GiB를 초과하면 8개 이상의 CPU 필요

마찬가지로 cpu의 값은 동시 실행 설정에 영향을 미칩니다. CPU를 1개 미만으로 설정하면 동시 실행을 1로 설정해야 합니다. CPU는 요청 처리 중에만 할당됩니다.

빌드 환경 구성

경우에 따라 빌드 프로세스에 서드 파티 API 키 또는 조정 가능한 설정과 같은 추가 구성이 필요할 수 있습니다. App Hosting은 apphosting.yaml에서 프로젝트에 대해 이러한 유형의 데이터를 저장하고 검색할 수 있는 환경 구성을 제공합니다.

env:
-   variable: STORAGE_BUCKET
    value: mybucket.appspot.com

Next.js 앱의 경우 환경 변수가 포함된 dotenv 파일도 App Hosting에서 작동합니다. 모든 프레임워크에서 세분화된 환경 변수를 제어하려면 apphosting.yaml를 사용하는 것이 좋습니다.

apphosting.yaml에서 availability 속성을 사용하여 환경 변수에 액세스할 수 있는 프로세스를 지정할 수 있습니다. 환경 변수를 빌드 환경에서만 사용하거나 런타임 환경에서만 사용할 수 있도록 제한할 수 있습니다. 기본적으로 둘 다 사용할 수 있습니다.

env:
-   variable: STORAGE_BUCKET
    value: mybucket.appspot.com
    availability:
    -   BUILD
    -   RUNTIME

Next.js 앱의 경우 dotenv 파일에서 사용하는 것과 동일한 방식으로 NEXT_PUBLIC_ 프리픽스를 사용하여 브라우저에서 변수에 액세스할 수 있도록 할 수 있습니다.

env:
-   variable: NEXT_PUBLIC_STORAGE_BUCKET
    value: mybucket.appspot.com
    availability:
    -   BUILD
    -   RUNTIME

유효한 변수 키는 A~Z 문자 또는 밑줄로 구성됩니다. 일부 환경 변수 키는 내부용으로 예약되어 있습니다. 구성 파일에서 다음 키를 사용하지 마세요.

  • X_FIREBASE_로 시작하는 모든 변수
  • PORT
  • K_SERVICE
  • K_REVISION
  • K_CONFIGURATION

보안 비밀 매개변수 저장 및 액세스

API 키와 같은 민감한 정보는 보안 비밀로 저장해야 합니다. apphosting.yaml에서 보안 비밀을 참조하여 소스 제어에 민감한 정보를 체크인하지 않도록 할 수 있습니다.

secret 유형의 매개변수는 Cloud Secret Manager에 저장된 값이 있는 문자열 매개변수를 나타냅니다. 보안 비밀 매개변수는 값을 직접 파생하는 대신 Cloud Secret Manager에 있는지 확인하고 출시 중에 값을 로드합니다.

  -   variable: API_KEY
      secret: myApiKeySecret

Cloud Secret Manager의 보안 비밀에는 여러 버전이 있을 수 있습니다. 기본적으로 라이브 백엔드에 사용할 수 있는 보안 비밀 매개변수의 값은 백엔드가 빌드된 시점에 사용 가능한 최신 버전의 보안 비밀에 고정됩니다. 매개변수의 버전 관리 및 수명 주기 관리 요구사항이 있는 경우 Cloud Secret Manager를 사용하여 특정 버전에 고정할 수 있습니다. 예를 들어 버전 5에 고정하려면 다음을 실행하세요.

  - variable: PINNED_API_KEY
    secret: myApiKeySecret@5

CLI 명령어 firebase apphosting:secrets:set를 사용하여 보안 비밀을 만들 수 있으며, 필요한 권한을 추가하라는 메시지가 표시됩니다. 이 흐름을 사용하면 apphosting.yaml에 보안 비밀 참조를 자동으로 추가할 수 있습니다.

Cloud Secret Manager의 전체 기능 모음을 사용하려면 대신 Cloud Secret Manager 콘솔을 사용하면 됩니다. 이 경우 CLI 명령어 firebase apphosting:secrets:grantaccess를 사용하여 App Hosting 백엔드에 권한을 부여해야 합니다.

Firebase 인증 상태 동기화

Firebase 인증을 사용하는 앱은 Firebase 웹 SDK를 사용하여 클라이언트와 서버 간에 인증 상태가 동기화된 상태를 유지하는 것이 좋습니다. 서비스 워커와 함께 FirebaseServerApp를 구현하면 이 작업을 용이하게 할 수 있습니다. 기본 작업 흐름은 다음과 같습니다.

  1. 서버에 대한 요청 시 앱의 올바른 헤더를 추가하는 서비스 워커를 구현합니다.
  2. 서버의 요청에서 헤더를 가져오고 FirebaseServerApp를 사용하여 인증 사용자로 변환합니다.