2016-05-28 11 views
6

Używam AWS SDK for JavaScript i wraca następujący błąd, gdy próbuję utworzyć funkcję lambda:InvalidParameterValueException: Rola zdefiniowane dla funkcji nie można założyć przez Lambda

InvalidParameterValueException: rola zdefiniowany dla funkcja nie może być założona przez Lambda.

Dwa razy sprawdziłem swoją rolę i jest ona całkowicie poprawna. Jednak nadal nie mogę utworzyć funkcji Lambda.

Moja rola jest relacja zaufania:

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

Opublikowaliśmy to pytanie samodzielnie, ponieważ spędziłem bardzo dużo czasu, aby znaleźć problem. Mam nadzieję, że może się przydać innym. – Zanon

Odpowiedz

8

Ten błąd zdarza się, gdy rola jest nieważna (co nie jest prawdą) lub podczas próby utworzenia funkcji Lambda tuż po, czyli do tworzenia rola. Amazon potrzebuje kilku sekund, aby powielić swoją nową rolę we wszystkich regionach. Tak więc, poprawka jest tutaj na odczekanie kilku sekund przed utworzeniem funkcji Lambda.

Rozwiązanie - Przykład 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); 
    } 
}); 

Rozwiązanie - Przykład 2:

Zazwyczaj, czekając przez 5 sekund wystarczy, ale może także być nieco więcej. Aby uzyskać bardziej niezawodne rozwiązanie, można użyć modułu ponownej próby, takiego jak 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); 
    }); 
}); 
Powiązane problemy