네트워크 설정 구성

Cloud Functions 네트워크 설정을 사용하면 개별 함수 간에 네트워크 인그레스 및 이그레스를 제어할 수 있습니다. 예를 들어 다음 사용 사례에 네트워크 설정을 사용할 수 있습니다.

  • 네트워크 기반 액세스 제어를 구현하여 함수 보안을 설정합니다.
  • 방화벽, DNS, VPC 네트워크와 연결된 라우팅 규칙을 준수하도록 함수의 이그레스 트래픽을 설정합니다.
  • 함수의 이그레스 트래픽을 고정 IP 주소와 연결합니다.

사용 사례에 대한 자세한 내용은 사용 사례 예시 섹션을 참조하세요.

인그레스 설정

인그레스 설정은 Google Cloud 프로젝트 또는 VPC 서비스 제어 서비스 경계 외부의 리소스가 함수를 호출할 수 있는지 여부를 제어합니다.

VPC 서비스 제어 경계 정책의 적용을 받으려면 리소스가 제한할 서비스에 속해야 합니다. Cloud Functions(1세대)의 경우 제한된 서비스는 Cloud Functions API입니다. Cloud Functions(2세대)의 경우 Cloud Run Admin API입니다.

제한사항

Cloud Functions(1세대): 내부 전용 HTTP 트리거되는 함수는 Kubernetes Engine, Compute Engine, App Engine 가변형 환경과 같이 VPC 네트워크 내에서 생성되거나 동일한 프로젝트 또는 VPC 서비스 제어 경계에 있는 Cloud Scheduler, Cloud Tasks, Workflows, BigQuery 리소스에 의해 생성된 HTTP 요청에 의해서만 호출될 수 있습니다. 즉, Pub/Sub 또는 Eventarc를 통해 생성되거나 라우팅된 HTTP 요청은 이러한 함수를 트리거할 수 없습니다. 이벤트 트리거는 항상 '내부'로 간주되며 인그레스 설정과 관계없이 허용됩니다.

인그레스 설정 구성

프로젝트 또는 경계 외부에서 리소스를 제한하려면 다음 인그레스 설정 값 중 하나를 지정합니다.

  • 모든 트래픽 허용: 기본값입니다. 함수에 대한 모든 인바운드 요청은 동일한 프로젝트 내 리소스와 인터넷 모두에서 허용됩니다.
  • 내부 트래픽만 허용: 동일한 프로젝트 또는 VPC 서비스 제어 경계에 있는 Cloud Scheduler, Cloud Tasks, Eventarc, Workflows, BigQuery, VPC 네트워크 트래픽만 허용됩니다. 다른 모든 요청은 404 오류와 함께 거부됩니다.

    공유 VPC의 요청에 대해서는 다음 고려사항을 참조하세요.

    • 함수가 공유 VPC 호스트 프로젝트에 배포된 경우 트래픽이 내부에 있는 것으로 간주됩니다.
    • 공유 VPC 호스트와 모든 서비스 프로젝트가 같은 VPC 서비스 제어 경계 내에 있으면 트래픽이 내부에 있는 것으로 간주됩니다.
    • 함수가 동일한 공유 VPC 네트워크에 연결된 경우 Cloud Functions(2세대) 함수에 대한 트래픽이 내부에 있는 것으로 간주됩니다.
    • 공유 VPC 네트워크의 다른 모든 트래픽은 거부됩니다.
  • 내부 트래픽 및 Cloud Load Balancing의 트래픽 허용: 동일한 프로젝트 또는 VPC 서비스 제어 경계에 있는 Cloud Scheduler, Cloud Tasks, Eventarc, Workflows, BigQuery, VPC 네트워크 트래픽만 허용됩니다. Cloud Load Balancing의 트래픽이 허용됩니다.

함수를 배포하거나 업데이트할 때 Google Cloud 콘솔, Google Cloud CLI, Terraform을 사용하여 인그레스 설정을 지정할 수 있습니다.

콘솔

  1. Google Cloud Console에서 함수 개요 페이지를 엽니다.

    Cloud Functions 개요 페이지로 이동

  2. 함수 만들기를 클릭합니다. 또는 기존 함수를 클릭하여 세부정보 페이지로 이동하고 수정을 클릭합니다.

  3. 런타임, 빌드...를 클릭하여 고급 설정을 펼칩니다.

  4. 연결 섹션에서 인그레스 설정의 값을 선택합니다.

gcloud

