CognitoIdentityCredentials не авторизован для выполнения: lambda: InvokeFunction на ресурсе - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь вызвать лямбда-функцию из клиента iOS. Мой код выглядит так:

Чтобы получить учетные данные, в appDelegate:

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)

}

И для вызова на viewController:

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

Выдает эту ошибку:

... Message=User: arn:aws:sts::103314601078:assumed-role/Cognito_testpoolUnauth_Role/CognitoIdentityCredentials is not authorized to perform: lambda:InvokeFunction on resource ...

У меня также есть эта роль:

{
"roleName": "myRoleTest",
  "policies": [
    {
      "document": {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Sid": "Stmt1464440182000",
            "Effect": "Allow",
            "Action": [
              "lambda:InvokeAsync",
              "lambda:InvokeFunction"
            ],
            "Resource": [
              "*"
            ]
          }
        ]
      }

Я знаю, что мне нужно добавить разрешения для этого ресурса для вызова функции, но я не могу найти, где и как это сделать! Буду признателен за любую помощь ...

1 Ответ

0 голосов
/ 07 сентября 2018

Хорошо, я не знаю, будет ли это кому-нибудь полезно, но я решил проблему. Оказывается, для правильного использования AWS SDK сначала необходимо создать пул удостоверений. Я сделал все это, как вы можете видеть, и добавил идентификатор пула и регион в файл конфигурации. Что я пропустил, так это то, что вам также нужно добавить разрешения в пул удостоверений для использования лямбда-сервисов.

Итак, после создания пула удостоверений у вас появятся две новые роли: одна с аутентификацией и одна с другой. Вы должны перейти к консоли 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"
         ]
      }
   ]
}

После этого ваш ресурс должен иметь возможность вызывать лямбда-функцию.

Если это не лучший способ, укажите это!

EDIT:

На самом деле существует управляемая политика, называемая лямбда-ролью AWS, которая позволяет без проблем выполнять вызовы.

...