Vertex AI를 사용한 보안 온라인 예측에 TLS 사용

1. 소개

Private Service Connect (PSC)를 활용하여 Vertex AI Model Garden에서 배포된 모델에 대한 안전한 비공개 액세스를 설정합니다. 이 메서드를 사용하면 공개 엔드포인트를 노출하는 대신 Virtual Private Cloud (VPC) 내에서만 액세스할 수 있는 비공개 Vertex AI 엔드포인트에 모델을 배포할 수 있습니다.

Private Service Connect는 모델을 호스팅하는 Google 관리형 Vertex AI 서비스에 직접 연결하여 VPC 내부에 내부 IP 주소가 있는 엔드포인트를 만듭니다. 이렇게 하면 VPC 및 온프레미스 환경 (Cloud VPN 또는 Interconnect를 통해)의 애플리케이션이 비공개 IP를 사용하여 추론 요청을 보낼 수 있습니다.

중요한 점은 VPC와 비공개 Vertex AI 엔드포인트 간의 모든 네트워크 트래픽이 Google의 전용 네트워크에 유지되어 공개 인터넷에서 완전히 격리된다는 것입니다. 또한 이 비공개 연결은 전송 중에 TLS 암호화를 사용하여 보호됩니다. 이 엔드 투 엔드 암호화는 예측 요청과 모델 응답을 보호하여 데이터 기밀성과 무결성을 강화합니다. PSC를 통한 네트워크 격리와 TLS 암호화의 조합은 온라인 예측을 위한 강력하고 안전한 환경을 제공하여 지연 시간을 줄이고 보안 상태를 크게 강화합니다.

8bdac2f2d3dd88c9.png

빌드할 항목

이 튜토리얼에서는 Private Service Connect를 통해 액세스할 수 있는 비공개 엔드포인트로 Vertex AI 온라인 추론에서 호스팅되는 Model Garden에서 Gemma 3를 다운로드합니다. 엔드 투 엔드 설정에는 다음이 포함됩니다.

  1. Model Garden 모델: Vertex AI Model Garden에서 Gemma 3를 선택하고 Private Service Connect 엔드포인트에 배포합니다.
  2. Private Service Connect: 자체 네트워크 내의 내부 IP 주소로 구성된 Virtual Private Cloud (VPC)에서 소비자 엔드포인트를 구성합니다.
  3. Vertex AI에 대한 보안 연결: PSC 엔드포인트는 비공개 모델 배포를 위해 Vertex AI에서 자동으로 생성하는 서비스 연결을 타겟팅합니다. 이렇게 하면 비공개 연결이 설정되어 VPC와 모델 서빙 엔드포인트 간의 트래픽이 공개 인터넷을 거치지 않습니다.
  4. VPC 내의 클라이언트 구성: VPC 내에서 클라이언트 (예: Compute Engine VM)를 설정하여 PSC 엔드포인트의 내부 IP 주소를 사용하여 배포된 모델에 추론 요청을 보냅니다.
  5. TLS 암호화 확인: VPC 내의 클라이언트 VM에서 표준 도구 ( openssl s_client)를 사용하여 PSC 엔드포인트의 내부 IP 주소에 연결합니다. 이 단계를 통해 핸드셰이크 세부정보와 제공된 서버 인증서를 검사하여 Vertex AI 서비스로의 통신 채널이 TLS를 사용하여 실제로 암호화되었는지 확인할 수 있습니다.

결국 지정된 VPC 네트워크 내에서만 액세스할 수 있는 Model Garden 모델이 비공개로 제공되는 기능 예시를 갖게 됩니다.

학습할 내용

이 튜토리얼에서는 Vertex AI Model Garden에서 모델을 배포하고 Private Service Connect (PSC)를 사용하여 Virtual Private Cloud (VPC)에서 안전하게 액세스할 수 있도록 하는 방법을 알아봅니다. 이 메서드를 사용하면 VPC (소비자) 내의 애플리케이션이 공개 인터넷을 거치지 않고 Vertex AI 모델 엔드포인트 (프로듀서 서비스)에 비공개로 연결할 수 있습니다.

