VPC 서비스 제어 경계 외부의 비공개 엔드포인트에서 보호된 리소스에 대한 멀티클라우드 액세스 허용

참조 아키텍처

다음 참조 아키텍처에서 공유 VPC는 AWS에서 Vertex AI API에 대한 비공개 액세스를 허용하는 서비스 정책 속성을 사용하여 서비스 프로젝트 ph-fm-svc-project (프레임워크 모델 서비스 프로젝트)에 Gemini 모델과 함께 배포됩니다.

  • 단일 VPC 서비스 제어 경계
  • 프로젝트 정의 사용자 ID

VPC 서비스 제어를 사용하여 서비스 경계를 만드는 아키텍처 다이어그램

선택사항: 액세스 수준 만들기

최종 사용자가 Google Cloud 콘솔을 통해 Vertex AI에 액세스해야 하는 경우 이 섹션의 안내에 따라 VPC 서비스 제어 액세스 수준을 만듭니다. 그러나 비공개 소스(예: 비공개 Google 액세스가 있는 온프레미스 또는 Cloud Workstations)에서 API에 프로그래매틱 방식으로 액세스하는 경우 액세스 수준이 필요하지 않습니다.

이 참조 아키텍처에서는 기업 직원 트래픽이 Google Cloud 콘솔에 액세스할 수 있도록 기업 CIDR 범위 corp-public-block를 사용합니다.

Access Context Manager를 사용하면 Google Cloud 조직 관리자가Google Cloud의 프로젝트 및 리소스에 세분화된 속성 기반 액세스 제어를 정의할 수 있습니다.

액세스 수준에서는 요청 처리에 대한 요구사항을 설명합니다. 예를 들면 다음과 같습니다.

조직에서 Access Context Manager를 처음 사용하는 경우 관리자는 액세스 수준 및 서비스 경계의 컨테이너인 액세스 정책을 정의해야 합니다.

  1. Google Cloud 콘솔 상단의 프로젝트 선택기에서 모두 탭을 클릭한 후 조직을 선택합니다.

  2. 기본 액세스 수준 만들기 페이지의 안내에 따라 기본 액세스 수준을 만듭니다. 다음 옵션을 지정합니다.

    1. 조건 만들기에서 기본 모드를 선택합니다.
    2. 액세스 수준 제목 필드에 corp-public-block을 입력합니다.
    3. 조건 섹션의 조건 충족 시 반환 옵션에서 TRUE를 선택합니다.
    4. IP 서브네트워크에서 공개 IP를 선택합니다.
    5. IP 주소 범위의 경우 VPC 서비스 제어 경계에 대한 액세스가 필요한 외부 CIDR 범위를 지정합니다.

VPC 서비스 제어 서비스 경계 빌드

서비스 경계를 만들 때 보호된 프로젝트를 지정하여 경계 외부에서 보호된 서비스에 대한 액세스를 허용합니다. 공유 VPC와 함께 VPC 서비스 제어를 사용하는 경우 호스트 프로젝트와 서비스 프로젝트를 모두 포함하는 하나의 큰 경계를 만듭니다. 경계에서 서비스 프로젝트만 선택하면 서브넷이 호스트 프로젝트에만 연결되므로 서비스 프로젝트에 속한 네트워크 엔드포인트가 경계 외부에 있는 것처럼 보입니다.

새 경계의 구성 유형 선택

이 섹션에서는 테스트 실행 모드에서 VPC 서비스 제어 서비스 경계를 만듭니다. 테스트 실행 모드에서는 경계가 시행된 것처럼 위반사항을 로깅하지만 제한된 서비스에 대한 액세스를 차단하지 않습니다. 강제 모드로 전환하기 전에 테스트 실행 모드를 사용하는 것이 좋습니다.

  1. Google Cloud 콘솔 탐색 메뉴에서 보안을 클릭한 다음 VPC 서비스 제어를 클릭합니다.

    VPC 서비스 제어 페이지로 이동

  2. VPC 서비스 제어 페이지에서 테스트 실행 모드를 클릭합니다.

  3. 새 경계를 클릭합니다.

  4. 새 VPC 서비스 경계 탭의 경계 이름 상자에 경계의 이름을 입력합니다. 그렇지 않으면 기본값을 수락합니다.

    경계 이름은 최대 50자이고 문자로 시작되어야 하며 ASCII 라틴 문자 (a~z, A~Z), 숫자 (0~9) 또는 밑줄 (_)만 포함할 수 있습니다. 경계 이름은 대소문자를 구분하며 액세스 정책 내에서 고유해야 합니다.

