이 페이지에서는 NGINX를 애플리케이션 컨테이너의 프런트엔드 프록시로 사용하는 방법을 보여줍니다. 이 방법은 요청 또는 응답을 처리하려는 경우에 유용합니다. 애플리케이션 컨테이너가 HTTP/1만 지원하고 성능상의 이유로 HTTP/2 엔드 투 엔드를 사용해야 하는 경우 gzip 압축을 추가하거나 HTTP/2를 HTTP/1로 변환할 수 있습니다.
이 페이지에 제공된 예시에서 Nginx 컨테이너는 모든 Cloud Run 인스턴스에서 기본 서빙되는 컨테이너로 실행되며, 다음 다이어그램과 같이 사이드카 컨테이너로 실행되는 애플리케이션 컨테이너에 요청을 전달하도록 구성됩니다.
Cloud Run에서 프런트엔드 프록시를 수행하는 가장 효과적인 방법은 Nginx 서버 프록시 서버 컨테이너 및 웹 앱 컨테이너를 단일 Cloud Run 서비스로 배포하는 것입니다.
이 단일 Cloud Run 서비스는 요청을 수락하고 인그레스 컨테이너(이 경우 프록시 서버)에 전달합니다. 그런 다음 프록시 서버는 localhost
네트워크 인터페이스를 통해 웹 앱에 요청을 보내 외부 네트워크를 방지합니다.
단일 Cloud Run 서비스로 배포하면 지연 시간, 서비스 관리 오버헤드가 줄어들고 외부 네트워크에 노출되지 않습니다. Cloud Run은 서비스가 시작되거나 중지될 때마다 사이드카 컨테이너를 직접 시작하거나 중지하는 것 외에는 사이드카 컨테이너와 직접 상호작용하지 않습니다.
웹 앱 컨테이너와 모든 사이드카 컨테이너는 다양한 프로그래밍 언어로 작성할 수 있습니다. PHP로 작성된 샘플은 GitHub의 PHP nginx 샘플을 참조하세요.
시작하기 전에
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run and Secret Manager APIs.
- gcloud CLI를 설치하고 초기화합니다.
- Google Cloud CLI를 업데이트합니다.
gcloud components update
- Google Cloud CLI를 구성합니다.
gcloud init
- Google Cloud CLI로 인증합니다.
gcloud auth login
배포 시 필요한 권한
다음 역할 중 하나가 있어야 합니다.
- Cloud Run 관리자 및 서비스 계정 사용자 역할 모두
- 이 특정 권한 목록이 포함된 모든 커스텀 역할
구성 개요
이 안내에서는 사전 빌드된 컨테이너 이미지를 사용하므로 프런트엔드 프록시에 필요한 유일한 경우는 컨테이너와 서비스 자체를 구성하는 것입니다.
Nginx 인그레스 컨테이너 구성
컨테이너 이미지는 nginx
Docker Hub에서 사용할 수 있습니다.
사이드카 컨테이너가 localhost
에서 리슨하는 포트로 프록시 처리된 요청을 전달하도록 프록시 서비스를 구성해야 하는 경우를 제외하고 대부분 그대로 사용할 수 있습니다. 이 페이지의 예시에서는 요청 및 응답에 gzip 압축도 사용 설정합니다.
구성은 /etc/nginx/conf.d/nginx.conf
에 마운트된 텍스트 파일을 사용하여 제공됩니다. 컨테이너에서 파일을 직접 수정할 수 없기 때문에 구성 파일이 포함된 /etc/nginx/conf.d/
에 볼륨을 마운트해야 합니다. Cloud Run에서 실행되는 컨테이너의 특정 위치에 파일을 마운트하는 한 가지 방법은 파일 콘텐츠를 Secret Manager 보안 비밀에 저장하고 해당 보안 비밀을 선택한 위치에 마운트하는 것입니다.
로컬 머신의 현재 디렉터리에 있는 nginx.conf
라는 파일에 다음을 복사합니다.
구성에서 다음을 수행합니다.
nginx
를 할당하여localhost
에 위치한 동일한 Cloud Run 기본 포트8080
에서 리슨합니다.- 성능 향상을 위해 gzip 압축을 적용합니다.
- 이 인그레스 컨테이너에 대한 모든 요청을 localhost 포트
8888
의 웹 앱 사이드카 컨테이너에 전달하도록proxy_pass
에 지시합니다.
nginx.conf
파일의 콘텐츠로 보안 비밀을 만듭니다.
콘솔
Google Cloud 콘솔의 Secret Manager 페이지로 이동합니다.
보안 비밀 만들기를 클릭합니다.
name
양식 필드에 nginx_config를 입력합니다.multi-container/hello-nginx-sample/nginx.conf
에 있는nginx.conf
파일을 보안 비밀 값으로 업로드합니다.기본값(
Google-managed encryption key, etc
)을 유지합니다.보안 비밀 만들기를 클릭합니다.
프로젝트 컴퓨팅 서비스 계정에 이 새로운 보안 비밀에 대한 액세스 권한을 부여합니다. 이렇게 하려면 Google Cloud 콘솔에서 IAM 페이지로 이동합니다.
이름이
Compute Engine default service account
인 주 구성원 서비스 계정을 찾고 주 구성원 수정을 클릭합니다.다른 역할 추가를 클릭하고 Secret Manager 보안 비밀 접근자를 선택합니다.
저장을 클릭합니다.
gcloud
터미널에서 다음 명령어를 사용하여 Secret Manager에서 새
nginx_config
보안 비밀을 만듭니다.gcloud secrets create nginx_config --replication-policy='automatic' --data-file='./nginx.conf'
다음 명령어를 사용해서 프로젝트 컴퓨팅 서비스 계정에 이 새로운 보안 비밀에 대한 액세스 권한을 부여합니다.
export PROJECT_NUMBER=$(gcloud projects describe $(gcloud config get-value project) --format='value(projectNumber)') gcloud secrets add-iam-policy-binding nginx_config --member=serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com --role='roles/secretmanager.secretAccessor'
gcloud secrets list
를 실행하여 보안 비밀이 생성되었는지 확인합니다.
웹 앱 사이드카 샘플 이미지 정보
이 안내에서는 us-docker.pkg.dev/cloudrun/container/hello
에 있는 샘플 컨테이너 이미지를 사용합니다. 사이드카 컨테이너 구성 지정 아래에서 다음 섹션에 설명된 대로 컨테이너가 localhost
에서 호스트로 리슨하는 포트 번호를 지정해야 합니다.
멀티 컨테이너 서비스 구성
Google Cloud 콘솔 또는 Cloud Run YAML 파일을 사용해서 하나 이상의 컨테이너로 Cloud Run 서비스를 구성합니다.
서비스 구성에서 Nginx 프록시 서버를 인그레스(서빙) 컨테이너, 리슨할 포트, HTTP 1 또는 HTTP 2 요청 수락 여부, 컨테이너 시작 순서로 지정합니다. 인그레스 컨테이너(프록시 서버)는 웹 앱 사이드카에 따라 다르므로 웹 앱 사이드카를 먼저 시작해야 합니다.
이러한 구성은 다음 일부 섹션에 표시되어 있습니다.
YAML 메타데이터 추가
콘솔
전체 콘솔 안내를 보려면 서비스 배포로 이동합니다.
YAML
새 서비스를 만드는 경우에는 이 단계를 건너뜁니다. 기존 서비스를 업데이트하는 경우 YAML 구성을 다운로드합니다.
gcloud run services describe SERVICE --format export > service.yaml
service.yaml
에서 다음을 추가합니다.
이 섹션에서는 버전마다 다를 수 있는 속성이 포함된 서비스 버전에 대해 설명합니다.
컨테이너 시작 순서 지정
콘솔
전체 콘솔 안내를 보려면 서비스 배포로 이동합니다.
YAML
service.yaml
에서 다음을 추가합니다.
nginx 컨테이너를 시작하기 전 hello 컨테이너가 시작될 때까지 기다리도록 Cloud Run에 지시하는 container-dependencies
주석을 확인합니다. 그렇지 않으면 nginx 컨테이너가 먼저 시작되는 경우 준비되지 않은 웹 앱 컨테이너로 웹 요청을 프록시하려고 시도할 수 있으며 이로 인해 웹 오류 응답이 생성됩니다.
각 컨테이너는 선택적으로 이름 속성을 정의할 수 있으며 이를 다른 지시어에서 참조하는 데 사용할 수 있습니다.
서빙 컨테이너는 nginx
라는 프록시 서버를 실행합니다. Cloud Run이 수신 요청을 전달하는 컨테이너이므로 전송할 HTTP
및 컨테이너 포트의 버전을 지정해야 합니다.
서빙 컨테이너 구성 지정
콘솔
전체 콘솔 안내를 보려면 서비스 배포로 이동합니다.
YAML
service.yaml
파일에서 다음을 추가합니다.
nginx
서버에는 /etc/nginx/conf.d/
디렉터리의 구성 파일이 필요합니다. 이를 수행하려면 해당 위치에서 파일이 포함된 볼륨을 마운트합니다. volumeMount
섹션은 configuration
이라는 볼륨을 여기에 배치하도록 지정합니다. 볼륨 자체는 나중에 파일의 고유 섹션에 정의됩니다.
사이드카 컨테이너 구성 지정
콘솔
전체 콘솔 안내를 보려면 서비스 배포로 이동합니다.
YAML
service.yaml
에서 다음을 추가합니다.
hello
애플리케이션에는 구성 정보도 필요합니다. PORT
환경 변수에 지정된 포트에서 수신 요청을 리슨합니다. 해당 이름과 값은 env
섹션에 지정됩니다.
보안 비밀 볼륨 지정
콘솔
전체 콘솔 안내를 보려면 서비스 배포로 이동합니다.
YAML
service.yaml
파일에서 다음을 추가합니다.
volumeMount
섹션에 마운트된 volume
구성을 지정합니다. 콘텐츠가 nginx-conf-secret
이라는 보안 비밀 값으로 정의된 nginx.conf
라는 단일 파일을 포함합니다.
서비스 배포
콘솔
Google Cloud 콘솔에서 Cloud Run 페이지로 이동합니다.
컨테이너 배포를 클릭하고 서비스를 선택하여 서비스 만들기 양식을 표시합니다.
- 기존 컨테이너 이미지에서 버전 1개 배포를 선택하고
nginx
를 컨테이너 이미지 URL로 입력합니다. - 서비스 이름 필드에서 서비스 이름을 제공합니다(예:
hello-mc
). - 리전 목록에서 배포하려는 위치를 선택합니다(예:
us-west1
). - 인증 아래에서
Allow unauthenticated invocations
를 선택합니다. 이를 선택할 수 있는 권한(Cloud Run 관리자 역할)이 없으면 서비스가 배포되고 인증이 요구됩니다.
- 기존 컨테이너 이미지에서 버전 1개 배포를 선택하고
컨테이너, 볼륨, 네트워킹, 보안을 클릭하여 구성 양식을 확장합니다.
- 볼륨 탭을 클릭합니다.
- 볼륨 추가를 클릭합니다.
- 볼륨 유형 목록에서 보안 비밀을 선택합니다.
- 볼륨 이름 필드에
nginx-conf-secret
을 입력합니다. - 보안 비밀 필드에 nginx_config를 입력합니다.
- 보안 비밀 버전에 지정된 경로 아래에서 default.conf 경로 및 latest 버전을 지정합니다.
- 만들기를 클릭하여 보안 비밀 볼륨을 만듭니다.
컨테이너 탭을 클릭하여 컨테이너 수정 양식을 표시합니다.
- 설정을 클릭한 후 리소스 아래에서 메모리를 256MiB로로 변경하고 CPU를 CPU 1개로 변경합니다.
- 볼륨 마운트를 클릭합니다.
- 볼륨 마운트를 클릭합니다.
- 이름 목록에서 nginx-conf-secret을 선택합니다.
- 마운트 경로에 etc/nginx/conf.d를 입력합니다.
- 완료를 클릭하여 첫 번째 컨테이너의 구성을 완료합니다.
컨테이너 추가를 클릭하여 사이드카 컨테이너를 추가하고 새 컨테이너 양식을 표시합니다.
- 기본 컨테이너 이미지 URL us-docker.pkg.dev/cloudrun/container/hello를 선택합니다.
- 설정 탭을 클릭한 후 리소스 아래에서 메모리를 256MiB로 변경하고 CPU를 CPU 1개로 변경합니다.
- 변수 및 보안 비밀을 클릭합니다.
- 변수 추가를 클릭합니다.
- 새 환경 변수 이름으로 PORT를 입력하고 값으로 8888을 입력합니다.
- 완료를 클릭합니다.
첫 번째 컨테이너(
nginx
)의 컨테이너 수정 양식으로 이동합니다.- 설정 탭을 클릭합니다.
- 컨테이너 시작 순서 아래의 종속 항목 목록에서
nginx
를 선택합니다. 즉,hello
컨테이너가 성공적으로 시작된 후에만nginx
컨테이너가 시작됩니다. - 만들기를 클릭하고 서비스가 배포될 때까지 기다립니다.
gcloud
프록시 서버 컨테이너 및 웹 앱 컨테이너를 단일 서비스로 배포하려면 다음 안내를 따르세요.
gcloud run services replace service.yaml
배포된 서비스 확인
gcloud
배포가 성공했는지 확인하려면 생성된 Cloud Run URL을 복사하고 브라우저에서 열거나 다음 명령어를 사용해서 인증된 요청을 전송합니다.
curl --header "Authorization: Bearer $(gcloud auth print-identity-token)"
응답 상태가 200
인 hello 사이드카 컨테이너로 성공적으로 포팅된 nginx 프록시가 표시됩니다.
직접 사용해 보기
이 튜토리얼을 따라 진행하려면 다음을 수행하세요.
gcloud
터미널에서 로컬 머신에 샘플 앱 저장소를 클론합니다.
git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
Cloud Run 샘플 코드가 포함된 디렉터리로 변경합니다.
cd cloud-run-samples/multi-container/hello-nginx-sample/
다음 단계
Cloud Run 서비스에서 사이드카를 사용하는 방법을 자세히 알아보려면 다음 안내를 따르세요.