CognitoIdentityCredentials无权执行:资源上的lambda:InvokeFunction

时间:2018-09-07 02:20:58

标签: ios swift aws-lambda aws-cognito

我正在尝试从iOS客户端调用lambda函数。我的代码如下:

要获取凭据,请在appDelegate中:

id

并在viewController上调用:

document.querySelector("input[name='firstname']")

它抛出此错误:

func application(_ application: UIApplication,
                 didFinishLaunchingWithOptions launchOptions:

    [UIApplicationLaunchOptionsKey: Any]?) -> Bool {


    // Uncomment to turn on logging, look for "Welcome to AWS!" to confirm success
    AWSDDLog.add(AWSDDTTYLogger.sharedInstance)
    AWSDDLog.sharedInstance.logLevel = .error


    // Instantiate AWSMobileClient to get AWS user credentials
    return AWSMobileClient.sharedInstance().interceptApplication(application, didFinishLaunchingWithOptions: launchOptions)

}

我还设置了此角色:

class ViewController: UIViewController {
let lambdaInvoker = AWSLambdaInvoker.default()
let jsonObject: [String: Any] = ["key1" : "value1",
                                 "key2" : 2 ,
                                 "key3" : [1, 2],
                                 "isError" : false]

@IBAction func button(_ sender: Any) {
    print("pressed")
    lambdaInvoker.invokeFunction("myTest", jsonObject: jsonObject)
        .continueWith(block: {(task:AWSTask<AnyObject>) -> Any? in
            if( task.error != nil) {
                print("Error: \(task.error!)")
                return nil
            }

            // Handle response in task.result
            if let JSONDictionary = task.result as? NSDictionary {
                print("Result: \(JSONDictionary)")
                print("resultKey: \(JSONDictionary["resultKey"])")
            }
            return nil
        })
}

我知道我需要为该资源添加权限才能调用该函数,但是我找不到在哪里或如何做!我将不胜感激...

1 个答案:

答案 0 :(得分:2)

好的,我不知道这是否对任何人都有用,但是我解决了这个问题。事实证明,首先要正确使用AWS开发工具包,您需要创建一个身份池。如您所见,我做了所有这些工作,并将池ID和区域添加到配置文件中。我想念的是,您还需要向身份池添加权限才能使用lambda服务。

因此,一旦创建了身份池,您将具有两个新角色,一个身份验证和一个取消身份验证。您应该转到IAM控制台,角色,找到有问题的角色(在我的情况下为unauth),然后将策略修改为类似以下内容:

{  


"Version":"2012-10-17",
   "Statement":[  
      {  
         "Effect":"Allow",
         "Action":[  
            "mobileanalytics:PutEvents",
            "cognito-sync:*"
         ],
         "Resource":[  
            "*"
         ]
      },
      {  
         "Effect":"Allow",
         "Action":[  
            "lambda:invokefunction"
         ],
         "Resource":[  
            "arn:aws:lambda:us-east-1:account-id:function:yourFunctionName"
         ]
      }
   ]
}

此后,您的资源应该能够调用lambda函数。

如果这不是最好的方法,请指出!!

编辑:

实际上有一个称为AWS Lambda Role的托管策略,可让您毫无问题地调用。