온라인 예측에 Private Service Connect 엔드포인트 사용

Private Service Connect를 사용하면 공개 IP 주소, 공개 인터넷 액세스 또는 명시적으로 피어링된 내부 IP 주소 범위를 사용하지 않고 여러 소비자 프로젝트와 VPC 네트워크에서 Vertex AI 온라인 예측에 안전하게 액세스할 수 있습니다.

다음 요구사항이 있는 온라인 예측 사용 사례에 Private Service Connect를 사용하는 것이 좋습니다.

  • 비공개 및 보안 연결 필요
  • 짧은 지연 시간 필요
  • 공개적으로 액세스할 필요 없음

Private Service Connect는 VPC 네트워크에서 전달 규칙을 사용하여 트래픽을 단방향으로 Vertex AI 온라인 예측 서비스에 전송합니다. 전달 규칙은 Vertex AI 서비스를 VPC 네트워크에 노출하는 서비스 연결에 연결됩니다. 자세한 내용은 Private Service Connect를 통해 Vertex AI 서비스 액세스를 참조하세요. Private Service Connect 설정에 대한 자세한 내용은 Virtual Private Cloud(VPC) 문서의 Private Service Connect 개요를 참조하세요.

필요한 역할

Private Service Connect 엔드포인트를 만드는 데 필요한 권한을 얻으려면 관리자에게 프로젝트에 대한 Vertex AI 사용자 (roles/aiplatform.user) IAM 역할을 부여해 달라고 요청하세요. 역할 부여에 대한 자세한 내용은 프로젝트, 폴더, 조직에 대한 액세스 관리를 참조하세요.

이 사전 정의된 역할에는 Private Service Connect 엔드포인트를 만드는 데 필요한 aiplatform.endpoints.create 권한이 포함되어 있습니다.

커스텀 역할이나 다른 사전 정의된 역할을 사용하여 이 권한을 부여받을 수도 있습니다.

Vertex AI 역할 및 권한에 대한 자세한 내용은 IAM을 사용한 Vertex AI 액세스 제어Vertex AI IAM 권한을 참고하세요.

온라인 예측 엔드포인트 만들기

다음 방법 중 하나를 사용하여 Private Service Connect가 사용 설정된 온라인 예측 엔드포인트를 만듭니다.

Private Service Connect 엔드포인트의 기본 요청 제한 시간은 10분입니다. Vertex AI SDK for Python에서는 다음 예와 같이 새 inference_timeout 값을 지정하여 원하는 경우 다른 요청 시간 제한을 지정할 수 있습니다. 최대 제한 시간 값은 3,600초(1시간)입니다.

콘솔

  1. Google Cloud 콘솔의 Vertex AI에서 온라인 예측 페이지로 이동합니다.

    온라인 예측으로 이동

  2. 만들기를 클릭합니다.

  3. 엔드포인트 표시 이름을 제공합니다.

  4. 비공개를 선택합니다.

  5. Private Service Connect를 선택합니다.

  6. 프로젝트 ID 선택을 클릭합니다.

  7. 엔드포인트 허용 목록에 추가할 프로젝트를 선택합니다.

  8. 계속을 클릭합니다.

  9. 모델 사양을 선택합니다. 자세한 내용은 엔드포인트에 모델 배포를 참조하세요.

  10. 만들기를 클릭하여 엔드포인트를 만들고 모델을 배포합니다.

  11. 응답의 엔드포인트 ID를 기록해 둡니다.

API

REST

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • VERTEX_AI_PROJECT_ID: 온라인 예측 엔드포인트를 만드는 Google Cloud 프로젝트의 ID
  • REGION: Vertex AI를 사용하는 리전
  • VERTEX_AI_ENDPOINT_NAME: 온라인 예측 엔드포인트의 표시 이름
  • ALLOWED_PROJECTS: 쉼표로 구분된 Google Cloud 프로젝트 ID 목록으로 각각 따옴표로 묶음(예: ["PROJECTID1", "PROJECTID2"]). 프로젝트가 이 목록에 없으면 해당 프로젝트에서 Vertex AI 엔드포인트로 예측 요청을 보낼 수 없습니다. 같은 프로젝트에서 엔드포인트를 호출할 수 있도록 이 목록에 VERTEX_AI_PROJECT_ID를 포함해야 합니다.
  • INFERENCE_TIMEOUT_SECS: (선택사항) 선택적 inferenceTimeout 필드의 시간(초)