gcloud functions deploy 명령어를 사용하여 함수를 배포하거나 업데이트하고 --ingress-settings 플래그를 지정합니다.

  gcloud functions deploy FUNCTION_NAME 
--trigger-http
--ingress-settings INGRESS_SETTINGS
FLAGS...

각 항목의 의미는 다음과 같습니다.

  • FUNCTION_NAME은 함수의 이름입니다.
  • INGRESS_SETTINGS인그레스 설정에 지원되는 값 중 하나입니다. 사용할 수 있는 값은 다음과 같습니다.

    • all
    • internal-only
    • internal-and-gclb: Cloud Load Balancing에서 노출되는 공개 IP로 전송되는 트래픽과 내부 트래픽을 허용합니다. cloudfunctions.net 또는 Cloud Functions를 통해 설정된 커스텀 도메인으로 전송되는 트래픽을 차단합니다. Cloud Load Balancing을 통해 설정한 모든 액세스 제어(Cloud Armor, IAP)를 사용자가 우회하지 못하도록 방지합니다.
  • FLAGS...deploy 명령어에 전달하는 다른 플래그를 나타냅니다.

Terraform

선택사항. Terraform 리소스에서 main.tf 파일의 인그레스 설정 필드를 업데이트하려면 배포하거나 업데이트하려는 ingress_settings 인수를 포함합니다. 인그레스 설정을 변경하면 함수가 다시 생성됩니다.

  1. main.tf 파일에서 인그레스 설정을 제한하려는 리소스를 찾아 원하는 설정으로 업데이트합니다. 예를 들면 다음과 같습니다.

    resource "google_cloudfunctions_function" "function" {
      name             = "function"
      location         = "us-central1"
      description      = "Sample function"
      ingress_settings = "INGRESS_SETTINGS"
    }
    

    여기서 INGRESS_SETTINGS인그레스 설정에 지원되는 값 중 하나입니다. 사용할 수 있는 값은 다음과 같습니다.

    • ALLOW_ALL(기본값): 함수에 대한 모든 인바운드 요청은 동일한 프로젝트 내 리소스와 인터넷 모두에서 허용됩니다.
    • ALLOW_INTERNAL_ONLY: 동일한 프로젝트 또는 VPC 서비스 제어 경계에 있는 Cloud Scheduler, Cloud Tasks, Eventarc, Workflows, VPC 네트워크 트래픽만 허용됩니다.
    • ALLOW_INTERNAL_AND_GCLB: Cloud Load Balancing에서 노출되는 공개 IP로 전송되는 트래픽과 내부 트래픽을 허용합니다. cloudfunctions.net 또는 Cloud Functions를 통해 설정된 커스텀 도메인으로 전송되는 트래픽을 차단합니다. Cloud Load Balancing을 통해 설정한 모든 액세스 제어(Cloud Armor, IAP)를 사용자가 우회하지 못하도록 방지합니다.

Google Cloud Armor를 Cloud Load Balancing과 함께 사용하는 경우 수신 요청의 IP 주소, IP 범위, 리전 코드 또는 요청 헤더와 같은 트래픽 기반 조건을 필터링하는 보안 정책을 만들 수 있습니다. 자세한 내용은 Google Cloud Armor 보안 정책 개요를 참조하세요.

이그레스 설정

이그레스 설정은 함수에서 아웃바운드 HTTP 요청의 라우팅을 제어합니다. 이그레스 설정을 지정하려면 서버리스 VPC 액세스 커넥터를 사용하여 VPC 네트워크에 함수를 연결해야 합니다. 이그레스 설정은 트래픽이 VPC 네트워크에서 커넥터를 통해 라우팅되는 시기를 제어합니다.

제한사항

  • 서버리스 VPC 액세스는 IPv4 트래픽 라우팅만 지원합니다. VPC 네트워크에 IPv6 경로가 있더라도 IPv6 트래픽이 지원되지 않습니다.

  • 보안 강화를 위해 Google Cloud는 TCP 대상 포트 25에서 외부 IP 주소로의 이그레스 패킷을 차단합니다.

  • VPC 네트워크로 보호되는 함수 또는 서비스를 호출하는 사용자 함수 또는 서비스는 VPC 커넥터를 통해 이러한 호출을 라우팅해야 합니다.

이그레스 설정 구성

