2015-12-03 24 views
7

non riesco a trovare alcuna documentazione o esempi su come richiamare una funzione lambda a Swift ma ho cercato di estrapolare dalla documentazione usando Objective-C e I 'm ancora ricevendo errori:come richiamare una funzione AWS Lambda a Swift

"Error in myFunction: ValidationException: Supplied AttributeValue is empty, must contain exactly one of the supported datatypes"

sembra che io non sto passando i parametri alla funzione correttamente quando invoco la funzione lambda dalla rapida perché lo script tenta di scrivere DynamoDB ma uno dei i parametri sono vuoti (questo script lambda funziona quando lo invoco in javascript/node).

let lambda = AWSLambda.defaultLambda() 
    let request = AWSLambdaInvocationRequest() 
    var context = [String: String]() 
    let jsonString = "{\"email\":\"[email protected]\",\"name\":\"example\"}" 
    let jsonData = jsonString.dataUsingEncoding(NSUTF8StringEncoding) 
    request.clientContext = jsonData?.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength) 
    request.functionName = "myFunction" 
    lambda.invoke(request).continueWithBlock({ 
     (currentTask: AWSTask!) -> AWSTask in 
     if (currentTask.error != nil) { 
      // failed to execute. 
      print("Error executing: ", currentTask.error) 
      task.setError(currentTask.error) 
     } else { 
      print("token: ", currentTask.result) 
      task.setResult(currentTask.result) 
    } 
     return currentTask 
    }) 

risposta

5

È necessario impostare il parametro del payload su una mappa contenente i dati che si desidera trasferire. La risposta di

let invocationRequest = AWSLambdaInvokerInvocationRequest() 
    invocationRequest.functionName = "myFunction" 
    invocationRequest.invocationType = AWSLambdaInvocationType.RequestResponse 
    invocationRequest.payload = ["email" : "[email protected]", "name" : "example"] 

    let lambdaInvoker = AWSLambdaInvoker.defaultLambdaInvoker() 
    let task = lambdaInvoker.invoke(invocationRequest).continueWithSuccessBlock() { (task) -> AWSTask! in 
     print("response: ", task.result) 
    } 
+0

Opps, si trattava di una brutta copia della copia da una delle mie app che utilizza lambda da swift. L'ho rimosso dall'esempio ora. Nell'app viene archiviata la richiesta lambda come proprietà sul ViewController, che consente di annullare la richiesta corrente se necessario. –

+0

Trovare lo stesso per l'androide, se qualcuno può aiutare! –

2

Ryan Fitzgerald mi dà più errori in fase di compilazione, ma ho avuto successo con questa versione:

In primo luogo, ho una funzione di inizializzazione con le credenziali di accesso. Si noti che questo non è il metodo di accesso sicuro consigliato per il codice di produzione, ma va bene per il test e altri scopi. Si presuppone inoltre di avere un file Constants.swift in cui si definiscono le costanti elencate:

func initializeLambda() { 

     let credentialsProvider = AWSStaticCredentialsProvider.init(accessKey:Constants.AWS_ACCESS_KEY, secretKey: Constants.AWS_SECRET_KEY) 
     let defaultServiceConfiguration = AWSServiceConfiguration(region: Constants.AWS_REGION, credentialsProvider: credentialsProvider) 
     AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = defaultServiceConfiguration 
    } 

Per il resto siamo in grado di fornire una versione simile alla versione precedente. Ho rimosso il "let task" perché "task" non è usato nel suo esempio. Inoltre, ho incluso lo schema logico di alcune analisi JSON che è probabile che stiano facendo all'interno dell'attività invoke. Finalmente, sono passato a continueWithBlock(). Se si utilizza un oggetto ContinueWithSuccessBlock() non si entra in questo blocco quando Amazon Lambda raggiunge la sua finestra di timeout o se qualcos'altro va male con la richiesta e in genere si desidera che queste situazioni vengano gestite qui.

self.initializeLambda() //Call our previously written initialization function 
    let invocationRequest = AWSLambdaInvokerInvocationRequest() 
    invocationRequest.functionName = "functionName" 
    invocationRequest.invocationType = AWSLambdaInvocationType.RequestResponse 
    invocationRequest.payload = ["key1" : "value1", "key2" : "value2"] 
    let lambdaInvoker = AWSLambdaInvoker.defaultLambdaInvoker() 
    lambdaInvoker.invoke(invocationRequest).continueWithBlock() { (task: AWSTask) -> AWSTask in 
     print("response: ", task.result) 
     //In here you'll likely be parsing a JSON payload 
     if let payload: AnyObject = task.result?.payload { 
       if let error: AnyObject = payload.objectForKey("error") { 
        //If there is an error key in the JSON dictionary... 
       } else { 
        //If the JSON dictionary has no error key... 
       } 
     return task; 
     }  
    } 

Testato e verificato come funzionale su Swift 2.2 in Xcode 7.3.

Problemi correlati