HTTP 메서드 및 URL:

POST https://REGION-aiplatform.googleapis.com/v1/projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints

JSON 요청 본문:

{
  "displayName": "VERTEX_AI_ENDPOINT_NAME",
  "privateServiceConnectConfig": {
    "enablePrivateServiceConnect": true,
    "projectAllowlist": ["ALLOWED_PROJECTS"],
    "clientConnectionConfig": {
      "inferenceTimeout": {
        "seconds": INFERENCE_TIMEOUT_SECS
      }
    }
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "name": "projects/VERTEX_AI_PROJECT_NUMBER/locations/REGION/endpoints/ENDPOINT_ID/operations/OPERATION_ID",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.aiplatform.v1.CreateEndpointOperationMetadata",
    "genericMetadata": {
      "createTime": "2020-11-05T17:45:42.812656Z",
      "updateTime": "2020-11-05T17:45:42.812656Z"
    }
  }
}
ENDPOINT_ID를 기록해 둡니다.

Python

이 샘플을 사용해 보기 전에 Vertex AI 빠른 시작: 클라이언트 라이브러리 사용Python 설정 안내를 따르세요. 자세한 내용은 Vertex AI Python API 참고 문서를 참조하세요.

Vertex AI에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

다음을 바꿉니다.

  • VERTEX_AI_PROJECT_ID: 온라인 예측 엔드포인트를 만드는 Google Cloud 프로젝트의 ID
  • REGION: Vertex AI를 사용하는 리전
  • VERTEX_AI_ENDPOINT_NAME: 온라인 예측 엔드포인트의 표시 이름
  • ALLOWED_PROJECTS: 각각 따옴표로 묶인 쉼표로 구분된 Google Cloud프로젝트 ID 목록. 예를 들면 ["PROJECTID1", "PROJECTID2"]입니다. 프로젝트가 이 목록에 없으면 해당 프로젝트에서 Vertex AI 엔드포인트로 예측 요청을 보낼 수 없습니다. 엔드포인트가 속한 동일한 프로젝트에서 엔드포인트를 호출할 수 있도록 이 목록에 VERTEX_AI_PROJECT_ID를 포함해야 합니다.
  • INFERENCE_TIMEOUT_SECS: (선택사항) 선택적 inference_timeout 값의 시간(초)
PROJECT_ID = "VERTEX_AI_PROJECT_ID"
REGION = "REGION"
VERTEX_AI_ENDPOINT_NAME = "VERTEX_AI_ENDPOINT_NAME"
INFERENCE_TIMEOUT_SECS = "INFERENCE_TIMEOUT_SECS"

from google.cloud import aiplatform

aiplatform.init(project=PROJECT_ID, location=REGION)

# Create the forwarding rule in the consumer project
psc_endpoint = aiplatform.PrivateEndpoint.create(
display_name=VERTEX_AI_ENDPOINT_NAME,
project=PROJECT_ID,
location=REGION,
private_service_connect_config=aiplatform.PrivateEndpoint.PrivateServiceConnectConfig(
    project_allowlist=["ALLOWED_PROJECTS"],
    ),
inference_timeout=INFERENCE_TIMEOUT_SECS,
)

반환된 엔드포인트 URI 끝에 있는 ENDPOINT_ID를 기록해 둡니다.

INFO:google.cloud.aiplatform.models:To use this PrivateEndpoint in another session:
INFO:google.cloud.aiplatform.models:endpoint = aiplatform.PrivateEndpoint('projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID')

모델 배포

