ask-candid / ask_candid /base /lambda_base.py
brainsqueeze's picture
Upload 36 files
a0e37e2 verified
from typing import List, Dict, Union, Optional, Any
from time import sleep
import json
import boto3
class LambdaInvokeBase:
"""Base class for AWS Lambda direct-invocation based classes. Each class which inherits from this only serves a
single function.
Parameters
----------
function_name : str
Name of the Lambda function to invoke
access_key : Optional[str], optional
AWS access key, by default None
secret_key : Optional[str], optional
AWS secret key, by default None
"""
errors = frozenset([
"Unhandled"
])
def __init__(
self, function_name: str,
access_key: Optional[str] = None, secret_key: Optional[str] = None,
) -> None:
if access_key is not None and secret_key is not None:
self._client = boto3.client(
"lambda",
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
region_name="us-east-1",
)
else:
self._client = boto3.client("lambda", region_name='us-east-1')
self.function_name = function_name
def _submit_request(self, payload: Dict[str, Any]) -> Union[Dict[str, Any], List[Any]]:
response = self._client.invoke(
FunctionName=self.function_name,
InvocationType="RequestResponse",
Payload=json.dumps(payload),
)
if response.get("FunctionError") in self.errors:
# could use recursion, but we need to keep track of number of function calls
sleep(1)
response = self._client.invoke(
FunctionName=self.function_name,
InvocationType="RequestResponse",
Payload=json.dumps(payload),
)
return json.loads(response["Payload"].read())