2015-12-03 10 views
7

にAWSラムダ関数を呼び出すためにはどうすればスウィフトにラムダ関数を起動する方法上の任意のドキュメントや例を見つけることができませんが、私はObjective-Cのと私を使用してドキュメントから推定する試みましたそれでもエラーが発生して「M:はスウィフト

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

スクリプトがDynamoDBのに書き込もうとするので、私は迅速からラムダ関数を呼び出すときに私が正しく機能するためにパラメータを渡していないよと思われるが、の1パラメータは空です(このlambdaスクリプトは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 
    }) 

答えて

5

渡すデータを含むマップにペイロードパラメータを設定する必要があります。

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、それは迅速なラムダを使用する私のアプリケーションの1つからの悪いコピー貼り付けでした。私は今例からそれを削除しました。このアプリケーションでは、lambdaリクエストをViewControllerにプロパティとして格納しています。これにより、必要に応じて現在のリクエストをキャンセルできます。 –

+0

誰かが助けることができるなら、アンドロイドのために同じを見つける! –

2

ライアン・フィッツジェラルドの答えは私に、複数のコンパイル時にエラーが発生しますが、私は、このバージョンで成功を収めてきました:

まず、私がアクセス資格情報を使用して初期化機能を持っています。これは、実動コードで推奨される安全なアクセス方法ではありませんが、テストなどの目的では問題ありません。我々は以前のバージョンと同様のバージョンを提供することができ、残りについて

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 
    } 

:それはまた、あなたが記載されている定数を定義Constants.swiftファイルを前提としています。彼の例では「タスク」が使用されていないため、「タスクを許可」タスクを削除しました。さらに、私は、あなたがinvokeタスクの中でやっている可能性のあるいくつかのJSON解析の論理的な概要を含めました。最後に、私はcontinueWithBlock()に変更しました。 continueWithSuccessBlock()を使用すると、Amazon Lambdaがタイムアウト期間に達するとこのブロックに入りません。また、何か他のリクエストがうまくいかず、通常はここでこれらの状況を処理する必要があります。

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

Xcode 7.3のSwift 2.2で動作確認済みです。