외부 함수와 함께하는 프라이빗 연결: Azure ARM 템플릿

외부 함수와 함께하는 프라이빗 연결: Azure ARM 템플릿

이 문서는 Microsoft Azure의 Snowflake 계정에서 외부 함수를 호출해 외부 서비스에 대한 프라이빗 연결을 설정하는 구성 방법을 설명해요. ARM 템플릿으로 Azure 리소스를 구성하고, Snowflake에서 API 통합과 외부 함수를 만든 뒤 프라이빗 연결을 검증할 수 있어요.

출처: Snowflake SQL Reference

본문

Business Critical 기능

이 기능은 Business Critical(또는 그 이상) 에디션이 필요해요. 업그레이드 문의는 Snowflake Support에 연락해 주세요.

이 주제는 Microsoft Azure의 Snowflake 계정에서 외부 함수를 호출해 외부 서비스에 대한 프라이빗 연결(private connectivity)을 설정하는 구성 세부 사항을 제공해요. ARM 템플릿을 사용해 Microsoft Azure의 리소스를 구성할 수 있어요. 그런 다음 Snowflake에서 API 통합과 외부 함수를 만들 수 있어요. 마지막으로 외부 함수를 호출해서 외부 서비스에 대한 프라이빗 연결을 검증할 수 있어요.

아웃바운드 프라이빗 연결 비용

각 프라이빗 연결 엔드포인트와 처리된 총 데이터량에 대해 비용을 지불해요. 이 항목의 가격은 Snowflake Service Consumption Table을 참고해요.

ACCOUNT_USAGE 및 ORGANIZATION_USAGE 스키마의 청구 뷰를 조회할 때 다음 서비스 유형으로 필터링하면 이 항목의 비용을 확인할 수 있어요:

  • OUTBOUND_PRIVATELINK_ENDPOINT

  • OUTBOUND_PRIVATELINK_DATA_PROCESSED

예를 들어 USAGE_IN_CURRENCY_DAILY 뷰를 조회하고 이 서비스 유형들로 필터링할 수 있어요.

프로세스 개요

다음은 구성 프로세스의 일반적인 개요예요. Snowflake의 단계는 ACCOUNTADMIN 역할을 가진 사용자가 수행해야 해요. Azure의 단계는 별도로 명시하지 않는 한 해당 리소스를 사용할 권한이 있는 사용자가 수행해요.

다음 단계는 공용 인터넷으로 외부 함수를 사용하는 것과 같아요:

  • Microsoft Azure에서 외부 함수의 필수 조건 단계를 완료해요.

  • Azure Portal에서 애플리케이션을 만들어요.

  • Azure Portal에서 원격 서비스를 만들어요.

다만 프라이빗 연결 요구 사항을 공용 인터넷 요구 사항과 완전히 구분하기 위해 새 리소스를 만들고 싶을 수도 있어요. 내부 보안 관리자와 상의해 요구 사항에 가장 적합한 방식을 정해요.

다음 단계는 외부 서비스에 프라이빗 연결을 사용하는 외부 함수에만 고유해요:

  • Snowflake에서 프라이빗 엔드포인트를 만들어요.

  • Azure Portal에서 프라이빗 엔드포인트를 승인해요. 이 작업은 Azure API Management 리소스의 소유자가 수행해요.

  • Snowflake에서 새 API 통합을 만들어요. 외부 서비스에 대한 프라이빗 연결을 지원하려면 전용 API 통합이 필요해요.

  • Snowflake에서 외부 함수를 만들어요. 외부 함수의 호출 URL로 프라이빗 연결 URL을 사용해요.

  • Snowflake에서 외부 함수를 호출해 Snowflake가 프라이빗 연결을 사용해 외부 서비스에 연결할 수 있게 해요.

구성 (Configuration)

Azure Portal에서 다음 단계를 완료해요.

  • 이미 ARM 템플릿을 설정했고 원격 서비스와 프록시 서비스를 재사용하려면 프라이빗 연결 단계로 건너뛰어요. 그렇지 않으면 다음 단계를 완료해요.

    • Microsoft Azure에서 외부 함수의 필수 조건을 완료해요.

    • Azure Portal에서 애플리케이션을 만들어요.

    • 다음과 같이 원격 서비스를 만들어요.

      • Azure Portal에서 Deploy a custom template을 검색해요.

      • Select a template 탭에서 Build your own template을 선택해요.

      • Load file을 선택해요.

      • 템플릿을 다운로드한 머신의 디렉터리로 이동해서 그 템플릿을 선택해요.

      • Save를 선택해요. 그러면 Custom deployment 화면으로 이동해요.

    • 다음 단계를 계속해요.

      • Azure 함수와 API Management 서비스를 만들어요.

      • API 통합과 외부 함수에 필요한 URL을 얻어요.

