기본적으로 Cloud Run 서비스는 동적 IP 주소 풀을 사용해서 인터넷의 외부 엔드포인트에 연결됩니다. 데이터베이스 또는 IP 주소 기반 방화벽을 사용하는 API와 같이 고정 IP 주소로부터 시작되는 연결이 필요한 외부 엔드포인트에 Cloud Run 서비스가 연결되는 경우에는 이 기본값이 적절하지 않습니다. 이러한 연결의 경우 고정 IP 주소를 통해 요청을 라우팅하도록 Cloud Run 서비스를 구성해야 합니다.
이 가이드에서는 고정 IP 주소를 사용해서 요청을 전송하도록 Cloud Run 서비스를 사용 설정하는 방법을 설명합니다.
태스크 개요
고정 IP 주소를 통해 요청을 라우팅하도록 Cloud Run 서비스를 사용 설정하려면 Cloud NAT 게이트웨이가 고정 IP 주소로 구성된 VPC 네트워크를 통해 모든 아웃바운드 트래픽을 라우팅하도록 Cloud Run 서비스의 VPC 이그레스를 구성합니다.
Cloud NAT 게이트웨이 및 Cloud Router가 제어 영역만 제공하고, 패킷이 NAT 게이트웨이 또는 Cloud Router를 통과하지 않기 때문에 Cloud NAT를 통해 트래픽을 라우팅해도 네트워킹 스택에 추가 홉이 발생하지 않습니다. .
동일한 VPC 네트워크에 연결된 모든 Cloud Run 서비스는 동일한 이그레스 IP 주소를 공유합니다. 개별 Cloud Run 서비스에 서로 다른 이그레스 IP 주소를 사용하려면 이 가이드를 참조하여 별도의 서브넷을 만들고 필요할 경우 서버리스 VPC 액세스 커넥터도 만드세요.
서브넷 만들기
커넥터를 호스팅하려면 전용 /28
서브넷을 만들어야 합니다. 직접 VPC 이그레스를 사용하는 경우 기존 서브넷을 사용하거나 다른 서브넷을 만듭니다.
커넥터를 사용하면 전용 서브넷이 VPC의 다른 컴퓨팅 리소스(예: Compute Engine VM 또는 Google Kubernetes Engine 클러스터)가 실수로 고정 IP를 사용하는 것을 방지합니다(인터넷에 액세스하도록 서버리스 VPC 액세스를 구성한 경우).
gcloud
VPC 네트워크의 이름을 찾습니다.
gcloud compute networks list
다음과 같은 출력이 표시되어야 합니다.
NAME SUBNET_MODE BGP_ROUTING_MODE default AUTO REGIONAL
서버리스 VPC 액세스 커넥터에 연결할 네트워크를 식별합니다.
VPC에서 서버리스 VPC 액세스 커넥터의 서브넷을 만드세요.
gcloud compute networks subnets create SUBNET_NAME \ --range=RANGE --network=NETWORK_NAME --region=REGION
이 명령어에서 다음과 같이 값을 바꿉니다.
SUBNET_NAME
: 서브넷에 지정할 이름RANGE
: 이 서브넷에 할당하려는 CIDR 형식의 IP 범위(예를 들어10.124.0.0/28
)NETWORK_NAME
: VPC 네트워크의 이름REGION
: 서버리스 VPC 액세스 커넥터를 만들려는 리전
Terraform
사용할 VPC 네트워크를 만듭니다.
cr-static-ip-network
를 서브넷 이름으로 바꿉니다.VPC에서 서버리스 VPC 액세스 커넥터의 서브넷을 만드세요.
바꾸기
cr-static-ip
: 서브넷 이름10.124.0.0/28
: CIDR 범위us-central1
: Google Cloud 리전
서버리스 VPC 액세스 커넥터 만들기
직접 VPC 이그레스 통합을 사용하는 경우 커넥터를 만들 필요가 없습니다. 직접 VPC 이그레스를 사용하지 않는 경우에는 Cloud Run 서비스 아웃바운드 트래픽을 VPC 네트워크로 라우팅하는 서버리스 VPC 액세스 커넥터가 필요합니다.
서버리스 VPC 액세스 커넥터 만들기
gcloud
사전 생성된 서브넷으로 서버리스 VPC 액세스 커넥터를 만듭니다.
gcloud compute networks vpc-access connectors create CONNECTOR_NAME \ --region=REGION \ --subnet-project=PROJECT_ID \ --subnet=SUBNET_NAME
이 명령어에서 다음과 같이 값을 바꿉니다.
CONNECTOR
: 이 리소스에 지정할 이름PROJECT_ID
: 서브넷을 호스팅하는 이름SUBNET_NAME
: 사용자가 만든 서브넷의 이름REGION
: NAT 게이트웨이를 만들려는 리전
Terraform
서버리스 VPC 액세스 커넥터를 만듭니다.
cr-conn
을 서버리스 VPC 액세스 커넥터의 이름으로 바꿉니다.
네트워크 주소 변환(NAT) 구성
직접 VPC 이그레스 또는 서버리스 VPC 액세스 커넥터를 사용하는 경우 Cloud Run 서비스의 요청이 VPC 네트워크에 도달합니다. 고정 IP를 통해 아웃바운드 요청을 외부 엔드포인트로 라우팅하려면 Cloud NAT 게이트웨이를 구성합니다.
gcloud
NAT 게이트웨이를 프로그래밍하기 위해 새 Cloud Router를 만듭니다.
gcloud compute routers create ROUTER_NAME \ --network=NETWORK_NAME \ --region=REGION
이 명령어에서 다음과 같이 값을 바꿉니다.
ROUTER_NAME
: 만들려는 Cloud Router 리소스 이름NETWORK_NAME
: 이전에 찾은 VPC 네트워크 이름REGION
: NAT 게이트웨이를 만들려는 리전
고정 IP 주소를 예약합니다. 예약된 IP 주소 리소스에는 연관된 리소스가 삭제되고 다시 생성될 때 기본 IP 주소가 유지됩니다.
gcloud compute addresses create ORIGIN_IP_NAME --region=REGION
이 명령어에서 다음과 같이 값을 바꿉니다.
ORIGIN_IP_NAME
: IP 주소 리소스에 할당하려는 이름REGION
: Cloud NAT 라우터를 실행할 리전. 지연 시간 및 네트워크 비용을 최소화하기 위해서는 Cloud Run 서비스와 동일한 리전이 이상적입니다.
생성한 고정 IP 주소를 사용하여 VPC 네트워크에서 시작되는 트래픽을 라우팅하기 위해 이 라우터에서 Cloud NAT 게이트웨이 구성을 만듭니다.
gcloud compute routers nats create NAT_NAME \ --router=ROUTER_NAME \ --region=REGION \ --nat-custom-subnet-ip-ranges=SUBNET_NAME \ --nat-external-ip-pool=ORIGIN_IP_NAME
이 명령어에서 다음과 같이 값을 바꿉니다.
NAT_NAME
: 만들려는 Cloud NAT 게이트웨이 리소스의 이름ROUTER_NAME
: Cloud Router 이름REGION
: NAT 게이트웨이를 만들려는 리전ORIGIN_IP_NAME
: 이전 단계에서 만든 예약된 IP 주소 리소스의 이름
Terraform
NAT 게이트웨이를 프로그래밍하기 위해 새 Cloud Router를 만듭니다.
cr-static-ip-router
를 서브넷 이름으로 바꿉니다.고정 IP 주소를 예약합니다. 예약된 IP 주소 리소스에는 연관된 리소스가 삭제되고 다시 생성될 때 기본 IP 주소가 유지됩니다.
cr-static-ip-addr
를 서브넷 이름으로 바꿉니다.생성한 고정 IP 주소를 사용하여 VPC 네트워크에서 시작되는 트래픽을 라우팅하기 위해 이 라우터에서 Cloud NAT 게이트웨이 구성을 만듭니다.
cr-static-nat
를 Cloud NAT 게이트웨이 이름으로 바꿉니다.
VPC 네트워크를 통해 Cloud Run 트래픽 라우팅
NAT가 구성된 후 직접 VPC 이그레스 또는 서버리스 VPC 액세스 커넥터를 사용하여 Cloud Run 서비스를 배포하거나 업데이트하고 모든 트래픽이 VPC 네트워크를 통해 라우팅되도록 VPC 이그레스를 설정합니다.
gcloud
직접 VPC 이그레스
직접 VPC 이그레스를 사용하고 이를 통해 모든 이그레스 트래픽이 라우팅되도록 Cloud Run 서비스를 배포하거나 업데이트하려면 다음 명령어를 실행합니다.
gcloud run deploy SERVICE_NAME \ --image=IMAGE_URL \ --network=NETWORK \ --subnet=SUBNET \ --region=REGION \ --vpc-egress=all-traffic
이 명령어에서 다음과 같이 값을 바꿉니다.
- SERVICE_NAME: 배포하려는 Cloud Run 서비스의 이름
- IMAGE_URL을 컨테이너 이미지에 대한 참조(예:
us-docker.pkg.dev/cloudrun/container/hello:latest
)로 바꿉니다. Artifact Registry를 사용하는 경우 저장소 REPO_NAME이 이미 생성되어 있어야 합니다. URL의 형식은LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
입니다. - NETWORK를 VPC 네트워크의 이름으로 바꿉니다.
- SUBNET을 서브넷 이름으로 바꿉니다.
- REGION을 서비스 리전으로 바꿉니다.
서버리스 VPC 액세스 커넥터
서버리스 VPC 액세스 커넥터를 사용하고 이를 통해 모든 이그레스 트래픽이 라우팅되도록 Cloud Run 서비스를 배포하거나 업데이트하려면 다음 명령어를 실행합니다.
gcloud run deploy SERVICE_NAME \ --image=IMAGE_URL \ --vpc-connector=CONNECTOR_NAME \ --region=REGION \ --vpc-egress=all-traffic
이 명령어에서 다음과 같이 값을 바꿉니다.
- SERVICE_NAME: 배포하려는 Cloud Run 서비스의 이름
- IMAGE_URL을 컨테이너 이미지에 대한 참조(예:
us-docker.pkg.dev/cloudrun/container/hello:latest
)로 바꿉니다. Artifact Registry를 사용하는 경우 저장소 REPO_NAME이 이미 생성되어 있어야 합니다. URL의 형식은LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG
입니다. - CONNECTOR_NAME을 서버리스 VPC 액세스 커넥터 이름으로 바꿉니다.
- REGION을 서비스 리전으로 바꿉니다.
Terraform
이 Cloud Run 서비스는 VPC 커넥터를 사용하고 이를 통해 모든 이그레스 트래픽을 라우팅합니다.
us-docker.pkg.dev/cloudrun/container/hello
를 컨테이너 이미지에 대한 참조로 바꿉니다.
고정 외부 IP 확인
앞의 단계를 완료하면 VPC 네트워크에 미리 정의된 고정 IP 주소를 사용하여 Cloud NAT가 설정됩니다. 또한 모든 Cloud Run 서비스의 아웃바운드 트래픽이 VPC 네트워크로 라우팅됩니다. Cloud Run 서비스의 요청이 VPC 네트워크를 통과하고 고정 IP 주소를 사용해서 외부 엔드포인트에 연결됩니다.
이 동작을 확인하고 서비스에 사용되는 원래 IP 주소를 확인하기 위해서는 원본 IP 주소를 보여주는 curlmyip.org와 같은 API 또는 웹사이트에 요청을 수행할 수 있습니다.
고정 외부 IP 삭제
고정 외부 IP 주소가 더 이상 필요하지 않으면 고정 외부 IP 주소 해제를 참조하세요.