Private Service Connect를 사용 설정한 온라인 예측 엔드포인트를 만든 후 엔드포인트에 모델 배포에 설명된 단계를 수행하여 모델을 배포합니다.

서비스 연결 URI 가져오기

모델을 배포하면 온라인 예측 엔드포인트에 서비스 연결이 생성됩니다. 이 서비스 연결은 VPC 네트워크에 노출되는 Vertex AI 온라인 예측 서비스를 나타냅니다. gcloud ai endpoints describe 명령어를 실행하여 서비스 연결 URI를 가져옵니다.

  1. 엔드포인트 세부정보에서 serviceAttachment 값만 나열합니다.

    gcloud ai endpoints describe ENDPOINT_ID \
    --project=VERTEX_AI_PROJECT_ID \
    --region=REGION \
    | grep -i serviceAttachment
    

    다음을 바꿉니다.

    • ENDPOINT_ID: 온라인 예측 엔드포인트의 ID
    • VERTEX_AI_PROJECT_ID: 온라인 예측 엔드포인트를 만든 Google Cloud 프로젝트의 ID
    • REGION: 이 요청의 리전

    출력은 다음과 비슷합니다.

    serviceAttachment: projects/ac74a9f84c2e5f2a1-tp/regions/us-central1/serviceAttachments/gkedpm-c6e6a854a634dc99472bb802f503c1
    
  2. serviceAttachment 필드의 전체 문자열을 기록해 둡니다. 서비스 연결 URI입니다.

전달 규칙 만들기

내부 IP 주소를 예약하고 이 주소로 전달 규칙을 생성할 수 있습니다. 전달 규칙을 만들려면 이전 단계의 서비스 연결 URI가 필요합니다.

  1. 전달 규칙의 내부 IP 주소를 예약하려면 gcloud compute addresses create 명령어를 사용합니다.

    gcloud compute addresses create ADDRESS_NAME \
    --project=VPC_PROJECT_ID \
    --region=REGION \
    --subnet=SUBNETWORK \
    --addresses=INTERNAL_IP_ADDRESS
    

    다음을 바꿉니다.

    • ADDRESS_NAME: 내부 IP 주소 이름
    • VPC_PROJECT_ID: Google Cloud 네트워크를 호스팅하는 프로젝트의 ID. 온라인 예측 엔드포인트와 Private Service Connect 전달 규칙이 같은 프로젝트에서 호스팅되면 이 파라미터의 VERTEX_AI_PROJECT_ID를 사용합니다.
    • REGION: Private Service Connect 전달 규칙을 만들 Google Cloud 리전
    • SUBNETWORK: IP 주소가 포함된 VPC 서브넷의 이름
    • INTERNAL_IP_ADDRESS: 예약할 내부 IP 주소. 이 파라미터는 선택사항입니다.

      • 이 파라미터를 지정하면 IP 주소가 서브넷의 기본 IP 주소 범위에 속해야 합니다. IP 주소는 RFC 1918 주소이거나 비 RFC 범위가 있는 서브넷일 수 있습니다.
      • 이 파라미터를 생략하면 내부 IP 주소가 자동으로 할당됩니다.
      • 자세한 내용은 새 고정 내부 IPv4 또는 IPv6 주소 예약을 참조하세요.
  2. IP 주소가 예약되어 있는지 확인하려면 gcloud compute addresses list 명령어를 사용합니다.

    gcloud compute addresses list --filter="name=(ADDRESS_NAME)" \
    --project=VPC_PROJECT_ID
    

    응답에서 IP 주소에 대해 RESERVED 상태가 표시되는지 확인합니다.

  3. 전달 규칙을 만들고 온라인 예측 서비스 연결을 가리키게 하려면 gcloud compute forwarding-rules create 명령어를 사용합니다.

    gcloud compute forwarding-rules create PSC_FORWARDING_RULE_NAME \
        --address=ADDRESS_NAME \
        --project=VPC_PROJECT_ID \
        --region=REGION \
        --network=VPC_NETWORK_NAME \
        --target-service-attachment=SERVICE_ATTACHMENT_URI
    

    다음을 바꿉니다.

    • PSC_FORWARDING_RULE_NAME: 전달 규칙의 이름
    • VPC_NETWORK_NAME: 엔드포인트를 만들 VPC 네트워크의 이름
    • SERVICE_ATTACHMENT_URI: 앞에서 기록한 서비스 연결
  4. 서비스 연결에서 엔드포인트를 수락하는지 확인하려면 gcloud compute forwarding-rules describe 명령어를 사용합니다.

    gcloud compute forwarding-rules describe PSC_FORWARDING_RULE_NAME \
    --project=VPC_PROJECT_ID \
    --region=REGION
    

    응답의 pscConnectionStatus 필드에 ACCEPTED 상태가 표시되는지 확인합니다.

