Scalar Lambda UDF
Amazon Redshift는 AWS Lambda에 정의된 사용자 정의 함수를 SQL 쿼리의 일부로 사용할 수 있습니다. Java, Go, PowerShell, Node.js, C#, Python 및 Ruby와 같이 Lambda에서 지원하는 모든 프로그래밍 언어로 스칼라 Lambda UDF를 작성할 수 있습니다. 또는 사용자 정의 런타임을 사용할 수 있습니다.
CREATE EXTERNAL FUNCTION 명령은 다음 파라미터를 생성합니다.
-
(옵션) 데이터 형식이 있는 인수 목록입니다.
-
반환 데이터 형식 1개
-
Amazon Redshift에서 호출하는 외부 함수의 한 함수 이름입니다.
-
Amazon Redshift 클러스터에서 Lambda를 수임하고 호출할 권한이 있는 한 IAM 역할입니다.
-
Lambda UDF가 호출하는 한 Lambda 함수 이름입니다.
CREATE EXTERNAL FUNCTION에 대한 자세한 내용은 CREATE EXTERNAL FUNCTION 섹션을 참조하세요.
이 함수의 입력 및 반환 데이터 형식은 모든 표준 Amazon Redshift 데이터 형식일 수 있습니다.
Amazon Redshift는 외부 함수가 일괄 처리된 인수와 결과를 보내고 받을 수 있도록 합니다.
Lambda UDF는 Lambda에서 정의 및 관리되며 Amazon Redshift에서 이러한 UDF를 호출하기 위한 액세스 권한을 제어할 수 있습니다. 동일한 쿼리에서 여러 Lambda 함수를 호출하거나 동일한 함수를 여러 번 호출할 수 있습니다.
스칼라 함수가 지원되는 SQL 문의 절에서 Lambda UDF를 사용합니다. SELECT, UPDATE, INSERT 또는 DELETE와 같은 모든 SQL 문에서 Lambda UDF를 사용할 수도 있습니다.
참고
Lambda UDF를 사용하면 Lambda 서비스에서 추가 요금이 발생할 수 있습니다. 발생 여부는 Lambda 요청 수(UDF 호출) 및 Lambda 프로그램 실행의 총 기간과 같은 요인에 따라 다릅니다. 그러나 Amazon Redshift에서 Lambda UDF를 사용하기 위한 추가 요금은 없습니다. AWS Lambda 요금에 대한 자세한 내용은 AWS Lambda 요금
Lambda 요청 수는 Lambda UDF가 사용되는 특정 SQL 문 절에 따라 다릅니다. 예를 들어 함수가 다음과 같은 WHERE 절에서 사용된다고 가정합니다.
SELECT a, b FROM t1 WHERE lambda_multiply(a, b) = 64; SELECT a, b FROM t1 WHERE
a*b = lambda_multiply(2, 32)
이 경우 Amazon Redshift는 각각에 대해 첫 번째 SELECT 문을 호출하고 두 번째 SELECT 문을 한 번만 호출합니다.
그러나 쿼리의 프로젝션 부분에서 UDF를 사용하면 결과 집합의 모든 정규화된 또는 집계된 행에 대해 한 번만 Lambda 함수를 호출할 수 있습니다.
UDF 보안 및 권한
Lambda UDF를 생성하려면 LANGUAGE EXFUNC에 대한 사용 권한이 있는지 확인합니다. 특정 사용자, 그룹 또는 퍼블릭에 명시적으로 USAGE ON LANGUAGE EXFUNC를 부여하거나 USAGE ON LANGUAGE EXFUNC를 취소해야 합니다.
다음 예는 EXFUNC에 대한 사용 권한을 PUBLIC에 부여합니다.
grant usage on language exfunc to PUBLIC;
다음 예는 PUBLIC에서의 exfunc 사용 권한을 취소한 후 사용자 그룹 lambda_udf_devs에 사용을 부여합니다.
revoke usage on language exfunc from PUBLIC; grant usage on language exfunc to group lambda_udf_devs;
Lambda UDF를 실행하려면 호출된 각 함수에 대한 권한이 있는지 확인합니다. 기본적으로 새로운 Lambda UDF를 실행하는 권한은 PUBLIC에 허용됩니다. 사용을 제한하려면 함수에 대해 PUBLIC에서 이 권한을 취소합니다. 그런 다음 특정 사용자나 그룹에 권한을 허용합니다.
다음 예는 PUBLIC의 exfunc_sum 함수 실행 권한을 취소합니다. 그런 다음 사용자 그룹 lambda_udf_devs에 사용 권한을 부여합니다.
revoke execute on function exfunc_sum(int, int) from PUBLIC; grant execute on function exfunc_sum(int, int) to group lambda_udf_devs;
기본적으로 수퍼유저는 모든 권한을 갖습니다.
권한 부여 및 취소에 대한 자세한 내용은 GRANT 및 REVOKE 섹션을 참조하세요.
Lambda UDF에 대한 권한 부여 파라미터 구성
CREATE EXTERNAL FUNCTION 명령은 AWS Lambda에서 Lambda 함수를 호출할 수 있는 권한이 필요합니다. 권한 부여를 시작하려면 CREATE EXTERNAL FUNCTION 명령을 실행할 때 AWS Identity and Access Management(IAM) 역할을 지정합니다. IAM 역할에 대한 자세한 내용은 IAM 사용 설명서의 IAM 역할 단원을 참조하세요.
클러스터에 연결된 Lambda 함수를 호출할 수 있는 권한이 있는 기존 IAM 역할이 있는 경우 명령에 대한 IAM_ROLE 파라미터에서 역할 Amazon 리소스 이름(ARN)을 대체할 수 있습니다. 다음 섹션에서는 CREATE EXTERNAL FUNCTION 명령에서 IAM 역할을 사용하는 단계를 설명합니다.
Lambda용 IAM 역할 생성
IAM 역할에는 Lambda 함수를 호출할 수 있는 권한이 필요합니다. IAM 역할을 생성하는 동안 다음 방법 중 하나로 권한을 제공합니다.
IAM 역할을 생성하는 동안 [권한 정책 연결(Attach permissions policy)] 페이지에서
AWSLambdaRole
정책을 연결합니다.AWSLambdaRole
정책은 최소 요구 사항인 Lambda 함수를 호출할 수 있는 권한을 부여합니다. 자세한 내용과 기타 정책은 AWS Lambda 개발자 안내서의 AWS Lambda에 대한 자격 증명 기반 IAM 정책 섹션을 참조하세요.모든 리소스 또는 해당 함수의 ARN이 있는 특정 Lambda 함수의
lambda:InvokeFunction
권한으로 IAM 역할에 연결할 사용자 정의 정책을 생성합니다. 정책을 생성하는 방법에 대한 자세한 내용은 IAM User Guide의 Creating IAM policies 섹션을 참조하세요.다음 예제 정책은 특정 Lambda 함수에서 Lambda 호출을 사용합니다.
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Invoke", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "arn:aws:lambda:us-west-2:123456789012:function:my-function" } ] }
Lambda 함수의 리소스에 대한 자세한 내용은 IAM API Reference의 Resources and conditions for Lambda actions 섹션을 참조하세요.
필요한 권한으로 사용자 지정 정책을 생성한 후 IAM 역할을 생성하는 동안 [권한 정책 연결(Attach permissions policy)] 페이지에서 IAM 역할에 정책을 연결할 수 있습니다.
IAM 역할을 생성하는 단계는 Amazon Redshift 관리 가이드의 사용자를 대신하여 기타 AWS 서비스에 액세스하도록 Amazon Redshift에 권한 부여 섹션을 참조하세요.
새 IAM 역할을 생성하지 않으려면 앞에서 언급한 권한을 기존 IAM 역할에 추가할 수 있습니다.
IAM 역할을 클러스터와 연결
클러스터에 IAM 역할 연결 Amazon Redshift 관리 콘솔, CLI 또는 API를 사용하여 역할을 클러스터에 추가하거나, 클러스터와 연결된 역할을 확인할 수 있습니다. 자세한 내용은 Amazon Redshift 관리 가이드의 클러스터와 IAM 역할 연결 섹션을 참조하세요.
명령에 IAM 역할 포함
CREATE EXTERNAL FUNCTION 명령에 IAM 역할 ARN을 포함합니다. IAM 역할을 생성하면 IAM이 생성된 역할의 Amazon 리소스 이름(ARN)을 반환합니다. IAM 역할을 지정하려면 역할 ARN에 IAM_ROLE
파라미터를 제공합니다. 다음은 IAM_ROLE
파라미터에 대한 구문을 보여줍니다.
IAM_ROLE 'arn:aws:iam::aws-account-id:role/role-name'
동일한 리전 내의 다른 계정에 있는 Lambda 함수를 호출하려면 Amazon Redshift에서 IAM 역할 연결을 참조하세요.
Amazon Redshift와 AWS Lambda 간의 JSON 인터페이스 사용
Amazon Redshift는 통신하는 모든 Lambda 함수에 대해 공통 인터페이스를 사용합니다.
다음 표는 JSON 페이로드에 대해 예상할 수 있는 지정된 Lambda 함수의 입력 필드 목록을 보여줍니다.
필드 이름 |
설명 |
값 범위 |
---|---|---|
request_id | 각 호출 요청을 고유하게 식별하는 UUID(Universally Unique Identifier)입니다. |
유효한 UUID입니다. |
cluster |
클러스터의 전체 Amazon 리소스 이름(ARN)입니다. |
유효한 클러스터 ARN입니다. |
사용자 |
호출하는 사용자의 이름입니다. | 유효한 사용자 이름입니다. |
데이터베이스 |
쿼리가 실행 중인 데이터베이스의 이름입니다. | 유효한 데이터베이스 이름입니다. |
external_function |
호출하는 외부 함수의 정규화된 이름입니다. | 유효한 정규화된 함수 이름입니다. |
query_id |
호출하는 쿼리의 쿼리 ID입니다. | 유효한 쿼리 ID입니다. |
num_records |
페이로드의 인수 수입니다. | 값 1 - 2^64입니다. |
인수 |
지정된 형식의 데이터 페이로드입니다. | 배열 형식의 데이터는 JSON 배열이어야 합니다. 인수의 수가 1보다 크면 각 요소는 배열인 레코드입니다. Amazon Redshift는 배열을 사용하여 페이로드의 레코드 순서를 유지합니다. |
JSON 배열의 순서에 따라 일괄 처리 순서가 결정됩니다. Lambda 함수는 인수를 반복적으로 처리하고 정확한 수의 레코드를 생성해야 합니다. 다음은 페이로드의 예입니다.
{ "request_id" : "23FF1F97-F28A-44AA-AB67-266ED976BF40", "cluster" : "arn:aws:redshift:xxxx", "user" : "adminuser", "database" : "db1", "external_function": "public.foo", "query_id" : 5678234, "num_records" : 4, "arguments" : [ [ 1, 2 ], [ 3, null], null, [ 4, 6] ] }
Lambda 함수의 반환 출력에는 다음 필드가 포함됩니다.
필드 이름 |
설명 |
값 범위 |
---|---|---|
success | 함수의 성공 또는 실패 표시입니다. |
값 |
error_msg |
성공 값이 "false" 이면 오류 메시지(함수가 실패한 경우)입니다. 그렇지 않으면 이 필드는 무시됩니다. |
유효한 메시지입니다. |
num_records |
페이로드의 레코드 수입니다. | 값 1 - 2^64입니다. |
결과 |
지정된 형식의 호출 결과입니다. | N/A |
다음은 Lambda 함수 출력의 예입니다.
{ "success": true, // true indicates the call succeeded "error_msg" : "my function isn't working", // shall only exist when success != true "num_records": 4, // number of records in this payload "results" : [ 1, 4, null, 7 ] }
SQL 쿼리에서 Lambda 함수를 호출할 때 Amazon Redshift는 다음 사항을 고려하여 연결 보안을 보장합니다.
GRANT 및 REVOKE 권한. UDF 보안 및 권한에 관한 자세한 내용은 UDF 보안 및 권한를 참조하시기 바랍니다.
Amazon Redshift는 지정된 Lambda 함수에 최소 데이터 집합만 제출합니다.
Amazon Redshift는 지정된 IAM 역할을 가진 지정된 Lambda 함수만 호출합니다.