보호할 리소스 선택

  1. 보호할 리소스를 클릭합니다.

  2. 경계 내에서 보호하려는 프로젝트 또는 VPC 네트워크를 추가하려면 다음을 수행합니다.

    1. 리소스 추가를 클릭합니다.

    2. 경계에 프로젝트를 추가하려면 리소스 추가 창에서 프로젝트 추가를 클릭합니다.

      1. 프로젝트를 선택하려면 프로젝트 추가 대화상자에서 해당 프로젝트의 체크박스를 선택합니다. 이 참조 아키텍처에서는 다음 프로젝트를 선택합니다.

        • infra-host-project
        • aiml-host-project
        • ph-fm-svc-project
      2. 선택한 리소스 추가를 클릭합니다. 추가된 프로젝트는 프로젝트 섹션에 표시됩니다.

제한된 서비스 선택

이 참조 아키텍처에서는 제한된 API의 범위가 제한되어 Gemini에 필요한 API만 사용 설정됩니다. 하지만 권장사항으로, 경계를 만들 때는 모든 서비스를 제한하여Google Cloud 서비스에서 데이터 무단 반출 위험을 완화하는 것이 좋습니다.

경계 내에서 보호할 서비스를 선택하려면 다음 단계를 따르세요.

  1. 제한된 서비스를 클릭합니다.

  2. 제한된 서비스 창에서 서비스 추가를 클릭합니다.

  3. 제한할 서비스 지정 대화상자에서 Vertex AI API를 선택합니다.

  4. Vertex AI API 추가를 클릭합니다.

선택사항: VPC 액세스 가능 서비스 선택

VPC 액세스 가능 서비스 설정은 서비스 경계 내의 네트워크 엔드포인트에서 액세스할 수 있는 서비스 집합을 제한합니다. 이 참조 아키텍처에서는 기본 설정인 모든 서비스를 유지합니다.

선택사항: 액세스 수준 선택

이전 섹션에서 기업 CIDR 액세스 수준을 만든 경우 다음 단계에 따라 경계 외부에서 보호된 리소스에 액세스하도록 허용합니다.

  1. 액세스 수준을 클릭합니다.

  2. 액세스 수준 선택 상자를 클릭합니다.

    경계가 생성된 후에 액세스 수준을 추가할 수도 있습니다.

  3. 액세스 수준에 해당하는 체크박스를 선택합니다. 이 참조 아키텍처에서는 corp-public-block입니다.

인그레스 및 이그레스 정책

이 참조 아키텍처에서는 인그레스 정책 또는 이그레스 정책 창에 설정을 지정할 필요가 없습니다.

경계 만들기

위의 구성 단계를 완료한 후 경계 만들기를 클릭하여 경계를 만듭니다.

AWS와 Google API 간의 네트워크 연결 구성

Google API용 Private Service Connect 구성

Google API에 액세스하기 위한 Private Service Connect는 비공개 Google 액세스 또는 Google API용 공개 도메인 이름의 대안입니다. 이 경우 프로듀서는 Google입니다.

Private Service Connect를 사용하면 다음을 수행할 수 있습니다.

  • 다양한 사용 사례에 대해 Google API에 액세스할 수 있도록 내부 IP 주소를 하나 이상 만들 수 있습니다.
  • Google API에 액세스할 때 특정 IP 주소 및 리전으로 온프레미스 트래픽을 전달할 수 있습니다.
  • Google API를 확인하는 데 사용되는 맞춤 엔드포인트 DNS 이름을 만듭니다.

참조 아키텍처에서 IP 주소가 10.10.10.3,restricted라는 이름의 Private Service Connect Google API 엔드포인트가 대상 VPC-SC와 함께 배포되며, 이 엔드포인트는 VPC-SC 경계에 구성된 제한된 서비스에 액세스하기 위한 가상 IP (VIP)로 사용됩니다. VIP로 제한되지 않은 서비스를 타겟팅하는 것은 지원되지 않습니다. 자세한 내용은 Vertex AI API 액세스 정보 | Google Cloud를 참고하세요.

AWS VPC 네트워크 구성

