6

sto usando il AWS SDK for JavaScript e sta restituendo il seguente errore quando provo a creare una funzione lambda:InvalidParameterValueException: Il ruolo definito per la funzione non può essere assunto da Lambda

InvalidParameterValueException: Il ruolo definito per la funzione non può essere assunta da Lambda.

Ho ricontrollato il mio ruolo ed è perfettamente valido. Tuttavia, non riesco ancora a creare la funzione Lambda.

Il mio ruolo rapporto di fiducia è:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Effect": "Allow", 
      "Principal": { 
       "Service": [ 
        "lambda.amazonaws.com" 
       ] 
      }, 
      "Action": [ 
       "sts:AssumeRole" 
      ] 
     } 
    ] 
} 
+0

Ho postato questa domanda auto-risposta dal momento che ho trascorso molto tempo per trovare il problema. Spero che possa essere utile agli altri. – Zanon

risposta

8

Questo errore si verifica quando il ruolo è valido (che non è il caso) o quando si tenta di creare la funzione lambda subito dopo la creazione di ruolo. Amazon ha bisogno di pochi secondi per replicare il tuo nuovo ruolo in tutte le regioni. Quindi, la correzione qui è per attendere alcuni secondi prima di creare la funzione Lambda.

Solution - Esempio 1:

var AWS = require('aws-sdk'); 
var lambda = new AWS.Lambda(); 

var params = {}; // define your parameters 

lambda.createFunction(params, function(err, data) { 
    if (err && err.code === 'InvalidParameterValueException') { 

     // try again after a few seconds 
     setTimeout(function(){ 
      lambda.createFunction(params, callback); 
     }, 10000); 
    } else { 
     callback(err, data); 
    } 
}); 

Soluzione - Esempio 2:

Di solito, in attesa di 5 secondi è sufficiente, ma può anche prendere un po 'di più. Per una soluzione più robusta, è possibile utilizzare un modulo di ripetizione come this.

var AWS = require('aws-sdk'); 
var retry = require('retry'); 
var lambda = new AWS.Lambda(); 

var params = {}; // define your parameters 

var operation = retry.operation({ 
    retries: 3,   // try 1 time and retry 3 times if needed, total = 4 
    minTimeout: 1 * 1000, // the number of milliseconds before starting the first retry 
    maxTimeout: 15 * 1000 // the maximum number of milliseconds between two retries 
}); 

operation.attempt(function(currentAttempt) { 
    lambda.createFunction(params, function(err, data) { 
     if (operation.retry(err) && err.code === 'InvalidParameterValueException') 
      return; 

     callback(err); 
    }); 
}); 
Problemi correlati