아키텍처

Cloud Storage, BigQuery Private Access - Part 1에서 이어지는 내용

Private Service Connect 엔드포인트 연결

Private Service Connect 엔드포인트를 연결하려면 아래의 권한들이 필요하다.

  • Compute 네트워크 관리자 (roles/compute.networkAdmin)
  • 서비스 디렉토리 편집자 (roles/servicedirectory.editor)
  • DNS 관리자 (roles/dns.admin)

때문에 서비스 디렉토리 API, Cloud DNS API를 활성화해줘야 한다.

Private Service Connect 엔드포인트용 IP 생성

※GCP VPC의 Subnet CIDR 이외의 IP 주소 범위에서 IP 주소를 지정해야 함※

서비스 디렉토리 네임스페이스는 API를 사용설정하면 자동으로 할당된다.

Cloud Router 편집

이 상태에서는 AWS측에 PSC 엔드포인트의 IP 주소로의 라우팅이 없으므로 AWS에서 PSC 엔드포인트에 액세스할 수 없습니다. 따라서 BGP 세션에서 PSC 엔드포인트의 루트 정보를 AWS 측에 공지해야 함.

Cloud Router에 표시되는 모든 서브넷 공지를 클릭하고 새 커스텀 경로로 PSC 엔드포인트 IP를 추가해준다.
이렇게 하면 AWS Private Subnet 라우팅 테이블에 PSC 엔드포인트 주소가 라우팅 된다.

Cloud DNS 영역 생성

IP 주소 말고 googleapis.com 주소로 라우팅 해주기 위한 설정.
비공개 영역으로 DNS이름을 googleapis.com으로 지정.

다음과 같은 화면이 나올건데 레코드 세트를 추가할 것이다.

  1. PSC 엔드포인트 IP --> <PSC 엔드포인트 이름>.googleapis.com
  2. <PSC 엔드포인트 이름>.googleapis.com --> *.googleapis.com

앞에 특정 단어를 붙이고(ex 서비스 명).googleapis.com을 하면 PSC 엔드포인트 IP로 라우팅되게 설정하는 것.

(사실 A레코드 유형으로 PSC 엔드포인트 IP --> *.googleapis.com 설정 하나만 추가해도 무방하다.)

DNS 인바운드 서버 정책 생성

AWS에서 쿼리를 하면 DNS 포워딩이 될 수신 서버 정책 생성
GCP 네트워크에 대한 수신 쿼리 전달만 허용해주면 끝이다.

이 수신 쿼리 전달 IP를 갖고 AWS Route 53 Resolver 구성을 할 것이다.

Route 53 Resolver 구성

Route53 Resolver의 Outbound 엔드포인트에 대한 보안 그룹 생성.

Outbound 엔드포인트 보안그룹

  • DNS(TCP) 허용
    • 소스 : 10.146.0.0/24 (GCP Subnet CIDR)
  • DNS(UDP) 허용
    • 소스 : 10.146.0.0/24 (GCP Subnet CIDR)

엔드포인트 구성

두 가지 IP 주소를 지정해야 함.
AZ를 나누어 지정하면 되지만, 같은 AZ로 지정하는 것도 가능.
IP 주소는 "자동으로 선택된 IP 주소 사용" 선택.
(ENI의 IP 주소가 연결됨)

해당 VPC에서 googleapis.com 도메인에 대해 쿼리를 하면 대상 IP 주소(Cloud DNS 정책에서 설정한 수신 쿼리 전달 IP)로 쿼리가 전달된다.

EC2에서 확인

BigQuery 접근

테이블 쿼리

Cloud Storage 접근
파일 다운로드

+2023.09 업데이트. 추가로 해당 구성을 해놓으면 GCP의 신 기능인 Vertex AI의 Gen AI 모델을 호출할 수도 있다.
아래에선 Python 코드를 통해 호출한 결과이다.

예제 코드
test.py

from vertexai.preview.language_models import ChatModel
from google.oauth2 import service_account

PROJECT_ID = "<프로젝트 ID>"
LOCATION = "us-central1" # Vertex AI의 Gen AI는 현재 US 리전에서만 사용 가능
SVC_ACCT_FILE="/home/ec2-user/test.json" # 서비스 계정 키 파일
credentials = service_account.Credentials.from_service_account_file(SVC_ACCT_FILE)

# Initialize Vertex AI SDK
import vertexai
vertexai.init(project=PROJECT_ID, location=LOCATION, credentials=credentials )

chat_model = ChatModel.from_pretrained("chat-bison@001")
print(type(chat_model))

chat = chat_model.start_chat()
print(type(chat))

print(chat.send_message("""
My name is minhyoung.
"""))

print(chat.send_message("""
What's my name again?
"""))

파일 실행 결과

외부 IP가 없는 EC2에서 Vertex AI의 Gen AI 모델인 chat-bison@001를 불러온 것.

Python 코드를 보면 "My Name is minhyoung"을 전송했었고, 이에 대한 대답으로 "Hi, Minhyoung, how can I help you today?"가 왔다.

또한 "What's my name again?"을 전송했었고, 이에 대한 대답으로 "Your name is Minhyoung"를 받았다.

[Cloud Storage, BigQuery Private Access 참고]
https://dev.classmethod.jp/articles/access-from-ec2-to-bigquery-via-vpn-using-psc-part3/#toc-17

profile
Solutions Architect (rlaalsgud97@gmail.com)

4개의 댓글

comment-user-thumbnail
2023년 8월 24일

포스트 잘 봤습니당~
혹시 반대로 GCP big query에서 AWS S3로 쿼리 결과를 input할 때 VPN을 타고 통신하려면 어떻게 하면 좋을까용

1개의 답글
comment-user-thumbnail
2023년 9월 14일

자료 감사합니다 !! 내부적으로 Vertex GenAI로 PaLM API 호출할 때는 us-central1-aiplatform.googleapis.com 호스트 명을 lookup 하는 것 같더라구요.
DNS 설정이 어려운 경우에는 /etc/hosts에 등록해서 사용하거나 dnsmasq 같은 프로그램을 써서 naming mapping을 하는 것도 workaround가 될듯 하네요!!

1개의 답글