Skip to content

Commit 2692fea

Browse files
roegimchrza
authored andcommitted
Add local implementations for aws_commons.create_lambda_function_arn() & aws_lambda.invoke()
1 parent 61c0d15 commit 2692fea

File tree

1 file changed

+85
-5
lines changed

1 file changed

+85
-5
lines changed

aws_s3--0.0.1.sql

+85-5
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
33

44
CREATE SCHEMA IF NOT EXISTS aws_commons;
55
CREATE SCHEMA IF NOT EXISTS aws_s3;
6+
CREATE SCHEMA IF NOT EXISTS aws_lambda;
67

78
DROP TYPE IF EXISTS aws_commons._s3_uri_1 CASCADE;
89
CREATE TYPE aws_commons._s3_uri_1 AS (bucket TEXT, file_path TEXT, region TEXT);
910

11+
DROP TYPE IF EXISTS aws_commons._lambda_function_arn_1 CASCADE;
12+
CREATE TYPE aws_commons._lambda_function_arn_1 AS (function_name TEXT, region TEXT, endpoint_url TEXT);
13+
1014
DROP TYPE IF EXISTS aws_commons._aws_credentials_1 CASCADE;
1115
CREATE TYPE aws_commons._aws_credentials_1 AS (access_key TEXT, secret_key TEXT, session_token TEXT);
1216

@@ -184,14 +188,14 @@ AS $$
184188
$$;
185189

186190
CREATE OR REPLACE FUNCTION aws_s3.query_export_to_s3(
187-
query text,
188-
bucket text,
191+
query text,
192+
bucket text,
189193
file_path text,
190194
region text default null,
191195
access_key text default null,
192196
secret_key text default null,
193197
session_token text default null,
194-
options text default null,
198+
options text default null,
195199
endpoint_url text default null,
196200
OUT rows_uploaded bigint,
197201
OUT files_uploaded bigint,
@@ -257,10 +261,10 @@ AS $$
257261
$$;
258262

259263
CREATE OR REPLACE FUNCTION aws_s3.query_export_to_s3(
260-
query text,
264+
query text,
261265
s3_info aws_commons._s3_uri_1,
262266
credentials aws_commons._aws_credentials_1 default null,
263-
options text default null,
267+
options text default null,
264268
endpoint_url text default null,
265269
OUT rows_uploaded bigint,
266270
OUT files_uploaded bigint,
@@ -286,3 +290,79 @@ AS $$
286290
]
287291
)
288292
$$;
293+
294+
--
295+
-- Create a aws_commons._lambda_arn object that holds the lambda function's name, region and endpoint URL
296+
--
297+
298+
CREATE OR REPLACE FUNCTION aws_commons.create_lambda_function_arn(functionNameOrArn TEXT, regionOrEndpoint TEXT DEFAULT NULL)
299+
RETURNS aws_commons._lambda_function_arn_1 AS
300+
$BODY$
301+
DECLARE lambda_arn aws_commons._lambda_function_arn_1;
302+
BEGIN
303+
IF regionOrEndpoint IS NULL THEN
304+
lambda_arn := (split_part(functionNameOrArn, ':', -1), split_part(functionNameOrArn, ':', 4), NULL);
305+
ELSE
306+
IF starts_with(regionOrEndpoint, 'http') THEN
307+
lambda_arn := (split_part(functionNameOrArn, ':', -1), 'eu-west-1', regionOrEndpoint);
308+
ELSE
309+
lambda_arn := (split_part(functionNameOrArn, ':', -1), regionOrEndpoint, NULL);
310+
END IF;
311+
END IF;
312+
RETURN lambda_arn;
313+
END
314+
$BODY$
315+
LANGUAGE plpgsql VOLATILE;
316+
317+
CREATE OR REPLACE FUNCTION aws_lambda._boto3_invoke(IN function_name aws_commons._lambda_function_arn_1,
318+
IN payload TEXT, IN region TEXT DEFAULT NULL, IN invocation_type TEXT DEFAULT 'RequestResponse',
319+
IN log_type TEXT DEFAULT 'None', IN context TEXT DEFAULT NULL,
320+
IN qualifier VARCHAR(128) DEFAULT NULL, OUT status_code INT, OUT payload TEXT,
321+
OUT executed_version TEXT, OUT log_result TEXT)
322+
RETURNS RECORD
323+
LANGUAGE plpython3u
324+
AS $$
325+
import boto3
326+
327+
client=boto3.client(
328+
service_name='lambda',
329+
region_name=function_name['region'],
330+
endpoint_url=function_name['endpoint_url'],
331+
aws_access_key_id='localstack',
332+
aws_secret_access_key='localstack'
333+
)
334+
335+
invokeArgs = {
336+
"FunctionName": function_name['function_name'],
337+
"InvocationType": invocation_type,
338+
"LogType": log_type,
339+
"Payload": payload.encode()
340+
}
341+
if context != None:
342+
invokeArgs["ClientContext"] = context
343+
if qualifier != None:
344+
invokeArgs["Qualifier"] = qualifier
345+
346+
response=client.invoke(**invokeArgs)
347+
responsePayload = response['Payload'].read()
348+
if ( 'FunctionError' in response ):
349+
raise Exception(responsePayload)
350+
return (response['StatusCode'], responsePayload, response['ExecutedVersion'], response['LogResult'])
351+
$$;
352+
353+
CREATE OR REPLACE FUNCTION aws_lambda.invoke(IN function_name aws_commons._lambda_function_arn_1,
354+
IN req_payload JSON, IN region TEXT DEFAULT NULL, IN invocation_type TEXT DEFAULT 'RequestResponse',
355+
IN log_type TEXT DEFAULT 'None', IN context JSON DEFAULT NULL,
356+
IN qualifier VARCHAR(128) DEFAULT NULL, OUT status_code INT, OUT payload JSON,
357+
OUT executed_version TEXT, OUT log_result TEXT)
358+
RETURNS RECORD AS
359+
$BODY$
360+
BEGIN
361+
SELECT result.status_code, result.payload::JSON, result.executed_version, result.log_result
362+
FROM aws_lambda._boto3_invoke(function_name, req_payload::TEXT,
363+
region, invocation_type, log_type, context::TEXT,
364+
qualifier) result
365+
INTO status_code, payload, executed_version, log_result;
366+
END
367+
$BODY$
368+
LANGUAGE plpgsql VOLATILE;

0 commit comments

Comments
 (0)