이그레스 설정의 경우 다음을 지정할 수 있습니다.

  • VPC 커넥터를 통해 비공개 IP에 대한 요청만 라우팅: 기본값입니다. 트래픽 전달 패킷에 포함된 대상이 다음과 일치하는 경우에만 VPC 네트워크를 통해 트래픽이 라우팅됩니다.

    다른 대상으로의 패킷은 Cloud Functions에서 인터넷으로 라우팅되며 VPC 네트워크를 통하지 않습니다.

  • VPC 커넥터를 통해 모든 트래픽 라우팅: 트래픽은 항상 모든 패킷 대상에 대해 커넥터와 연관된 VPC 네트워크를 통해 라우팅됩니다. 다음과 같은 상황에는 이 옵션을 사용해야 합니다.

    • 비공개적으로 사용되는 외부 IP 주소 범위가 포함된 VPC 서브넷 범위로 트래픽을 전달해야 하는 경우. VPC 서브넷 범위에 대한 자세한 내용은 서브넷 개요에서 적합한 IPv4 범위를 참조하세요.
    • 주소가 비공개적으로 사용되는 외부 IP 주소인 Google API용 Private Service Connect 엔드포인트로 트래픽을 전송해야 하는 경우. Google API용 Private Service Connect 엔드포인트에 대한 자세한 내용은 엔드포인트를 통해 Google API 액세스를 참조하세요.
    • 커넥터의 VPC 네트워크 내에서 라우팅 가능한 다른 비공개적으로 사용된 외부 IP 주소 대상으로 트래픽을 전송해야 하는 경우. 비공개적으로 사용되는 외부 IP 주소가 포함된 다른 대상의 예시에는 피어링 서브넷 범위, 서비스에 대해 할당된 IP 주소 범위에서 생성된 피어링 서브넷 범위, VPC 네트워크에서 커스텀 경로를 사용하여 액세스할 수 있는 대상이 포함됩니다.

    VPC 네트워크에 기본 경로가 포함되어 있으면 커넥터에 사용되는 서브넷에 NAT 서비스를 제공하도록 Cloud NAT 게이트웨이를 구성하는 경우 커넥터에서 처리된 후에도 패킷을 인터넷으로 라우팅할 수 있습니다. 이러한 패킷은 VPC 네트워크의 경로 및 VPC 네트워크에 적용되는 방화벽 규칙의 영향을 받습니다. 경로 및 방화벽 구성을 사용하여 서버리스 VPC 액세스 커넥터를 통해 함수에서 전송되는 모든 아웃바운드 요청에 대해 인터넷 이그레스를 제어할 수 있습니다.

함수를 배포하거나 업데이트할 때 Google Cloud console 또는 Google Cloud CLI를 사용하여 이그레스 설정을 지정할 수 있습니다.

콘솔

  1. Google Cloud Console에서 함수 개요 페이지를 엽니다.

    Cloud Functions 개요 페이지로 이동

  2. 함수 만들기를 클릭합니다. 또는 기존 함수를 클릭하여 세부정보 페이지로 이동하고 수정을 클릭합니다.

  3. 런타임, 빌드...를 클릭하여 고급 설정을 펼칩니다.

  4. 연결 섹션의 이그레스 설정에서 서버리스 VPC 액세스 커넥터를 선택합니다.

  5. 커넥터를 통해 아웃바운드 트래픽을 라우팅할 방법에 따라 적절한 이그레스 설정을 선택합니다.

gcloud

gcloud functions deploy 명령어를 사용하여 함수를 배포하거나 업데이트하고 --egress-settings 플래그를 지정합니다.

  gcloud functions deploy FUNCTION_NAME 
--vpc-connector CONNECTOR_NAME
--egress-settings EGRESS_SETTINGS
FLAGS...

각 항목의 의미는 다음과 같습니다.

  • FUNCTION_NAME은 함수의 이름입니다.
  • CONNECTOR_NAME은 사용할 서버리스 VPC 액세스 커넥터의 이름입니다. 자세한 내용은 gcloud 문서를 참조하세요.

  • EGRESS_SETTINGS는 이그레스 설정에 대해 지원되는 값 중 하나입니다. gcloud 문서를 참조하세요.

  • FLAGS...deploy 명령어에 전달하는 다른 플래그를 나타냅니다.

사용 사례 예시

다음 예시에서는 몇 가지 일반적인 시나리오에서 네트워크 액세스를 구성하는 방법을 보여줍니다.

외부 클라이언트에서 호출할 수 없는 함수 만들기