프라이빗 연결을 구성하려면 다음 단계를 완료해요.

  • Snowflake에서 CREATE API INTEGRATION 명령을 실행해 외부 서비스에 대한 프라이빗 연결을 지원하는 새 API 통합을 만들어요. 속성 값을 Microsoft Azure 구독에 맞게 업데이트해요:
CREATE API INTEGRATION external_api_integration_azure_private
  API_PROVIDER = azure_private_api_management
  AZURE_TENANT_ID = 'a123b4c5-1234-123a-a12b-1a23b45678c9'
  AZURE_AD_APPLICATION_ID = 'dv3421nq-1g4s-4ap4-x89c-xrf28hna7m2o'
  API_ALLOWED_PREFIXES = ('https://aztest1-external-function-api.azure.net')
  ENABLED = TRUE
  COMMENT = 'API integration for private connectivity to an external service with external functions on Azure.';
  • Snowflake에서 SYSTEM$PROVISION_PRIVATELINK_ENDPOINT 시스템 함수를 호출해 프라이빗 엔드포인트를 만들어요. 인수 값을 Microsoft Azure 구독에 맞게 업데이트해요:
USE ROLE ACCOUNTADMIN;
SELECT SYSTEM$PROVISION_PRIVATELINK_ENDPOINT(
  '/subscriptions/f4b00c5f-f6bf-41d6-806b-e1cac4f1f36f/resourceGroups/aztest1-external-function-rg/providers/Microsoft.ApiManagement/service/aztest1-external-function-api',
  'aztest1-external-function-api.azure.net',
  'Gateway'
  );
  • Azure Portal에서 Azure API Management 리소스의 소유자로서 프라이빗 엔드포인트를 승인해요. 자세한 내용은 승인 프로세스를 참고해요.

  • Snowflake가 Azure API Management 서비스에 API 요청을 보낼 수 있도록 Azure용 API 통합을 프록시 서비스에 연결해요.

  • Azure API Management 리소스에 대한 공용 액세스를 차단하도록 선택할 수 있어요. 자세한 내용은 (이 주제의) "Azure API Management 리소스에 대한 보안 액세스"를 참고해요.

  • Snowflake에서 외부 함수를 저장할 데이터베이스와 스키마가 이미 있고 이 객체들을 사용하고 싶다면, 이 객체들이 사용 중인지 확인하거나 Snowsight에서 선택해요. 그렇지 않으면 외부 서비스에 대한 프라이빗 연결에 사용할 외부 함수를 저장할 데이터베이스와 스키마를 만들어요:

CREATE DATABASE private_external_service_db;
CREATE SCHEMA private_ext_functions;
  • Snowflake에서 CREATE EXTERNAL FUNCTION 명령을 실행해 외부 서비스에 대한 프라이빗 연결에 사용할 외부 함수를 만들어요. 호출 URL을 외부 서비스 프라이빗 연결 URL로 업데이트해야 해요:
CREATE OR REPLACE SECURE EXTERNAL FUNCTION private_ext_function_azure_portal(
  a INTEGER , b VARCHAR)
  RETURNS VARIANT
  API_INTEGRATION = external_api_integration_azure_private
  AS 'https://aztest1-external-function-api.azure.net/my-api-url-suffix/http-function-name';

URL 형식은 Azure Portal을 사용해 외부 함수를 만드는지 Azure ARM 템플릿을 사용하는지에 따라 달라져요. 자세한 내용은 호출 URL 형식을 참고해요.

  • Snowflake에서 외부 함수를 호출해 외부 서비스에 대한 프라이빗 연결을 테스트해요:
SELECT private_ext_function_azure(66, 'Mario');
[0, 66, 'Mario']

함수의 출력이 절차 시작 부분에서 원격 서비스 구성과 일치하는 결과를 반환한다면, 외부 서비스에 대한 프라이빗 연결이 예상대로 동작한다는 것이 확인된 거예요.

Azure API Management 리소스에 대한 보안 액세스

외부 함수에 사용할 프라이빗 엔드포인트와 연결된 Azure API Management 리소스에 대한 액세스를 보호할 수 있어요. Azure API Management 리소스의 관점에서 Snowflake는 인바운드 연결이에요. 액세스를 보호하면 외부 함수 사용을 위협할 수 있는 공격의 가능성을 줄여요.

예를 들어 이 Azure CLI apim 명령을 실행해 공용 액세스를 차단할 수 있어요:

az apim update --name  --resource-group  --public-network-access false

자리표시자 값을 API Management 리소스 이름과 리소스 그룹 이름에 해당하는 값으로 업데이트해요.

자세한 내용과 옵션은 다음 주제들을 참고해요.

  • 가상 네트워크를 사용해 Azure API Management의 인바운드·아웃바운드 트래픽을 보호하기.

  • 인바운드 프라이빗 엔드포인트를 사용해 API Management에 프라이빗으로 연결하기.

더 알아보기 (Learn more)