Amazon Web Services (AWS)와 Google Cloud 간 네트워크 연결은 고가용성 가상 사설망(HA VPN) 터널을 사용하여 설정됩니다. 이 보안 연결을 통해 두 클라우드 환경 간에 비공개 통신이 용이해집니다. 그러나 AWS와 Google Cloud의 리소스 간에 원활한 라우팅과 통신을 지원하기 위해 경계 게이트웨이 프로토콜 (BGP)이 사용됩니다.

Google Cloud 환경에서는 커스텀 경로 공지가 필요합니다. 이 맞춤 경로는 특히 Private Service Connect Google API IP 주소를 AWS 네트워크에 광고합니다. 이 IP 주소를 광고하면 AWS는 공개 인터넷을 우회하여 Google API로의 직접 경로를 설정하여 성능을 개선할 수 있습니다.

참조 아키텍처에서 Sagemaker 인스턴스는 VPN이 Google Cloud로 설정된 AWS VPC와 연결된 상태로 배포됩니다. 경계 게이트웨이 프로토콜 (BGP)은 AWS와 Google Cloud 네트워크 간에 HA VPN을 통해 경로를 공지하는 데 사용됩니다. 따라서Google Cloud 와 AWS는 VPN을 통해 양방향 트래픽을 라우팅할 수 있습니다. HA VPN 연결 설정에 관한 자세한 내용은 Google Cloud와 AWS 간에 HA VPN 연결 만들기를 참고하세요. Google Cloud

Route 53 업데이트 구성

AWS Route 53에서 p.googleapis.com라는 비공개 호스팅 영역을 만들고 정규화된 도메인 이름 REGION-aiplatform-restricted.p.googleapis.com을 IP 주소 10.10.10.3 (Private Service Connect Googleapis IP)와 함께 DNS A 레코드로 추가합니다. Jupyter Notebook SDK가 Vertex AI API의 DNS 조회를 실행하여 Gemini에 도달하면 Route 53은 Private Service Connect Google API IP 주소를 반환합니다. Jupyter Notebook은 Route 53에서 가져온 IP 주소를 사용하여 HA VPN을 통해 Google Cloud로 라우팅된 Private Service Connect Google API 엔드포인트에 연결합니다.

Sagemaker 업데이트 구성

이 참조 아키텍처는 Amazon SageMaker Notebook 인스턴스를 사용하여 Vertex AI API에 액세스합니다. 하지만 Amazon EC2 또는 AWS Lambda와 같이 VPC를 지원하는 다른 컴퓨팅 서비스로 동일한 설정을 실행할 수 있습니다.

요청을 인증하려면 Google Cloud 서비스 계정 키를 사용하거나 워크로드 아이덴티티 제휴를 사용하면 됩니다. 워크로드 아이덴티티 제휴 설정에 관한 자세한 내용은 온프레미스 또는 다른 클라우드 제공업체를 참고하세요.

Jupyter Notebook 인스턴스는 맞춤 Private Service Connect Google API 정규화된 도메인 이름 REGION-aiplatform-restricted.p.googleapis.com에 대한 DNS 확인을 실행하여 기본 정규화된 도메인 이름(REGION-aiplatform.googleapis.com)을 재정의하여Google Cloud 에 호스팅된 Gemini 모델에 대한 API 호출을 호출합니다.

Vertex AI API는 Rest, gRPC 또는 SDK를 사용하여 호출할 수 있습니다. Private Service Connect 고객 정규화된 도메인 이름을 사용하려면 Jupyter 노트북에서 API_ENDPOINT를 다음과 같이 업데이트합니다.