특히 다음을 알아봅니다.

  1. Vertex AI용 PSC 이해: PSC가 비공개 및 보안 소비자-프로듀서 연결을 지원하는 방법. VPC는 내부 IP 주소를 사용하여 배포된 Model Garden 모델에 액세스할 수 있습니다.
  2. 비공개 액세스로 모델 배포: Model Garden 모델이 PSC를 사용하도록 Vertex AI 엔드포인트를 구성하여 비공개 엔드포인트로 만드는 방법.
  3. 서비스 연결의 역할: 비공개 Vertex AI 엔드포인트에 모델을 배포하면 Google Cloud는 Google 관리형 테넌트 프로젝트에서 서비스 연결을 자동으로 만듭니다. 이 서비스 연결은 모델 서빙 서비스를 소비자 네트워크에 노출합니다.
  4. VPC에서 PSC 엔드포인트 만들기:
  • 배포된 Vertex AI 엔드포인트 세부정보에서 고유한 서비스 연결 URI를 가져오는 방법.
  • VPC에서 선택한 서브넷 내에 내부 IP 주소를 예약하는 방법.
  • Vertex AI 서비스 연결을 타겟팅하는 PSC 엔드포인트 역할을 하는 VPC에서 전달 규칙을 만드는 방법. 이 엔드포인트는 예약된 내부 IP를 통해 모델에 액세스할 수 있도록 합니다.
  1. 비공개 연결 설정: VPC의 PSC 엔드포인트가 서비스 연결에 연결되어 네트워크를 Vertex AI 서비스와 안전하게 연결하는 방법.
  2. 비공개로 추론 요청 보내기: VPC 내의 리소스 (예: Compute Engine VM)에서 PSC 엔드포인트의 내부 IP 주소로 예측 요청을 보내는 방법.
  3. 유효성 검사: 비공개 연결을 통해 VPC에서 배포된 Model Garden 모델로 추론 요청을 보낼 수 있는지 테스트하고 확인하는 단계.
  4. TLS 암호화 확인: VPC 클라이언트 (예: Compute Engine VM) 내에서 도구를 사용하여 TLS를 통해 PSC 엔드포인트의 내부 IP 주소에 연결하는 방법.

이 단계를 완료하면 비공개 네트워크 인프라에서만 연결할 수 있는 Model Garden의 모델을 호스팅할 수 있습니다.

필요한 항목

Google Cloud 프로젝트

IAM 권한

2. 시작하기 전에

튜토리얼을 지원하도록 프로젝트 업데이트

이 튜토리얼에서는 Cloud Shell에서 gcloud 구성 구현을 지원하기 위해 $variables를 사용합니다.

Cloud Shell 내에서 다음을 수행합니다.

gcloud config list project
gcloud config set project [YOUR-PROJECT-ID]
projectid=[YOUR-PROJECT-ID]
echo $projectid

API 사용 설정

Cloud Shell 내에서 다음을 수행합니다.

gcloud services enable "compute.googleapis.com"
gcloud services enable "aiplatform.googleapis.com"
gcloud services enable "serviceusage.googleapis.com"
gcloud services enable dns.googleapis.com

3. 모델 배포

아래 단계에 따라 Model Garden에서 모델을 배포합니다.

Google Cloud 콘솔에서 Model Garden으로 이동하여 Gemma 3를 검색하고 선택합니다.

47c724030a846b25.png

모델 배포를 클릭하고 Vertex AI를 선택합니다.

a9a9f4aef7e52356.png

배포 설정 섹션 하단에서 설정 수정을 선택합니다.

d5b449d2893ddf2f.png

Vertex AI에 배포 창에서 엔드포인트 액세스가 Private Service Connect로 구성되어 있는지 확인한 후 프로젝트를 선택합니다.

c679aa90c3638e31.png

다른 옵션은 모두 기본값으로 두고 하단에서 배포를 선택한 후 배포 상태에 대한 알림을 확인합니다.

d5eab71cbb43e2fe.png

Model Garden에서 Gemma 3 모델 및 엔드포인트를 제공하는 리전인 us-central1을 선택합니다. 모델 배포에는 약 5분이 걸립니다.

fce9d5c9152255f1.png

완료되면 30분 후에 엔드포인트가 '활성'으로 전환됩니다.

d6cc741415213e1a.png

엔드포인트를 선택하여 엔드포인트 ID를 가져오고 기록합니다.

87d1756fa534619d.png

엔드포인트를 선택하여 엔드포인트 ID를 검색하고 변수를 업데이트합니다. 표시된 예시에서 ID는 1934769929467199488입니다.

Cloud Shell 내에서 다음을 수행합니다.

endpointID=<Enter_Your_Endpoint_ID>
region=us-central1

Private Service Connect 서비스 연결 URI를 가져오려면 다음을 수행합니다. 이 URI 문자열은 PSC 소비자 엔드포인트를 배포할 때 소비자가 사용합니다.

