Я написал AWS lambda в python для отправки сообщения в тему sns.
Я использую кодекс aws-кода для развертывания этого кода в clould.
Запуск этой лямбды с помощью вызова шлюза API.
python Код выглядит следующим образом:
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
Я получаю ниже ошибку в журналах наблюдения за облаком:
Может кто-нибудь помочь мне решить эту проблему.