Python용 Vertex AI SDK 사용 안내

  1. SDK를 설치합니다.

    pip install --upgrade google-cloud-aiplatform
    
  2. 종속 항목을 가져옵니다.

    from google.cloud import aiplatform
    from vertexai.generative_models import GenerativeModel, Part, SafetySetting
    import vertexai
    import base64
    
  3. 다음 환경 변수를 초기화합니다.

    PROJECT_ID="ph-fm-svc-projects" # Google Cloud Project ID
    LOCATION_ID="us-central1" # Enter Vertex AI Gemini region such a s us-central1
    API_ENDPOINT="us-central1-aiplatform-restricted.p.googleapis.com" # PSC Endpoint
    MODEL_ID="gemini-1.5-flash-002" # Gemini Model ID
    
  4. Python용 Vertex AI SDK를 초기화합니다.

    vertexai.init(project=PROJECT_ID,api_endpoint=API_ENDPOINT, api_transport="rest")
    
  5. Vertex AI Gemini API에 다음 요청을 보냅니다.

    import base64
    from vertexai.generative_models import GenerativeModel, Part, SafetySetting
    
    def generate(model_id, prompt):
        model = GenerativeModel(
            model_id,
        )
        responses = model.generate_content(
            [prompt],
            generation_config=generation_config,
            safety_settings=safety_settings,
            stream=True,
        )
    
        for response in responses:
            print(response.text, end="")
    
    generation_config = {
        "max_output_tokens": 8192,
        "temperature": 1,
        "top_p": 0.95,
    }
    
    safety_settings = [
        SafetySetting(
            category=SafetySetting.HarmCategory.HARM_CATEGORY_HATE_SPEECH,
            threshold=SafetySetting.HarmBlockThreshold.OFF
        ),
        SafetySetting(
            category=SafetySetting.HarmCategory.HARM_CATEGORY_DANGEROUS_CONTENT,
            threshold=SafetySetting.HarmBlockThreshold.OFF
        ),
        SafetySetting(
            category=SafetySetting.HarmCategory.HARM_CATEGORY_SEXUALLY_EXPLICIT,
            threshold=SafetySetting.HarmBlockThreshold.OFF
        ),
        SafetySetting(
            category=SafetySetting.HarmCategory.HARM_CATEGORY_HARASSMENT,
            threshold=SafetySetting.HarmBlockThreshold.OFF
        ),
    ]
    
    prompt = "which weighs more: 1kg feathers or 1kg stones"
    generate(MODEL_ID,prompt)
    

    이제 Jupyter 노트북에서 Gemini에 대한 API 호출을 실행하여 Google Cloud에 호스팅된 Gemini에 액세스할 수 있습니다. 호출이 성공하면 다음과 같이 출력됩니다.

    They weigh the same. Both weigh 1 kilogram.
    

Vertex AI REST API 사용 안내

이 섹션에서는 프로세스 전반에 걸쳐 사용될 몇 가지 중요한 변수를 설정합니다. 이러한 변수에는 리소스 위치, 특정 Gemini 모델, 사용하려는 Private Service Connect 엔드포인트와 같은 프로젝트에 관한 정보가 저장됩니다.

  1. Jupyter 노트북 내에서 터미널 창을 엽니다.

  2. 다음 환경 변수를 초기화합니다.

    export PROJECT_ID="ph-fm-svc-projects" 
    export LOCATION_ID="us-central1" 
    export API_ENDPOINT="us-central1-aiplatform-restricted.p.googleapis.com" export MODEL_ID="gemini-1.5-flash-002"
    
  3. vim 또는 nano와 같은 텍스트 편집기를 사용하여 다음과 같은 형식의 Vertex AI Gemini API 요청이 포함된 request.json이라는 새 파일을 만듭니다.

    {
       "contents": [
          {
             "role": "user",
             "parts": [
                 {
                     "text": "which weighs more: 1kg feathers or 1kg stones"
                 }
             ]
          }
       ],
       "generationConfig": {
          "temperature": 1,
          "maxOutputTokens": 8192,
          "topP": 0.95,
          "seed": 0
       },
       "safetySettings": [
          {
             "category": "HARM_CATEGORY_HATE_SPEECH",
             "threshold": "OFF"
          },
          {
             "category": "HARM_CATEGORY_DANGEROUS_CONTENT",
             "threshold": "OFF"
          },
          {
             "category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
             "threshold": "OFF"
          },
          {
             "category": "HARM_CATEGORY_HARASSMENT",
             "threshold": "OFF"
          }
       ]
    }
    
  4. Vertex AI Gemini API에 다음 cURL 요청을 보냅니다.

    curl -v \
    -X POST \
    -H "Content-Type: application/json" \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://$API_ENDPOINT/v1/projects/$PROJECT_ID/locations/$LOCATION_ID/publishers/google/models/$MODEL_ID:streamGenerateContent" -d '@request.json'
    

테스트 실행 모드에서 경계 검증

이 참조 아키텍처에서는 서비스 경계가 테스트 실행 모드로 구성되어 있으므로 시행 없이 액세스 정책의 효과를 테스트할 수 있습니다. 즉, 정책이 활성화된 경우 환경에 미치는 영향을 확인할 수 있지만 합법적인 트래픽이 중단될 위험은 없습니다.

테스트 실행 모드에서 경계를 확인한 후 시행 모드로 전환합니다.

다음 단계