선택사항: 내부 IP 주소 가져오기

전달 규칙을 만들 때 INTERNAL_IP_ADDRESS 값을 지정하지 않았으면 gcloud compute forwarding-rules describe 명령어를 통해 자동으로 할당된 주소를 가져올 수 있습니다.

gcloud compute forwarding-rules describe PSC_FORWARDING_RULE_NAME \
--project=VERTEX_AI_PROJECT_ID \
--region=REGION \
| grep -i IPAddress

다음을 바꿉니다.

  • VERTEX_AI_PROJECT_ID: 프로젝트 ID
  • REGION: 이 요청의 리전 이름

온라인 예측 수행

Private Service Connect를 사용하여 엔드포인트에서 온라인 예측 수행하기는 다음 고려사항을 제외하고 공개 엔드포인트에서 온라인 예측 수행하기와 비슷합니다.

  • 온라인 예측 엔드포인트를 만들 때 projectAllowlist에 지정한 프로젝트에서 요청을 보내야 합니다.
  • 전역 액세스가 사용 설정되지 않은 경우에는 같은 리전에서 요청을 보내야 합니다.
  • 내부 IP 주소의 DNS 레코드를 만들지 않은 경우에 REST를 사용하여 예측을 수행하려면 엔드포인트의 고정 IP 주소를 사용하여 연결해야 합니다. 예를 들어 predict 요청을 다음 엔드포인트에 보내야 합니다.

    https://INTERNAL_IP_ADDRESS/v1/projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID:predict
    

    INTERNAL_IP_ADDRESS를 앞에서 예약한 내부 IP 주소로 바꿉니다.

다음 섹션에서는 Python을 사용하여 예측 요청을 보내는 방법의 예를 보여줍니다.

첫 번째 예시

psc_endpoint = aiplatform.PrivateEndpoint("projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID")
REQUEST_FILE = "PATH_TO_INPUT_FILE"
import json

import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

with open(REQUEST_FILE) as json_file:
    data = json.load(json_file)
    response = psc_endpoint.predict(
        instances=data["instances"], endpoint_override=INTERNAL_IP_ADDRESS
    )
print(response)

PATH_TO_INPUT_FILE을 요청 입력이 포함된 JSON 파일의 경로로 바꿉니다.

두 번째 예시

import json
import requests
import urllib3
import google.auth.transport.requests

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

REQUEST_FILE = "PATH_TO_INPUT_FILE"

# Programmatically get credentials and generate an access token
creds, project = google.auth.default()
auth_req = google.auth.transport.requests.Request()
creds.refresh(auth_req)
access_token = creds.token
# Note: the credential lives for 1 hour by default
# After expiration, it must be refreshed
# See https://cloud.google.com/docs/authentication/token-types#at-lifetime

with open(REQUEST_FILE) as json_file:
    data = json.load(json_file)
    url = "https://INTERNAL_IP_ADDRESS/v1/projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID:predict"
    headers = {
      "Content-Type": "application/json",
      "Authorization": f"Bearer {access_token}"  # Add access token to headers
    }
    payload = {
      "instances": data["instances"],
    }

