외부 함수 소개¶
이 항목에서는 Snowflake 외부에서 개발, 유지 관리, 저장, 실행되는 실행 코드를 호출하는 외부 함수에 대해 설명합니다.
이 항목에서 설명하는 내용은 다음과 같은 점에서 도움이 됩니다.
외부 함수가 무엇인지 이해할 수 있습니다.
외부 함수가 UDF(사용자 정의 함수) 를 구현하는 최상의 방법인지 결정할 수 있습니다.
외부 함수를 위한 클라우드 플랫폼을 선택할 수 있습니다.
이 항목의 내용:
외부 함수란 무엇입니까?¶
외부 함수 는 Snowflake 외부에서 실행되는 코드를 호출합니다.
원격으로 실행되는 코드는 원격 서비스 로 알려져 있습니다.
원격 서비스로 전송된 정보는 보통 프록시 서비스 를 통해 릴레이됩니다.
Snowflake는 API 통합 에 보안 관련 외부 함수 정보를 저장합니다.
아래 다이어그램에서는 클라이언트 프로그램에서 Snowflake를 통해 원격 서비스로 이어지는 기본적인 정보 흐름을 보여줍니다.
각각의 주요 구성 요소는 아래에서 더 자세히 설명하겠습니다.
- 외부 함수:
외부 함수는 UDF 의 한 유형입니다. 다른 UDFs와 달리, 외부 함수에는 자체 코드가 없습니다. 대신, 외부 함수는 Snowflake 외부에 저장되고 실행되는 코드를 호출합니다.
Snowflake 내부에서, 외부 함수는 Snowflake가 원격 서비스를 호출하는 데 사용하는 정보가 들어 있는 데이터베이스 오브젝트로 저장됩니다. 이 저장된 정보는 원격 서비스와의 사이에서 정보를 릴레이하는 프록시 서비스 의 URL을 포함합니다. 이 정보는 CREATE EXTERNAL FUNCTION 명령의 일부로 지정됩니다.
외부 함수를 나타내는 데이터베이스 오브젝트는 특정 데이터베이스와 스키마에서 생성됩니다. 외부 함수는 정규화된 이름을 나타내는 점 표기법을 사용해 호출할 수 있습니다. 예:
select my_database.my_schema.my_external_function(col1) from table1;
- 원격 서비스:
원격으로 실행되는 코드는 원격 서비스로 알려져 있습니다.
원격 서비스는 함수처럼 작동해야 합니다. 예를 들어 값을 반환해야 합니다.
Snowflake는 스칼라 외부 함수를 지원하는데, 원격 서비스는 수신된 각 행에 대해 정확히 한 개의 행을 반환해야 합니다.
Snowflake 외부 함수 기능으로 호출하려는 원격 서비스는 다음을 수행해야 합니다.
JSON 입력을 받고 JSON 출력을 반환해야 합니다. (Snowflake 호환 HTTP 헤더와 JSON 형식의 데이터에 대한 자세한 내용은 원격 서비스 입력 및 출력 데이터 타입 을 참조하십시오.)
HTTPS 엔드포인트를 노출해야 합니다.
예를 들어, 원격 서비스를 다음으로 구현할 수 있습니다.
AWS Lambda 함수.
Microsoft Azure 함수.
EC2 인스턴스에서 작동하는 HTTPS 서버(예: Node.js).
- 프록시 서비스:
Snowflake는 원격 서비스 를 직접 호출하지 않습니다. 대신 Snowflake는 원격 서비스에 데이터를 릴레이하는 프록시 서비스를 호출합니다.
프록시 서비스는 원격 서비스에 대한 요청을 인증하여 보안을 강화할 수 있습니다.
프록시 서비스는 원격 서비스에 대한 구독 기반 청구를 지원할 수 있습니다. 예를 들어, 프록시 서비스는 원격 서비스에 대한 호출자가 유료 구독자인지 확인할 수 있습니다.
또한, 프록시 서비스는 원격 서비스의 응답을 Snowflake로 다시 릴레이합니다.
프록시 서비스의 예는 다음과 같습니다.
Amazon API Gateway.
Microsoft Azure API Management 서비스.
- API 통합:
통합 은 Snowflake와 서드 파티 서비스 간의 인터페이스를 제공하는 Snowflake 오브젝트입니다. API 통합은 프록시 서비스 또는 원격 서비스로 작업하는 데 필요한 보안 정보 등의 정보를 저장합니다.
API 통합은 CREATE API INTEGRATION 명령으로 생성됩니다.
사용자는 자체 원격 서비스를 작성하고 호출하거나 서드 파티에서 작성한 원격 서비스를 호출할 수 있습니다. 이러한 원격 서비스는 AWS Lambda와 같은 클라우드 서버리스 컴퓨팅 서비스를 비롯한 어떤 HTTP 서버 스택이라도 사용해 작성할 수 있습니다.
SQL 문을 실행하는 사용자의 관점에서, 외부 함수는 다른 UDF 처럼 작동합니다. 외부 함수는 다음 규칙을 따릅니다.
외부 함수는 값을 반환합니다.
외부 함수는 매개 변수를 받을 수 있습니다.
외부 함수는 다른 유형의 UDF 가 나타날 수 있는 SQL 문의 어떤 절에든 나타날 수 있습니다. 예:
select my_external_function_2(column_1, column_2) from table_1; select col1 from table_1 where my_external_function_3(col2) < 0; create view view1 (col1) as select my_external_function_5(col1) from table9;
외부 함수는 더 복잡한 식에 포함될 수 있습니다.
select upper(zipcode_to_city_external_function(zipcode)) from address_table;
반환된 값은 JSON을 포함하는 VARIANT와 같은 복합 값일 수 있습니다.
외부 함수는 오버로드될 수 있습니다. 즉, 두 개의 다른 함수가 이름은 같지만 서명이 다를 수 있습니다(입력 매개 변수의 개수나 데이터 타입이 서로 다름).
외부 함수의 작동 방식¶
Snowflake는 원격 서비스를 직접 호출하지 않습니다. 대신, Snowflake는 클라우드 공급자의 기본 HTTPS 프록시 서비스(예: AWS의 API Gateway)를 통해 원격 서비스를 호출합니다.
외부 함수를 호출하는 주요 단계는 다음과 같습니다.
사용자의 클라이언트 프로그램이 외부 함수를 호출하는 SQL 문을 Snowflake에 전달합니다.
쿼리 실행의 일부로 외부 함수를 평가할 때, Snowflake는 외부 함수 정의와 해당 API 통합 정보를 읽습니다.
외부 함수 정의의 정보는 다음을 포함합니다.
프록시 서비스의 URL.
해당 API 통합의 이름.
API 통합의 정보는 다음을 포함합니다.
사용할 프록시 서비스 리소스. 이 리소스에는 원격 서비스에 대한 정보(예: 해당 서비스의 위치)가 포함됩니다.
해당 프록시 서비스 리소스에 대한 인증 정보.
그러면 Snowflake가 다음을 포함하는 HTTP POST 명령을 작성합니다.
처리할 데이터. 이 데이터는 JSON 형식으로 되어 있습니다.
HTTP 헤더 정보. (자세한 내용은 CREATE EXTERNAL FUNCTION 에 설명되어 있습니다.)
API 통합의 인증 정보.
그런 다음, Snowflake는 POST 요청을 프록시 서비스로 보냅니다.
프록시 서비스는 POST를 수신한 다음, 요청을 처리하여 실제 원격 서비스로 전달합니다. 느슨한 의미로는 프록시 서비스와 리소스를 원격 서비스를 호출하는 “릴레이 함수”로 생각할 수 있습니다.
원격 서비스는 데이터를 처리하고 결과를 반환하며, 반환된 결과는 체인을 통해 원래 SQL 문으로 다시 전달됩니다.
원격 서비스가 비동기 처리 신호를 보내는 HTTP 코드로 응답하는 경우 Snowflake는 원격 서비스에서 결과를 검색하려고 하나 이상의 HTTP GET 요청을 보냅니다. Snowflake는 계속 요청하려고 응답 코드를 수신하는 한, 또는 외부 함수가 시간 초과되거나 오류를 반환할 때까지 계속 GET 요청을 보냅니다.
일반적으로, 쿼리에 원격 서비스로 보낼 행이 많을 때는 행이 일괄 처리로 분할됩니다. 일괄 처리에서는 일반적으로 더 많은 병렬 처리와 더 빠른 쿼리를 허용합니다. 어떤 경우에는 일괄 처리를 통해 원격 서비스의 오버로드를 줄입니다.
원격 서비스는 수신된 각 일괄 처리에 대해 1개의 행 일괄 처리를 반환합니다. 스칼라 외부 함수의 경우, 반환된 일괄 처리의 행 수는 수신된 일괄 처리의 행 수와 같습니다.
각 일괄 처리는 Snowflake에서 원격 서비스로 전송되는 각 요청에 포함되는 고유한 일괄 처리 ID를 갖습니다.
(예: 시간 제한으로 인한) 재시도 작업은 일반적으로 일괄 처리 수준에서 수행됩니다.
외부 함수의 장점¶
외부 함수는 다른 UDFs 에 비해 다음과 같은 장점이 있습니다.
원격 서비스의 코드는 다음을 포함하여 다른 UDFs를 작성할 수 없는 언어로 작성할 수 있습니다.
Go
C#
원격 서비스는 내부 UDFs에서 액세스할 수 없는 함수와 라이브러리를 사용할 수 있습니다. 예를 들어, 원격 서비스는 기계 학습 채점 라이브러리와 같이, 상용화된 서드 파티 라이브러리와 정합할 수 있습니다.
개발자는 Snowflake에서 호출하고 그와 똑같은 인터페이스를 사용하도록 작성된 다른 소프트웨어에서도 호출할 수 있는 원격 서비스를 작성할 수 있습니다.
외부 함수의 제한 사항¶
외부 함수에는 생성 시간 제한과 실행 시간 제한으로 느슨하게 분류할 수 있는 다음과 같은 제한 사항이 있습니다.
생성 시간 제한 및 요구 사항¶
외부 함수를 처음 호출하려면 먼저 관리자가 몇 가지 구성 작업을 수행해야 합니다. 이 작업을 하려면 클라우드 플랫폼(예: AWS 또는 Microsoft Azure), 특히 보안에 대한 지식이 필요합니다.
Snowflake는 클라우드 HTTP 프록시 서비스(예: Amazon API Gateway)를 통해 원격 서비스를 간접적으로 호출하므로, 외부 함수의 원격 서비스는 프록시 서비스에서 호출할 수 있어야 합니다. 다행히도, HTTPS 엔드포인트 역할을 할 수 있는 거의 모든 함수에는 프록시 서비스를 통해 외부 함수로 액세스할 수 있습니다. 함수 작성자는 원격 서비스를 호출하도록 프록시 서비스를 프로그래밍해야 합니다(예: AWS Lambda에서 실행되는 함수).
일부 클라우드 플랫폼은 특정한 요구 사항이 있을 수 있습니다. 예를 들어, AWS에서는 외부 함수에 리전 엔드포인트나 프라이빗 엔드포인트가 필요합니다. 자세한 내용은 지원되는 플랫폼 섹션을 참조하십시오. Amazon API Gateway 리전 및 프라이빗 엔드포인트에 대한 자세한 내용은 엔드포인트 유형 선택하기: 리전 엔드포인트와 프라이빗 엔드포인트 를 참조하십시오.
저장 프로시저가 아닌 함수만 외부 함수 기능을 사용해 작성할 수 있습니다.
외부 함수에 대한 향후 권한 부여 는 지원되지 않습니다.
실행 시간 제한 사항과 문제¶
원격 서비스는 Snowflake에 불투명하므로, 최적화 프로그램은 동등한 내부 함수에 대해 수행할 수 있는 일부 최적화를 수행하지 못할 수도 있습니다.
외부 함수는 내부 함수(기본 제공 함수와 내부 UDFs 모두)보다 오버헤드가 더 많으며 보통 더 느리게 실행됩니다.
현재, 외부 함수는 스칼라 함수여야 합니다. 스칼라 외부 함수는 각 입력 행에 대해 단일 값을 반환합니다.
현재, Secure Data Sharing 을 통해 외부 함수를 데이터 컨슈머와 공유할 수 없습니다.
일괄 처리당 최대 응답 크기는 10MB입니다.
다음과 같은 상황에서는 외부 함수를 사용할 수 없습니다.
Secure Data Sharing 을 통해 공유되는 데이터베이스 오브젝트(예: 테이블, 뷰, UDF 또는 마스킹 정책)의 일부로 외부 함수를 사용할 수 없습니다. 예를 들어, 외부 함수를 사용하는 공유 뷰를 만들 수 없습니다. 다음은 지원되지 않습니다.
CREATE VIEW my_shared_view AS SELECT my_external_function(x) ...; CREATE SHARE things_to_share; ... GRANT SELECT ON VIEW my_shared_view TO SHARE things_to_share; ...
CREATE TABLE
문의DEFAULT
절. 즉, 열의 기본값은 외부 함수를 호출하는 식이 될 수 없습니다.DEFAULT
절에 외부 함수를 포함하려는 경우에는CREATE TABLE
문이 실패합니다.
외부 함수는 추가적인 보안 문제를 일으킬 수 있습니다. 예를 들어, 서드 파티의 함수를 호출하는 경우 해당 서드 파티는 함수에 전달된 데이터의 복사본을 유지할 수 있습니다.
외부 함수 사용 비용 청구¶
외부 함수를 사용하면 다음과 관련된 일반적인 비용이 발생합니다.
그 밖에도, 원격 서비스 공급자의 요금을 포함하여 간접 요금이나 서드 파티 요금을 결제해야 할 수도 있습니다. 요금은 공급업체마다 다를 수 있습니다.
참고
Amazon API Gateway Private Endpoints를 통해 전송되는 데이터에는 송신 및 수신 모두에 AWS PrivateLink 요금이 부과됩니다.
지원되는 플랫폼¶
외부 함수 호출을 지원하는 플랫폼¶
일반적으로, Snowflake가 지원하는 모든 클라우드 플랫폼의 Snowflake 계정에서 외부 함수를 호출할 수 있습니다.
Amazon Web Services(AWS)
Microsoft Azure
GCP(Google Cloud Platform)
예외 사항은 아래에 나열되어 있습니다.
AWS API Gateway 프라이빗 엔드포인트를 통해 액세스되는 외부 함수에는 AWS의 Snowflake VPC(가상 사설 클라우드)와 동일한 AWS 리전에서만 액세스할 수 있습니다. AWS의 프라이빗 엔드포인트에 대한 자세한 내용은 엔드포인트 유형 선택하기: 리전 엔드포인트와 프라이빗 엔드포인트 를 참조하십시오.
외부 함수를 호출하는 SQL 구문은 모든 플랫폼에서 같습니다.
이러한 서비스에 대한 액세스를 구성하는 SQL 문(CREATE EXTERNAL FUNCTION 및 CREATE API INTEGRATION)은 모든 플랫폼에서 같습니다. 하지만 이러한 문 내부의 절은 프록시 서비스와 원격 서비스를 호스팅하는 플랫폼에 따라 다릅니다.
외부 함수의 원격 서비스와 프록시 서비스 생성을 지원하는 플랫폼¶
어떤 플랫폼에서라도 외부 함수를 호출 할 수 있지만, 외부 함수의 원격 서비스와 프록시 서비스는 각각 지원되는 특정 플랫폼에서 생성 해야 합니다.
많은 경우, 원격 서비스를 위한 플랫폼 및 계정은 프록시 서비스를 위한 플랫폼 및 계정과 똑같습니다. 그러나 꼭 그래야 하는 것은 아닙니다. 예를 들어, SQL 쿼리는 AWS API Gateway(프록시 서비스)를 통해 Azure Function(원격 서비스)을 호출할 수 있습니다. SQL 쿼리 자체는 GCP에서 작동하는 Snowflake 인스턴스에서 실행할 수 있습니다.
원격 서비스를 지원하는 플랫폼¶
원격 서비스를 호스팅하려면 HTTP 서버 스택이 필요합니다. 원격 서비스를 지원할 수 있는 HTTP 서버 스택은 외부 함수와 호환 가능해야 합니다.
원격 서비스를 만들려면 일반적으로 다음이 필요합니다.
클라우드 플랫폼의 공급자가 있는 계정(예: Azure 함수를 만들기 위한 Microsoft Azure 계정). 이 계정은 원격 서비스를 위한 저장소와 컴퓨팅 서비스를 제공합니다. 이 계정은 Snowflake 계정과는 별개입니다.
Snowflake는 다음과 같이 원격 서비스를 만드는 지침을 제공합니다.
AWS Lambda 함수.
Microsoft Azure 함수.
Google Cloud Function.
프록시 서비스를 지원하는 플랫폼¶
클라우드 플랫폼에 기본 HTTP 프록시 서비스의 인스턴스가 필요합니다.
프록시 서비스를 구성하려면 일반적으로 다음이 필요합니다.
클라우드 플랫폼의 공급자가 있는 계정(예: AWS를 사용할 Amazon 계정). 이 계정은 프록시 서비스를 위한 저장소와 컴퓨팅 서비스를 제공합니다. 이 계정은 Snowflake 계정과는 별개입니다.
프록시 서비스 구성에 필요한 권한을 가진 클라우드 플랫폼 역할. 이 클라우드 플랫폼 역할은 Snowflake 역할과는 별개입니다.
다음 HTTPS 프록시 서비스가 지원됩니다.
Amazon API Gateway.
Microsoft Azure API Management 서비스.
Google Cloud API Gateway.
아래 섹션에는 사용자가 플랫폼을 선택하기 전에 알아야 하는 플랫폼 관련 정보가 있습니다.
플랫폼별 제한 사항¶
- AWS:
이 기능은 Amazon API Gateway의 리전 엔드포인트와 프라이빗 엔드포인트만 지원합니다. (다양한 유형의 엔드포인트에 대한 설명은 엔드포인트 를 참조하십시오.)
Snowflake 외부 함수와 API 통합은 AWS 사용자 지정 도메인 을 지원하지 않습니다. Snowflake에서 Amazon API Gateway에 액세스하려면 다음과 비슷한 형태로 AWS에서 생성되는 기본 URL을 사용하십시오.
https://api-id.execute-api.region.amazonaws.com/stage