동일한 Google Cloud 프로젝트 또는 VPC 서비스 제어 서비스 경계의 리소스에서만 HTTP 함수를 호출할 수 있도록 제한하여 HTTP 함수의 보안을 설정할 수 있습니다.

  1. 함수를 배포하고 내부 트래픽만 허용합니다. Google Cloud 콘솔 또는 Google Cloud CLI를 사용합니다.

    콘솔

    1. Google Cloud Console에서 함수 개요 페이지를 엽니다.

      Cloud Functions 개요 페이지로 이동

    2. 함수 만들기를 클릭합니다. 또는 기존 함수를 클릭하여 세부정보 페이지로 이동하고 수정을 클릭합니다.

    3. 런타임, 빌드...를 클릭하여 고급 설정을 펼칩니다.

    4. 연결 섹션의 인그레스 설정에서 내부 트래픽만 허용을 선택합니다.

    gcloud

    gcloud functions deploy 명령어를 사용합니다.

    gcloud functions deploy FUNCTION_NAME \
    --ingress-settings internal-only \
    FLAGS...
    

함수를 배포한 후에는 Google Cloud 프로젝트 외부에서 발생하는 요청이 함수에 도달하지 못하도록 차단됩니다. VPC 서비스 제어를 사용하는 경우 서비스 경계 외부의 요청이 차단됩니다. 프로젝트 또는 서비스 경계 내의 VM 인스턴스는 HTTPS 엔드포인트에 대해 요청을 실행하여 함수에 도달할 수 있습니다.

다른 함수에서 이 제한된 함수를 호출하려면 호출 함수가 VPC 네트워크를 통해 이그레스를 라우팅해야 합니다.

이그레스 및 인그레스 설정을 사용하여 액세스 제한

서비스에 인그레스 및 이그레스를 모두 통합하여 제한 레이어를 더 추가할 수 있습니다.

  1. cloud-run-sample 저장소를 클론하고 vpc-sample 디렉터리로 변경합니다.

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    cd vpc-sample
    

  2. Python 종속 항목을 설치합니다.

    pip3 install -r requirements.txt
    

  3. vpc-sample 디렉터리에서 main.py 파일을 열어 배포 중인 함수를 확인할 수 있습니다.

    def hello_world(request):
        return "Hello World!"

  4. 함수를 배포합니다.

    gcloud functions deploy restricted-function 
    --runtime=python38
    --trigger-http
    --no-allow-unauthenticated
    --ingress-settings=internal-only
    --entry-point=hello_world

  5. 서버리스 VPC 액세스 커넥터를 설정합니다.

    gcloud compute networks vpc-access connectors create serverless-connector 
    --region=SERVICE_REGION
    --range=10.8.0.0/28

    여기서 SERVICE_REGION은 커넥터의 리전으로, 서버리스 서비스의 리전과 일치해야 합니다. 서비스가 us-central 또는 europe-west 리전에 있으면 us-central1 또는 europe-west1을 사용합니다.

  6. 컨테이너 이미지를 빌드합니다.

    gcloud builds submit --tag=gcr.io/PROJECT_ID/restricted-function-caller .
    

    여기서 PROJECT_ID은 프로젝트 ID입니다.

    그러면 main.py 파일에서 배포할 때 get_hello_world를 호출하는 컨테이너 이미지가 빌드됩니다.

    import os
    import urllib
    
    import google.auth.transport.requests
    import google.oauth2.id_token
    
    def get_hello_world(request):
        try:
            url = os.environ.get("URL")
            req = urllib.request.Request(url)
    
            auth_req = google.auth.transport.requests.Request()
            id_token = google.oauth2.id_token.fetch_id_token(auth_req, url)
            req.add_header("Authorization", f"Bearer {id_token}")
    
            response = urllib.request.urlopen(req)
            return response.read()
    
        except Exception as e:
            print(e)
            return str(e)

  7. gcloud run deploy run-function 명령어를 사용하여 Cloud Run 컨테이너를 배포합니다.

      gcloud run deploy run-function 
    --image gcr.io/PROJECT_ID/restricted-function-caller
    --no-allow-unauthenticated
    --update-env-vars=URL=https://SERVICE_REGION-PROJECT_ID.cloudfunctions.net/restricted-function-caller
    --vpc-egress=all
    --vpc-connector=serverless-connector
    --region=SERVICE_REGION

    각 항목의 의미는 다음과 같습니다.

    • PROJECT_ID는 프로젝트 ID입니다.
    • SERVICE_REGION은 커넥터의 리전으로, 서버리스 서비스의 리전과 일치해야 합니다. 서비스가 us-central 또는 europe-west 리전에 있으면 us-central1 또는 europe-west1을 사용합니다.

    이제 Cloud Run run-function 서비스가 VPC 커넥터에서 네트워크 제한 함수로 GET 요청을 보내도록 설정되었습니다.

