Лямбда, чтобы отправить уведомление SNS - PullRequest
0 голосов
/ 10 октября 2018

У меня есть S3 Bucket - где при загрузке объекта (CSV загружается) - лямбда срабатывает.Затем Lambda берет этот CSV-файл и загружает его в базу данных Dynamo.Теперь, после того как Dynam DB обновлен - мне нужно отправить уведомление SNS.

Ниже приведен мой код.нижеприведенный код вставляется в Dynamo DB - однако он не выходит из цикла для выполнения части SNS.Если я закомментирую цикл for (put_item), SNS сработает, и я смогу получить уведомление.

import os
import boto3
import json
import logging

log_level = os.environ['LOG_LEVEL']
log = logging.getLogger(__name__)
logging.getLogger().setLevel(log_level)

def lambda_handler(event, context):

    # Fetch the bucket name and the file
    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']

    log.info("Event: " + (str(event)))

    # Generate record in DynamoDB
    try :
        # Declare S3 bucket and DynamoDB Boto3 Clients
        s3_client = boto3.client('s3')
        dynamodb = boto3.resource('dynamodb')

        # Read the Object using get_object API
        obj = s3_client.get_object(Bucket=bucket, Key=key)
        rows = obj['Body'].read().decode("utf-8").split('\n')

        tableName = os.environ['DB_TABLE_NAME']
        table = dynamodb.Table(tableName)

        log.info("TableName: " + tableName)


        try :
            # Write the CSV file to the DynamoDB Table
            with table.batch_writer() as batch:
                for row in rows:       
                    batch.put_item(Item={
                        'A': row.split(',')[0],
                        'B': row.split(',')[1],
                        'C': row.split(',')[2],
                        'D': row.split(',')[3]
                        })


            print('Finished Inserting into TableName: ' + tableName)
        except dynamodb_client.exceptions.ResourceNotFoundException as tableNotFoundEx:
            return ('ERROR: Unable to locate DynamoDB table: ', tableName)


    except KeyError as dynamoDBKeyError:
        msg = 'ERROR: Need DynamoDB Environment Var: DB_TABLE_NAME'
        print(dynamoDBKeyError)
        return msg;

    log.info("Finished Inserting into TableName: " + tableName)

    # Send Notificaiton to SNS
    try :
        topicName = os.environ['SNS_TOPIC_ARN']
        print('*SNS TopicName*=', topicName)
        log.info("TopicName: " +  topicName)

        sns_client = boto3.client('sns')

        sns_client.publish(
            TopicArn = topicName,
            Message = "Vehicle Master data updated in DynamoDB!"
        )

        print('Generated new SNS message, ID: ' + recordId)
        log.info("Generated new SNS message, Topic: " + topicName)

    except KeyError as snsKeyError:
        msg = 'ERROR: Need SNS Environment Var: SNS_TOPIC_NAME'
        print(snsKeyError)
        return msg;

    # return
    return {
        "statusCode": 200,
        "body": json.dumps('Updated to DDB!')
    }

Я не уверен, где ошибка:

...