J'essaie de publier des données sur SNS à partir d'un appel de fonction Lambda, mais cela ne semble pas fonctionner. Mon code de fonction est -

public class Handler implements RequestHandler<DynamodbEvent, Void> {

    private static final String SNS_TOPIC_ARN = "arn:aws:sns:us-west-2:account_number:function_name";

    @Override
    public Void handleRequest(DynamodbEvent dynamodbEvent, Context context) {

        LambdaLogger logger = context.getLogger();

        AmazonSNSClient snsClient = new AmazonSNSClient(new DefaultAWSCredentialsProviderChain());
        snsClient.setRegion(Region.getRegion(Regions.US_WEST_2));

        for (DynamodbStreamRecord record : dynamodbEvent.getRecords()) {
            Map<String, AttributeValue> newImage = record.getDynamodb().getNewImage();

            if (newImage == null) {
                continue;
            }

            String sensorId = newImage.get("sensorID").getS();
            long timestamp = Long.parseLong(newImage.get("timestamp").getS());
            double temperature = Double.parseDouble(newImage.get("payload").getM().get("temp").getN());

            String data = sensorId + " " + timestamp + " " + temperature;

            logger.log(data);

            PublishRequest publishRequest = new PublishRequest(SNS_TOPIC_ARN, data);

            PublishResult publishResult = snsClient.publish(publishRequest);

            logger.log("Publish Successful " + publishResult.getMessageId());
        }

        snsClient.shutdown();

        return null;
    }
}

Cet appel entraîne un délai d'expiration (10 secondes) et l'appel lambda échoue. Si je commente la partie de publication SNS, c'est-à-dire si je ne fais que consigner les données reçues de DynamoDB, cela fonctionne très bien. Dès que le code de publication SNS est ajouté, il expire.

Le message d'expiration enregistré dans CloudWatch est -

START RequestId: 8db74187-459b-42c5-8a06-b3a74873b236 Version: $LATEST END RequestId: 8db74187-459b-42c5-8a06-b3a74873b236 REPORT RequestId: 8db74187-459b-42c5-8a06-b3a74873b236 Duration: 10001.66 ms Billed Duration: 10000 ms Memory Size: 128 MB Max Memory Used: 37 MB Task timed out after 10.00 seconds

J'ai toutes les autorisations appropriées en place et je suis capable de publier sur SNS en utilisant uniquement le code suivant exécuté sur mon PC -

PublishRequest publishRequest = new PublishRequest(SNS_TOPIC_ARN, data);
PublishResult publishResult = snsClient.publish(publishRequest);
System.out.println("Publish Successful " + publishResult.getMessageId());

J'ai aussi essayé d'utiliser AmazonSNSAsyncClient au lieu de AmazonSNSClient, cela donne le même résultat.

Qu'est-ce que j'oublie ici ?

10
Rohan 28 déc. 2015 à 11:42

3 réponses

Meilleure réponse

Étant donné qu'aucune des personnes qui ont commenté ma question ne répond, je vais y répondre moi-même.

L'augmentation de l'utilisation de la mémoire à 256 Mo et le délai d'expiration à 30 secondes semble avoir résolu le problème.

9
Rohan 31 déc. 2015 à 05:44

Augmentez la quantité de mémoire allouée pour l'opération Lambda.

2
Josh Wulf 29 déc. 2015 à 17:46

L'augmentation de la mémoire allouée à la fonction lambda a également fonctionné pour moi (ce paramètre se trouve dans la console lambda sous les paramètres de base).

Celui-ci était exaspérant pour moi - j'utilisais le même fichier JAR pour 2 fonctions lambda différentes avec des configurations identiques, et l'appel SNS fonctionnait pour l'une mais expirait pour l'autre. Exaspérant!

0
ProductGuy1234 25 déc. 2018 à 16:38