VPC 네트워크를 통한 함수 이그레스 라우팅

Google Cloud의 VPC 네트워크는 다양한 구성과 네트워킹 기능을 지원합니다. 함수의 이그레스 트래픽을 VPC 네트워크로 라우팅하면 Cloud Functions 이그레스 트래픽이 VPC 네트워크의 방화벽, DNS, 라우팅, 기타 규칙을 따르도록 할 수 있으며 Cloud NAT와 같은 제품도 사용할 수 있습니다.

  1. VPC 네트워크를 설정합니다. 기존 VPC 네트워크를 구성하거나 VPC 네트워크 사용의 가이드를 따라 새 네트워크를 만듭니다.

  2. 서버리스 VPC 액세스 커넥터를 설정합니다. Cloud Functions에는 VPC 네트워크로 트래픽을 라우팅하는 서버리스 VPC 액세스 커넥터가 필요합니다. VPC 네트워크에 연결의 안내를 따라 커넥터를 만들고 적절한 권한을 설정합니다.

  3. 커넥터를 사용하는 함수를 배포하고 커넥터를 통해 모든 이그레스를 라우팅합니다. Google Cloud 콘솔 또는 gcloud 명령줄 도구를 사용합니다.

    콘솔

    1. Google Cloud Console에서 함수 개요 페이지를 엽니다.

      Cloud Functions 개요 페이지로 이동

    2. 함수 만들기를 클릭합니다. 또는 기존 함수를 클릭하여 세부정보 페이지로 이동하고 수정을 클릭합니다.

    3. 런타임, 빌드...를 클릭하여 고급 설정을 펼칩니다.

    4. 연결 섹션의 이그레스 설정에서 서버리스 VPC 액세스 커넥터를 선택하고 VPC 커넥터를 통해 모든 트래픽 라우팅을 선택합니다.

    gcloud

    gcloud functions deploy 명령어를 사용합니다.

    gcloud functions deploy FUNCTION_NAME \
    --vpc-connector CONNECTOR_NAME \
    --egress-settings all \
    FLAGS...
    

함수를 배포한 후에는 함수에서 발생한 모든 트래픽이 VPC 네트워크를 통해 라우팅되고 VPC 네트워크에 설정된 규칙을 준수합니다. Cloud NAT를 구성하지 않으면 함수는 공개 인터넷에 액세스할 수 없습니다. 또한 커넥터의 서브넷을 매핑에 포함하려면 Cloud NAT에서 모든 서브넷의 모든 기본 및 보조 IP 범위를 NAT 게이트웨이에 매핑해야 합니다.

함수 이그레스를 고정 IP 주소와 연결

경우에 따라 함수에서 발생하는 트래픽을 고정 IP 주소와 연결할 수도 있습니다. 예를 들어 이 방법은 명시적으로 지정된 IP 주소의 요청만 허용하는 외부 서비스를 호출하는 경우에 유용합니다.

  1. VPC 네트워크를 통해 함수의 이그레스를 라우팅합니다. 이전 섹션인 VPC 네트워크를 통한 함수 이그레스 라우팅을 참조하세요.

  2. Cloud NAT를 설정하고 고정 IP 주소를 지정합니다. NAT의 서브넷 범위 지정NAT의 IP 주소 지정의 가이드를 따라 함수의 서버리스 VPC 액세스 커넥터와 연결된 서브넷에 Cloud NAT를 설정합니다. 커넥터의 서브넷이 매핑에 포함되도록 하려면 Cloud NAT에서 전체 서브넷의 모든 기본 및 보조 IP 범위를 NAT 게이트웨이에 매핑해야 합니다.

멀티 리전 부하 분산

함수를 다른 리전에 배포하고 가장 가까운 정상 리전으로 요청이 전송되도록 허용할 수 있습니다. 이를 위해서는 먼저 함수에 대한 서버리스 네트워크 엔드포인트 그룹(NEG)을 설정하고 서버리스 NEG로 HTTP(S) 부하 분산기 설정에 설명된 대로 부하 분산기에 이를 연결해야 합니다.