-1

I have written AWS lambda in python to send message to sns topic.

I am using aws code pipeline to deploy this code in clould.

Running this lambda by calling api gateway.

python code is as below:

import boto3

from shared.environment import Env
from account.initiate_transition.transition_event_service import TransitionEventService
from shared.utils import Logger
from shared.xray_utils import trace
from shared.keep_warm import keep_warm


LOG = Logger.initialise_logger('transition-sms', None)
ENV = Env({Env.SMS_SNS_TOPIC_ARN, Env.AWS_REGION_NAME, Env.SMS_TRANSITION_TABLE})
SNS_CLIENT = boto3.client('sns')
DYNAMO_DB = boto3.resource('dynamodb', region_name=ENV.get(Env.AWS_REGION_NAME))
COGNITO_CLIENT = boto3.client('cognito-idp', region_name=ENV.get(Env.AWS_REGION_NAME))
SMS_TRANSITION_TABLE = DYNAMO_DB.Table(ENV.get(Env.SMS_TRANSITION_TABLE))
EVENT_SERVICE = TransitionEventService(SMS_TRANSITION_TABLE,
                                       SNS_CLIENT,
                                       ENV.get(Env.SMS_SNS_TOPIC_ARN),
                                       COGNITO_CLIENT)


@trace
@keep_warm
def lambda_handler(event, context):
    LOG = Logger.initialise_logger('transition-sms', context.aws_request_id)
    try:
        return EVENT_SERVICE.handle(event)
    except Exception as e:
        LOG.error(str(e))

transition_event_service.py

from account.initiate_transition.transition_sms_event import TransitionSmsEvent
from shared.utils import ApiGatewayResponse, Logger
from shared.xray_utils import trace
from http import HTTPStatus
from uuid import uuid4
from botocore.exceptions import ClientError
from jose import jwt

LOG = Logger.get_logger(__name__)


class TransitionEventService:
    def __init__(self, sms_transition_table, sns_client, topic_arn, cognito_client):
        LOG.debug('Initialising TransitionEventService')
        self.sms_transition_table = sms_transition_table
        self.sns_client = sns_client
        self.topic_arn = topic_arn
        self.cognito_client = cognito_client

    @trace
    def handle(self, event):
        try:
            event_object = self.instantiate_event(event)
        except Exception as e:
            LOG.error(e)
            return ApiGatewayResponse.init(HTTPStatus.BAD_REQUEST, {
                'error': 'Invalid request'
            })

        quid = str(uuid4())
        LOG.info('quid {}'.format(quid))

        LOG.debug('Storing SMS transition details')
        self.sms_transition_table.put_item(Item={
                'id_token': event_object.id_token,
                'landing_page': event_object.landing_page,
                'quid': quid
            })

        # Get phone number claim and verified claim
        LOG.debug('Decoding id_token to get unverified claims')
        claims = jwt.get_unverified_claims(event_object.id_token)
        user_pool_id = claims['UserPoolId']
        username = claims['Username']

        url = "account/verify-transition?quid=123&&username=xyz"
        response = self.cognito_client.admin_get_user(
                UserPoolId = user_pool_id,
                Username = username
            )
        phone_number = response['phone_number']

        LOG.debug('Sending Transition SMS')
        self.send_transition_sms(url=url, phone_number=phone_number)
        LOG.debug('SMS sent to {}'.format(phone_number))

        return ApiGatewayResponse.init(HTTPStatus.OK)

    def instantiate_event(self, event):
        return TransitionSmsEvent(event)

    def send_transition_sms(self, url: str, phone_number: str):
        try:
            LOG.debug('Publishing SMS url to SNS Topic:{}'.format(self.topic_arn))
            self.sns_client.publish(
                TopicArn=self.topic_arn,
                Message=json.dumps({
                    'default': json.dumps({
                        'url': url,
                        'phone_number': phone_number
                    })
                }),
                MessageStructure='json'
            )
        except ClientError as e:
            LOG.error(e)
            raise e

I getting below error in cloud watch logs: enter image description here

Could someone help me resolving this issue.

Sagar P. Ghagare
  • 542
  • 2
  • 12
  • 25

4 Answers4

1

If you have requirement.txt then please verify below entry should be present

python-jose-cryptodome==1.3.2 
IMParasharG
  • 1,869
  • 1
  • 15
  • 26
0

You have to import the library needed by your functions. To do that you have to create a virtual env and activate it:

virtualenv v-env
source v-env/bin/activate

Then you install your different libraries

pip install library1
pip install library2
...

And finally you desactivate the virtual environment and package your function :

deactivate
zip -r function.zip .

More infos : https://amzn.to/2oif6Wv

user1297406
  • 1,241
  • 1
  • 18
  • 36
0

if you using requirement.txt you must include dependencies which required. so once you run or deploy your code through code pipeline it will download the dependencies and zip into artifact which you can use through s3 for your python lambda.

once you call api gateway back up by python lambda it will not fail while importing.

no module named jose

It shows that you haven't specify dependency in your requirement.txt file.

depedency require for jose is

python-jose-cryptodome==1.3.*

0

Check whether python-jose-cryptodome==1.3.2 is added in your requirement.txt file. If not add it this is major reason your getting this error.