2017-05-24 1 views
2

Verwenden eines .Net Core 1.0 Lambda Ich möchte in der Lage sein, eine Lambda-Funktion zu erstellen, die den PreSignUp-Trigger aus einem AWS Cognito-Benutzerpool verarbeitet.Erstellen eines AWS Cognito PreSignup Lambda in DotNet

using Amazon.Lambda.Core; 

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))] 

public class PreSignUp_SignUp 
{ 
    public string userPoolId { get; set; } 
    public const string EmailKey = "email"; 
    public const string PhoneNumber = "phone_number"; 
    public Dictionary<string,string> userAttributes { get; set; } 
    public Dictionary<string, string> validationData { get; set; } 
} 

public class PreSignup_SignUpResponse 
{ 
    public bool autoConfirmUser { get; set; } 
} 

public class Function 
{ 
    public PreSignup_SignUpResponse FunctionHandler(PreSignUp_SignUp input, ILambdaContext context) 
    { 
     return new PreSignup_SignUpResponse { autoConfirmUser = true }; 
    } 
} 

Obwohl die Anforderung erfolgreich ist und gibt eine Antwort, wenn das Lambda mit einem Beispiel Anfrage von Aufrufen:

{ 
    "datasetName": "datasetName", 
    "eventType": "SyncTrigger", 
    "region": "us-east-1", 
    "identityId": "identityId", 
    "datasetRecords": { 
    "SampleKey2": { 
     "newValue": "newValue2", 
     "oldValue": "oldValue2", 
     "op": "replace" 
    }, 
    "SampleKey1": { 
     "newValue": "newValue1", 
     "oldValue": "oldValue1", 
     "op": "replace" 
    } 
    }, 
    "identityPoolId": "identityPoolId", 
    "version": 2 
} 

Wenn eine tatsächliche SignUp über die AmazonCognitoIdentityProviderClient .Net die Durchführung einen Fehler ich zurück:

Amazon.CognitoIdentityProvider.Model.InvalidLambdaResponseException : Unrecognizable lambda output

Was ich vermute, bedeutet, ich habe nicht die Form der Antwort (und möglicherweise sogar Anfrage) richtig.

Hat jemand ein Beispiel für eine .Net Lambda-Funktion, die für den PreSignUp-Trigger in AWS Cognito funktioniert?

Antwort

4

Die cognito Trigger Anfragen/Antworten die gesamte Nutzlast in der Cognito Trigger-Dokumentation wie angegeben enthalten:

http://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools-working-with-aws-lambda-triggers.html

ich gefunden habe, während der Diagnose dieser Ausgabe der beste Ort zu beginnen, ist durch die Schaffung einer Funktion Handler das nimmt ein JObject und dann loggt und gibt das gleiche Objekt zurück, zB

Dies erfasst die Nutzlast in Cloudwatch-Logs und hilft dann, Sie in Richtung der stark typisierten strukturierten erforderlich zu steuern.

In meinem Fall für PreSignUp habe ich die folgenden Typen erstellt, um eine einfache Funktion zu erstellen, die automatisch alle angegebenen Anmeldeinformationen überprüft.

public abstract class AbstractTriggerRequest 
{ 
    [JsonProperty("userAttributes")] 
    public Dictionary<string, string> UserAttributes { get; set; } 
} 

public abstract class AbstractTriggerResponse 
{ 
} 

public class TriggerCallerContext 
{ 
    [JsonProperty("awsSdkVersion")] 
    public string AwsSdkVersion { get; set; } 
    [JsonProperty("clientId")] 
    public string ClientId { get; set; } 
} 

public abstract class AbstractTriggerBase<TRequest, TResponse> 
    where TRequest: AbstractTriggerRequest 
    where TResponse: AbstractTriggerResponse 
{ 
    [JsonProperty("version")] 
    public int Version { get; set; } 
    [JsonProperty("triggerSource")] 
    public string TriggerSource { get; set; } 
    [JsonProperty("region")] 
    public string Region { get; set; } 
    [JsonProperty("userPoolId")] 
    public string UserPoolId { get; set; } 
    [JsonProperty("callerContext")] 
    public TriggerCallerContext CallerContext { get; set; } 
    [JsonProperty("request")] 
    public TRequest Request { get; set; } 
    [JsonProperty("response")] 
    public TResponse Response { get; set; } 
    [JsonProperty("userName", NullValueHandling = NullValueHandling.Ignore)] 
    public string UserName { get; set; } 
} 

public class PreSignUpSignUpRequest : AbstractTriggerRequest 
{ 
    [JsonProperty("validationData")] 
    public Dictionary<string,string> ValidationData { get; set; } 
} 

Die Lambda-Funktion endet dann mit der folgenden Signatur auf:

public class Function 
{ 
    public PreSignUp_SignUp FunctionHandler(PreSignUp_SignUp input, ILambdaContext context) 
    { 
     context.Logger.LogLine("Auto-confirming everything!"); 

     input.Response = new PreSignUpSignUpResponse { 
      AutoConfirmUser = true, 
      // you can only auto-verify email or phone if it's present in the user attributes 
      AutoVerifyEmail = input.Request.UserAttributes.ContainsKey("email"), 
      AutoVerifyPhone = input.Request.UserAttributes.ContainsKey("phone_number") 
     }; 

     return input; 
    } 
} 

Hoffentlich hilft dies sonst jemand Probleme laufen in dem Schreiben Lambda für Cognito auslöst.

Verwandte Themen