2015-12-03 16 views
7

nie mogę znaleźć żadnej dokumentacji lub przykłady, w jaki sposób wywołania funkcji Lambda w Swift ale starałem się ekstrapolować z dokumentacji przy użyciu Objective-C oraz I jestem nadal się błędy:Jak wywołać funkcję AWS Lambda w Swift

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

wydaje się, że nie jestem przekazując parametry do funkcji prawidłowo kiedy wywołać funkcję lambda od szybkich ponieważ skrypt próbuje pisać do DynamoDB ale jednym z parametry są puste (ten skrypt lambda działa, gdy wywołuję go w 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 
    }) 

Odpowiedz

5

Musisz ustawić parametr ładunku na mapie zawierającej dane, które chcesz przekazać. Odpowiedź

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, to była zła kopia z jednej z moich aplikacji, która używa lambda z Swift. Usunąłem go teraz z przykładu. W aplikacji przechowuję żądanie lambda jako właściwość w ViewController, co pozwala mi anulować bieżące żądanie w razie potrzeby. –

+0

Znalezienie tego samego dla Androida, jeśli ktoś może pomóc! –

2

Ryan Fitzgerald daje mi wiele błędów w czasie kompilacji, ale miałem sukces w tej wersji:

Po pierwsze, mam funkcję inicjalizacji z poświadczeniami dostępu. Zauważ, że nie jest to zalecana metoda bezpiecznego dostępu do kodu produkcyjnego, ale jest ona dobra do testowania i do innych celów. Zakłada się również masz plik Constants.swift gdzie można zdefiniować wymienione stałe:

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 
    } 

na pozostałą możemy dostarczyć wersję podobną do poprzedniej wersji. Usunąłem "let task", ponieważ "task" nie jest używane w jego przykładzie. Dodatkowo umieściłem logiczny zarys niektórych analiz JSON, które prawdopodobnie wykonujesz wewnątrz zadania invoke. W końcu zmieniłem na continueWithBlock(). Jeśli użyjesz continueWithSuccessBlock(), nie wejdziesz do tego bloku, gdy Amazon Lambda osiągnie limit czasu lub jeśli coś innego pójdzie nie tak z żądaniem i zazwyczaj chcesz, aby te sytuacje były obsługiwane tutaj.

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; 
     }  
    } 

Testowany i zweryfikowany jako funkcjonalny w Swift 2.2 w Xcode 7.3.

Powiązane problemy