Cloud Shell 내에서 엔드포인트 ID/리전 변수를 사용한 후 다음 명령어를 실행합니다.

gcloud ai endpoints describe $endpointID --region=$region  | grep -i serviceAttachment:

아래 예시를 참조하세요.

user@cloudshell:$ gcloud ai endpoints describe 1934769929467199488 --region=us-central1 | grep -i serviceAttachment:

Using endpoint [https://us-central1-aiplatform.googleapis.com/]
    serviceAttachment: projects/o9457b320a852208e-tp/regions/us-central1/serviceAttachments/gkedpm-52065579567eaf39bfe24f25f7981d

serviceAttachment 뒤의 콘텐츠를 'Service_attachment'라는 변수에 복사합니다. 나중에 PSC 연결을 만들 때 필요합니다.

user@cloudshell:$ Service_attachment=<Enter_Your_ServiceAttachment>

4. 소비자 설정

소비자 VPC 만들기

Cloud Shell 내에서 다음을 수행합니다.

gcloud compute networks create consumer-vpc --project=$projectid --subnet-mode=custom

소비자 VM 서브넷 만들기

Cloud Shell 내에서 다음을 수행합니다.

gcloud compute networks subnets create consumer-vm-subnet --project=$projectid --range=192.168.1.0/24 --network=consumer-vpc --region=$region --enable-private-ip-google-access

PSC 엔드포인트 서브넷 만들기, Cloud Shell 내에서 다음을 수행합니다**:**

gcloud compute networks subnets create pscendpoint-subnet --project=$projectid --range=10.10.10.0/28 --network=consumer-vpc --region=$region

5. IAP 사용 설정

IAP가 VM 인스턴스에 연결하도록 하려면 다음과 같은 방화벽 규칙을 만드세요.

  • IAP를 사용하여 액세스할 수 있는 모든 VM 인스턴스에 적용됩니다.
  • IP 범위 35.235.240.0/20에서의 인그레스 트래픽을 허용합니다. 이 범위에는 IAP가 TCP 전달을 위해 사용하는 모든 IP 주소가 포함됩니다.

Cloud Shell 내에서 IAP 방화벽 규칙을 만듭니다.

gcloud compute firewall-rules create ssh-iap-consumer \
    --network consumer-vpc \
    --allow tcp:22 \
    --source-ranges=35.235.240.0/20

6. 소비자 VM 인스턴스 만들기

Cloud Shell 내에서 소비자 VM 인스턴스 consumer-vm을 만듭니다.

gcloud compute instances create consumer-vm \
    --project=$projectid \
    --machine-type=e2-micro \
    --image-family debian-11 \
    --no-address \
    --shielded-secure-boot \
    --image-project debian-cloud \
    --zone us-central1-a \
    --subnet=consumer-vm-subnet 

7. Private Service Connect 엔드포인트

소비자는 VPC 내에 내부 IP 주소가 있는 소비자 엔드포인트 (전달 규칙)를 만듭니다. 이 PSC 엔드포인트는 프로듀서의 서비스 연결을 타겟팅합니다. 소비자 VPC 또는 하이브리드 네트워크 내의 클라이언트는 이 내부 IP 주소로 트래픽을 전송하여 프로듀서의 서비스에 연결할 수 있습니다.

소비자 엔드포인트의 IP 주소를 예약합니다.

Cloud Shell 내에서 전달 규칙을 만듭니다.

gcloud compute addresses create psc-address \
    --project=$projectid \
    --region=$region \
    --subnet=pscendpoint-subnet \
    --addresses=10.10.10.6

IP 주소가 예약되어 있는지 확인합니다.

Cloud Shell 내에서 예약된 IP 주소를 나열합니다.

gcloud compute addresses list 

10.10.10.6 IP 주소가 예약되어 있어야 합니다.

3029e97ddc9c192d.png

이전 단계인 모델 배포 섹션에서 캡처한 서비스 연결 URI인 target-service-attachment를 지정하여 소비자 엔드포인트를 만듭니다.

Cloud Shell 내에서 네트워크 연결을 설명합니다.

 gcloud compute forwarding-rules create psc-consumer-ep \
    --network=consumer-vpc \
    --address=psc-address \
    --region=$region \
    --target-service-attachment=$Service_attachment \
    --project=$projectid

서비스 연결에서 엔드포인트를 수락하는지 확인합니다.

Cloud Shell 내에서 다음을 수행합니다.

gcloud compute forwarding-rules describe psc-consumer-ep \
    --project=$projectid \
    --region=$region

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

e1debc2bdb6a1a44.png

8. TLS를 통해 Vertex HTTPS 엔드포인트에 연결하도록 설정

IP 주소를 지정하지 않고 온라인 추론을 수행할 수 있도록 DNS 비공개 영역을 만듭니다.

Cloud Shell 내에서 다음을 수행합니다.

DNS_NAME_SUFFIX="prediction.p.vertexai.goog."  

gcloud dns managed-zones create vertex \
--project=$projectid \
--dns-name=$DNS_NAME_SUFFIX \
--networks=consumer-vpc \
--visibility=private \
--description="A DNS zone for Vertex AI endpoints using Private Service Connect."

도메인을 PSC IP 주소에 매핑하는 A 레코드를 만듭니다.

Cloud Shell 내에서 다음을 수행합니다.

gcloud dns record-sets create "*.prediction.p.vertexai.goog." \
  --zone=vertex \
  --type=A \
  --ttl=300 \
  --rrdatas="10.10.10.6"

NAT 인스턴스의 기본 요건으로 Cloud Router 인스턴스를 만듭니다.

Cloud Shell 내에서 다음을 수행합니다.

gcloud compute routers create consumer-cr \
--region=$region --network=consumer-vpc \
--asn=65001 

openssl 및 dnsutils 패키지를 다운로드하는 데 사용되는 Cloud NAT 인스턴스를 만듭니다.

Cloud Shell 내에서 다음을 수행합니다.

gcloud compute routers nats create consumer-nat-gw \
  --router=consumer-cr \
  --region=$region \
  --nat-all-subnet-ip-ranges \
  --auto-allocate-nat-external-ips 

ssh (콘솔)를 통해 소비자 VM에 연결합니다. Cloud Shell 내에서 다음을 수행합니다.

gcloud compute ssh --zone "us-central1-a" "consumer-vm" --tunnel-through-iap --project "$projectid"

아래 패키지를 업데이트하고 open-ssl을 설치하고 DNS 유틸리티를 설치합니다.

Cloud Shell 내에서 다음을 수행합니다.

sudo apt update 
sudo apt install openssl
sudo apt-get install -y dnsutils

다음 단계에서 프로젝트 번호가 필요합니다. 프로젝트 번호를 가져오려면 Cloud Shell에서 다음 명령어를 실행하고 변수에 넣습니다.

Cloud Shell 내에서 다음을 수행합니다.

gcloud projects describe $projectid --format="value(projectNumber)"
Example Output: 549538389202
projectNumber=549538389202

다음 몇 단계에서 정의된 몇 가지 다른 변수가 필요합니다. 먼저 Cloud Shell에서 이러한 변수(ENDPOINT_ID, REGION, VERTEX_AI_PROJECT_ID)을 캡처한 후 VM에서 동일한 변수를 만들어 정의합니다.

Cloud Shell 내에서 다음을 수행합니다.

echo $projectNumber
echo $projectid 
echo $region
echo $endpointID

아래 출력 예시를 참조하세요.

549538389202
test4-473419
Us-central1
1934769929467199s

소비자 VM에 이러한 변수를 추가합니다(아래 예시 참고).

projectNumber=1934769929467199488  
projectid=test4-473419
region=us-central1
endpointID=1934769929467199488

VM의 홈 디렉터리에서 다음 명령어를 실행하여 Vertex AI 인증서를 다운로드합니다. 이 명령어는 vertex_certificate.crt라는 파일을 만듭니다.

sudo openssl s_client -showcerts -connect $endpointID-$region-$projectNumber.prediction.p.vertexai.goog:443 </dev/null | openssl x509 -outform pem -out vertex_certificate.crt

Output should look like below, error is expected.

2f2899141dde1af2.png

인증서를 시스템 트러스트 저장소로 이동합니다.

sudo mv vertex_certificate.crt /usr/local/share/ca-certificates

인증서 관리자를 업데이트합니다.

sudo update-ca-certificates

업데이트되면 다음과 같이 표시됩니다.

user@linux-vm:~$ sudo update-ca-certificates

Updating certificates in /etc/ssl/certs...

1 added, 0 removed; done.

Running hooks in /etc/ca-certificates/update.d...

Done.

9. 소비자 VM의 최종 테스트

소비자 VM에서 애플리케이션 기본 사용자 인증 정보로 다시 인증하고 Vertex AI 범위를 지정합니다.

gcloud auth application-default login
--scopes=https://www.googleapis.com/auth/cloud-platform 

소비자 VM에서 다음 curl 명령어를 실행하여 프롬프트 '1파운드의 깃털과 돌 중 어느 것이 더 무거울까요?'로 Gemini 모델에 대한 예측을 테스트합니다.

curl -v -X POST -H "Authorization: Bearer $(gcloud auth application-default print-access-token)"   -H "Content-Type: application/json" https://$endpointID-$region-$projectNumber.prediction.p.vertexai.goog/v1/projects/$projectid/locations/$region/endpoints/$endpointID/chat/completions   -d '{"model": "google/gemma-3-12b-it", "messages": [{"role": "user","content": "What weighs more 1 pound of feathers or rocks?"}] }'

최종 결과 - 성공!!!

출력 하단에 Gemma 3의 예측이 표시됩니다. 이는 PSC 엔드포인트를 통해 API 엔드포인트에 비공개로 연결할 수 있음을 보여줍니다.

 Connection #0 to host 10.10.10.6 left intact
{"id":"chatcmpl-9e941821-65b3-44e4-876c-37d81baf62e0","object":"chat.completion","created":1759009221,"model":"google/gemma-3-12b-it","choices":[{"index":0,"message":{"role":"assistant","reasoning_content":null,"content":"This is a classic trick question! They weigh the same. One pound is one pound, regardless of the material. 😊\n\n\n\n","tool_calls":[]},"logprobs":null,"finish_reason":"stop","stop_reason":106}],"usage":{"prompt_tokens":20,"total_tokens":46,"completion_tokens":26,"prompt_tokens_details":null},"prompt_logprobs":null

10. 삭제

Cloud Shell에서 튜토리얼 구성요소를 삭제합니다.

Get Deployed Model ID first with this command, you will need it to delete the Endpoint ID:

gcloud ai endpoints describe $endpointID \
  --region=$region \
  --project=$projectid \
  --format="table[no-heading](deployedModels.id)"

Example Output: 7389140900875599872

Put it in a Variable:

deployedModelID=7389140900875599872

Run following Commands:

gcloud ai endpoints undeploy-model $endpointID --deployed-model-id=$deployedModelID --region=$region --quiet

gcloud ai endpoints delete $endpointID --project=$projectid --region=$region --quiet

Run Following command to get $MODEL_ID to delete Model:

gcloud ai models list --project=$projectid --region=$region

Example Output:

Using endpoint [https://us-central1-aiplatform.googleapis.com/]
MODEL_ID: gemma-3-12b-it-1768409471942
DISPLAY_NAME: gemma-3-12b-it-1768409471942

Put MODEL_ID value in a variable:

MODEL_ID=gemma-3-12b-it-1768409471942

Run the follow command to delete Model:

gcloud ai models delete $MODEL_ID --project=$projectid --region=$region --quiet

Clean up rest of the lab:
gcloud compute instances delete consumer-vm --zone=us-central1-a --quiet

gcloud compute forwarding-rules delete psc-consumer-ep --region=$region --project=$projectid --quiet

gcloud compute addresses delete psc-address --region=$region --project=$projectid --quiet

gcloud compute networks subnets delete pscendpoint-subnet consumer-vm-subnet --region=$region --quiet

gcloud compute firewall-rules delete ssh-iap-consumer --project=$projectid

gcloud compute routers delete consumer-cr --region=$region

gcloud compute networks delete consumer-vpc --project=$projectid --quiet

11. 축하합니다

축하합니다. Vertex AI에서 가져와 VM 트러스트 저장소에 배포된 자체 서명된 인증서를 사용하여 Private Service Connect 엔드포인트를 통해 Vertex AI 예측에서 호스팅되는 Gemma 3 API에 대한 비공개 액세스를 구성하고 검증했습니다.

내부 IP 주소 예약, VPC 내의 Private Service Connect 엔드포인트 (전달 규칙) 구성, 자체 서명된 인증서 *prediction.p.vertexai.goog와 일치하는 비공개 DNS를 포함하여 소비자 인프라를 만들었습니다. 이 엔드포인트는 배포된 Gemma 3 모델과 연결된 서비스 연결을 타겟팅하여 Vertex AI 서비스에 안전하게 연결합니다.

이 설정을 통해 VPC 또는 연결된 네트워크 내의 애플리케이션은 인증서를 사용하여 내부 IP 주소를 사용하여 Gemma 3 API와 비공개로 상호작용할 수 있습니다. 모든 트래픽은 Google 네트워크 내에 유지되며 공개 인터넷을 거치지 않습니다.

다음 단계

추가 자료 및 동영상

참조 문서