Cloud Run을 Firebase Hosting과 페어링하면 동적 콘텐츠를 생성하여 제공하거나 REST API를 마이크로서비스로 빌드할 수 있습니다.
Cloud Run을 사용해 컨테이너 이미지로 패키징된 애플리케이션을 배포할 수 있습니다. 그런 다음 Firebase Hosting을 사용하여 HTTPS 요청을 전달하면 컨테이너화된 앱을 트리거할 수 있습니다.
- Cloud Run은 여러 언어(Go, Node.js, Python, Java 등)를 지원하므로 원하는 프로그래밍 언어와 프레임워크를 자유롭게 사용할 수 있습니다.
- Cloud Run은 수신된 요청을 처리하기 위해 컨테이너 이미지를 자동 및 수평 확장한 다음 수요가 감소하면 축소합니다.
- 요청 처리 도중 소비한 CPU, 메모리, 네트워킹에 대해서만 비용을 지불하면 됩니다.
Firebase Hosting과 통합된 Cloud Run의 사용 사례 및 샘플은 Google의 서버리스 개요를 참조하세요.
이 가이드에서는 다음을 수행하는 방법을 설명합니다.
- 간단한 Hello World 애플리케이션 작성
- 앱을 컨테이너화하여 Container Registry에 업로드
- Cloud Run에 컨테이너 이미지 배포
- 컨테이너화된 앱으로 Hosting 요청 전달
제공하는 동적 콘텐츠의 성능을 높이기 위해 필요에 따라 캐시 설정을 조정할 수 있습니다.
시작하기 전에
Cloud Run을 사용하기 전에 Cloud Billing 계정 설정, Cloud Run API 사용 설정, gcloud
명령줄 도구 설치 등 몇 가지 초기 작업을 먼저 완료해야 합니다.
프로젝트에 대한 결제 설정
Cloud Run은 무료 사용 할당량을 제공하지만 Firebase 프로젝트와 연결된 Cloud Billing 계정이 있어야 Cloud Run을 사용해 볼 수 있습니다.
API 사용 설정 및 SDK 설치
Google API 콘솔에서 Cloud Run API를 사용 설정합니다.
Google API 콘솔에서 Cloud Run API 페이지를 엽니다.
메시지가 나타나면 Firebase 프로젝트를 선택합니다.
Cloud Run API 페이지에서 사용 설정을 클릭합니다.
gcloud
도구가 올바른 프로젝트에 구성되었는지 확인합니다.gcloud config list
1단계: 샘플 애플리케이션 작성
Cloud Run은 다음 샘플에 나와 있는 언어 외에도 다양한 다른 언어를 지원합니다.
Go
helloworld-go
라는 새 디렉터리를 만든 후 이 위치로 디렉터리를 변경합니다.mkdir helloworld-go
cd helloworld-go
helloworld.go
라는 새 파일을 만든 후 다음 코드를 추가합니다.이 코드는
PORT
환경 변수로 정의한 포트를 리슨하는 기본 웹 서버를 생성합니다.
앱이 완성되었으며 컨테이너 작업 및 Container Registry에 업로드할 준비가 되었습니다.
Node.js
helloworld-nodejs
라는 새 디렉터리를 만든 후 이 위치로 디렉터리를 변경합니다.mkdir helloworld-nodejs
cd helloworld-nodejs
다음 콘텐츠로
package.json
이라는 파일을 만듭니다.index.js
라는 새 파일을 만든 후 다음 코드를 추가합니다.이 코드는
PORT
환경 변수로 정의한 포트를 리슨하는 기본 웹 서버를 생성합니다.
앱이 완성되었으며 컨테이너 작업 및 Container Registry에 업로드할 준비가 되었습니다.
Python
helloworld-python
라는 새 디렉터리를 만든 후 이 위치로 디렉터리를 변경합니다.mkdir helloworld-python
cd helloworld-python
app.py
라는 새 파일을 만든 후 다음 코드를 추가합니다.이 코드는
PORT
환경 변수로 정의한 포트를 리슨하는 기본 웹 서버를 생성합니다.
앱이 완성되었으며 컨테이너 작업 및 Container Registry에 업로드할 준비가 되었습니다.
자바
자바 SE 8 이상 JDK 및 CURL을 설치합니다.
다음 단계에서 새 웹 프로젝트를 만들려면 이 작업만 수행하면 됩니다. 나중에 설명하게 될 Dockerfile은 컨테이너에 모든 종속 항목을 로드합니다.
콘솔에서 cURL과 unzip 명령어를 차례로 사용하여 새로운 빈 웹 프로젝트를 만듭니다.
curl https://start.spring.io/starter.zip \ -d dependencies=web \ -d name=helloworld \ -d artifactId=helloworld \ -o helloworld.zip
unzip helloworld.zip
이렇게 하면 SpringBoot 프로젝트가 만들어집니다.
/
매핑을 처리하기 위해@RestController
를 추가하여src/main/java/com/example/helloworld/HelloworldApplication.java
에서SpringBootApplication
클래스를 업데이트하고@Value
필드도 추가하여TARGET
환경 변수를 제공합니다.이 코드는
PORT
환경 변수로 정의한 포트를 리슨하는 기본 웹 서버를 생성합니다.
앱이 완성되었으며 컨테이너 작업 및 Container Registry에 업로드할 준비가 되었습니다.
2단계: 앱을 컨테이너화하여 Container Registry에 업로드
소스 파일과 동일한 디렉터리에
Dockerfile
이라는 새 파일을 만들어 샘플 앱을 컨테이너화합니다. 다음 콘텐츠를 파일에 복사합니다.Go
Node.js
Python
자바
Dockerfile이 포함된 디렉터리에서 다음 명령어를 실행하여 Cloud Build로 컨테이너 이미지를 빌드합니다.
gcloud builds submit --tag gcr.io/PROJECT_ID/helloworld
성공하면 다음 이미지 이름이 포함된 성공 메시지가 표시됩니다.
(gcr.io/PROJECT_ID/helloworld
)
이제 컨테이너 이미지가 Container Registry에 저장되며 원하는 경우 다시 사용할 수 있습니다.
Cloud Build 대신 로컬에 설치된 Docker 버전을 사용하여 로컬에서 컨테이너를 빌드할 수 있습니다.
3단계: Cloud Run에 컨테이너 이미지 배포
다음 명령어를 사용하여 배포합니다.
gcloud run deploy --image gcr.io/PROJECT_ID/helloworld
메시지가 표시되면 다음 단계를 수행합니다.
- 리전을 선택합니다(예:
us-central1
). - 서비스 이름을 확인합니다(예:
helloworld
). Y
로 응답하여 인증되지 않은 호출을 허용합니다.
- 리전을 선택합니다(예:
최상의 성능을 얻으려면 다음 리전을 사용하여 Cloud Run 서비스를 Hosting과 같은 위치에 배치합니다.
us-west1
us-central1
us-east1
europe-west1
asia-east1
Hosting에서 Cloud Run으로의 재작성은 다음 리전에서 지원됩니다.
asia-east1
asia-east2
asia-northeast1
asia-northeast2
asia-northeast3
asia-south1
asia-south2
asia-southeast1
asia-southeast2
australia-southeast1
australia-southeast2
europe-central2
europe-north1
europe-southwest1
europe-west1
europe-west12
europe-west2
europe-west3
europe-west4
europe-west6
europe-west8
europe-west9
me-central1
me-west1
northamerica-northeast1
northamerica-northeast2
southamerica-east1
southamerica-west1
us-central1
us-east1
us-east4
us-east5
us-south1
us-west1
us-west2
us-west3
us-west4
us-west1
us-central1
us-east1
europe-west1
asia-east1
배포가 완료될 때까지 잠시 기다립니다. 성공하면 명령줄에 서비스 URL이 표시됩니다. 예를 들면 다음과 같습니다.
https://helloworld-RANDOM_HASH-us-central1.a.run.app 웹브라우저에서 서비스 URL을 열고 배포한 컨테이너로 이동합니다.
다음 단계에서는 Firebase가 호스팅하는 사이트에 동적 콘텐츠를 생성할 수 있도록 Firebase Hosting URL에서 이 컨테이너화된 앱에 액세스하는 방법을 설명합니다.
4단계: 컨테이너화된 앱으로 호스팅 요청 전달
재작성 규칙을 사용하면 특정 패턴과 일치하는 요청을 단일 대상으로 전달할 수 있습니다.
다음 예시에서는 Hosting 사이트의 /helloworld
페이지에서 보내는 모든 요청을 전달하여 helloworld
컨테이너 인스턴스의 시작 및 실행을 트리거하는 방법을 보여줍니다.
다음 사항을 확인하세요.
최신 버전의 Firebase CLI 보유 여부
Firebase Hosting 초기화 여부
CLI 설치 및 Hosting 초기화에 관한 자세한 내용은 Hosting 시작 가이드를 참조하세요.
firebase.json
파일을 엽니다.hosting
섹션 아래에 다음rewrite
구성을 추가합니다."hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "/helloworld", "run": { "serviceId": "helloworld", // "service name" (from when you deployed the container image) "region": "us-central1", // optional (if omitted, default is us-central1) "pinTag": true // optional (see note below) } } ] }
프로젝트 디렉터리의 루트에서 다음 명령어를 실행하여 호스팅 구성을 사이트에 배포합니다.
firebase deploy --only hosting
이제 다음 URL을 통해 컨테이너에 연결할 수 있습니다.
Firebase 하위 도메인:
PROJECT_ID.web.app/
및PROJECT_ID.firebaseapp.com/
연결된 모든 커스텀 도메인:
CUSTOM_DOMAIN/
재작성 규칙에 대한 자세한 내용은 Hosting 구성 페이지를 참조하세요. 또한 다양한 Hosting 구성에 관한 응답 우선순위에 대해서도 알아볼 수 있습니다.
로컬에서 테스트
개발 단계에서는 컨테이너 이미지를 로컬에서 실행하고 테스트할 수 있습니다. 자세한 안내는 Cloud Run 문서를 참조하세요.
다음 단계
글로벌 CDN에서 동적 콘텐츠의 캐싱 설정
Firebase Admin SDK를 사용하여 다른 Firebase 서비스와 상호작용
컨테이너 설정, 관리, 구성에 대한 자세한 안내 가이드를 비롯하여 Cloud Run에 대해 자세히 알아보기