3
3
4
4
CREATE SCHEMA IF NOT EXISTS aws_commons;
5
5
CREATE SCHEMA IF NOT EXISTS aws_s3;
6
+ CREATE SCHEMA IF NOT EXISTS aws_lambda;
6
7
7
8
DROP TYPE IF EXISTS aws_commons ._s3_uri_1 CASCADE;
8
9
CREATE TYPE aws_commons ._s3_uri_1 AS (bucket TEXT , file_path TEXT , region TEXT );
9
10
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
+
10
14
DROP TYPE IF EXISTS aws_commons ._aws_credentials_1 CASCADE;
11
15
CREATE TYPE aws_commons ._aws_credentials_1 AS (access_key TEXT , secret_key TEXT , session_token TEXT );
12
16
@@ -184,14 +188,14 @@ AS $$
184
188
$$;
185
189
186
190
CREATE OR REPLACE FUNCTION aws_s3 .query_export_to_s3(
187
- query text ,
188
- bucket text ,
191
+ query text ,
192
+ bucket text ,
189
193
file_path text ,
190
194
region text default null ,
191
195
access_key text default null ,
192
196
secret_key text default null ,
193
197
session_token text default null ,
194
- options text default null ,
198
+ options text default null ,
195
199
endpoint_url text default null ,
196
200
OUT rows_uploaded bigint ,
197
201
OUT files_uploaded bigint ,
@@ -257,10 +261,10 @@ AS $$
257
261
$$;
258
262
259
263
CREATE OR REPLACE FUNCTION aws_s3 .query_export_to_s3(
260
- query text ,
264
+ query text ,
261
265
s3_info aws_commons ._s3_uri_1 ,
262
266
credentials aws_commons ._aws_credentials_1 default null ,
263
- options text default null ,
267
+ options text default null ,
264
268
endpoint_url text default null ,
265
269
OUT rows_uploaded bigint ,
266
270
OUT files_uploaded bigint ,
@@ -286,3 +290,79 @@ AS $$
286
290
]
287
291
)
288
292
$$;
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