response = requests.post(url, headers=headers, json=payload, verify=False)

print(response.json())

(선택사항) 내부 IP 주소의 DNS 레코드 만들기

내부 IP 주소를 지정할 필요 없이 엔드포인트에서 온라인 예측을 수행할 수 있도록 DNS 레코드를 만드는 것이 좋습니다.

자세한 내용은 DNS를 구성하는 다른 방법을 참조하세요.

  1. gcloud dns managed-zones create 명령어를 사용하여 비공개 DNS 영역을 만듭니다. 이 영역은 전달 규칙이 생성된 VPC 네트워크와 연결됩니다.

    DNS_NAME_SUFFIX="prediction.p.vertexai.goog."  # DNS names have "." at the end.
    gcloud dns managed-zones create ZONE_NAME \
    --project=VPC_PROJECT_ID \
    --dns-name=$DNS_NAME_SUFFIX \
    --networks=VPC_NETWORK_NAME \
    --visibility=private \
    --description="A DNS zone for Vertex AI endpoints using Private Service Connect."
    
    

    다음을 바꿉니다.

    • ZONE_NAME: DNS 영역의 이름
  2. 영역에 DNS 레코드를 만들려면 gcloud dns record-sets create 명령어를 사용합니다.

    DNS_NAME=ENDPOINT_ID-REGION-VERTEX_AI_PROJECT_NUMBER.$DNS_NAME_SUFFIX
    gcloud dns record-sets create $DNS_NAME \
    --rrdatas=INTERNAL_IP_ADDRESS \
    --zone=ZONE_NAME \
    --type=A \
    --ttl=60 \
    --project=VPC_PROJECT_ID
    

    다음을 바꿉니다.

    • VERTEX_AI_PROJECT_NUMBER: 프로젝트의 VERTEX_AI_PROJECT_ID프로젝트 번호. 이 프로젝트 번호는 Google Cloud 콘솔에서 찾을 수 있습니다. 자세한 내용은 프로젝트 식별을 참조하세요.
    • INTERNAL_IP_ADDRESS: 온라인 예측 엔드포인트의 내부 IP 주소

    이제 predict 요청을 다음으로 보낼 수 있습니다.

    https://ENDPOINT_ID-REGION-VERTEX_AI_PROJECT_NUMBER.prediction.p.vertexai.goog/v1/projects/VERTEX_AI_PROJECT_ID/locations/REGION/endpoints/ENDPOINT_ID:predict
    

다음은 Python을 사용하여 DNS 영역에 예측 요청을 보내는 방법의 예시입니다.

REQUEST_FILE = "PATH_TO_INPUT_FILE"
import json

import urllib3

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

with open(REQUEST_FILE) as json_file:
    data = json.load(json_file)
    response = psc_endpoint.predict(
        instances=data["instances"], endpoint_override=DNS_NAME
    )
print(response)

DNS_NAMEgcloud dns record-sets create 명령어에서 지정한 DNS 이름으로 바꿉니다.

제한사항

Private Service Connect가 포함된 Vertex AI 엔드포인트에는 다음과 같은 제한사항이 적용됩니다.

  • 조정된 Gemini 모델의 배포는 지원되지 않습니다.
  • 엔드포인트 내에서의 비공개 이그레스는 지원되지 않습니다. Private Service Connect 전달 규칙은 단방향이므로 다른 비공개Google Cloud 워크로드는 컨테이너 내에서 액세스할 수 없습니다.
  • 엔드포인트의 projectAllowlist 구성을 변경할 수 없습니다.
  • Vertex Explainable AI는 지원되지 않습니다.
  • 모든 모델이 10분 넘게 배포 취소되면 서비스 연결이 삭제될 수 있습니다. Private Service Connect 연결 상태를 확인합니다. CLOSED인 경우 전달 규칙을 다시 만듭니다.
  • 프로젝트의 Private Service Connect 구성에는 최대 10개의 서로 다른 projectAllowlist 값이 있을 수 있습니다.

다음 단계