web-dev-qa-db-ja.com

AWS Cognitoを使用してログインしようとすると、カスタムLambdaトリガーに関するAccessDeniedExceptionが発生します

私はadminInitiateAuthを呼び出して、自分のラムダに対して奇妙なAccessDeniedExceptionを返しています。

これが私が呼んでいるコードです:

      var params = {
        AuthFlow: "ADMIN_NO_SRP_AUTH",
        ClientId: "@cognito_client_id@",
        UserPoolId: "@cognito_pool_id@",
        AuthParameters: {
          USERNAME : username,
          PASSWORD : tempPassword
        },
      };
      cognitoIdentityServiceProvider.adminInitiateAuth(params, function(error, data) {
        if (error) {
          console.log("ERROR! Login failed: " + JSON.stringify(error), error.stack);
        } else {
          console.log("Login sent back: " + JSON.stringify(data));
        }
      });

私が得ているエラーメッセージは次のとおりです。

ERROR! Login failed: {"message":"arn:aws:lambda:us-east-1:201473124518:function:main-devryan-users_onCognitoLogin failed with error AccessDeniedException.","code":"UnexpectedLambdaException","time":"2017-02-25T18:54:15.109Z","requestId":"ce42833f-fb8b-11e6-929b-2f78b63faa12","statusCode":400,"retryable":false,"retryDelay":1.0853444458916783} UnexpectedLambdaException: arn:aws:lambda:us-east-1:201473124518:function:main-devryan-users_onCognitoLogin failed with error AccessDeniedException.

このエラーが発生する理由を誰かが知っていますか?

23

これは、API Gateway&Lambdasを(サーバーレスを使用して)再作成し、コンソールを介してトリガーとして追加されたときに、Cognitoコンソールが所定のLambda関数に接続するためのアクセス許可をこっそり追加したことが原因で発生していました。


CloudFormation/serverless.ymlファイルでこれを修正するには

resources:
  Resources:
    OnCognitoSignupPermission:
      Type: 'AWS::Lambda::Permission'
      Properties:
        Action: "lambda:InvokeFunction"
        FunctionName:
          Fn::GetAtt: [ "UsersUnderscoreonCognitoSignupLambdaFunction", "Arn"]
        Principal: "cognito-idp.amazonaws.com"
        SourceArn:
          Fn::Join: [ "", [ "arn:aws:cognito-idp", ":", Ref: "AWS::Region", ":", Ref: "AWS::AccountId", ":", "userpool/", "@cognito_pool_id@" ] ]

AWSコンソールでこれを修正するには

  • Cognitoコンソールに移動します
  • ユーザープールを選択してください
  • 「トリガー」に移動
  • カスタムトリガーを削除し([なし]に設定)、[保存]をクリックします
  • リセットして、もう一度[保存]をクリックしてください

これが 興味深いAmazonフォーラムの投稿 で、正しい方向に進みました。

40

CloudFormationを介してCognitoユーザープールでLambdaを構成しようとしたことを除いて、私はあなたと同様の問題がありました。

Ryanが投稿したリンクには、誰かが投稿したコードサンプルがありました。つまり、Cognitoはラムダ関数を呼び出すための適切な権限が必要でした。

MyLambdaInvocationPermission:
  Type: AWS::Lambda::Permission
  Properties:
    Action: lambda:InvokeFunction
    FunctionName: !GetAtt MyLambdaFunctionName.Arn
    Principal: cognito-idp.amazonaws.com
    SourceArn: !GetAtt MyCognitoUserPoolName.Arn
24
shanewwarren

ラムダロールから権限を追加できます(コグニト用のポリシーを作成し、ラムダロールに追加します)。これは私がそれにこだわったときに私の問題を解決します

0
satej sarker

cloudformationスタックの作成中に-私はのようなエラーが発生しました

User:arn:aws::12345678:user/xyz is not authorized to perform:
cognito-idp:CreateUserPool on resource:*(Service:AWSCognitoIdentityProviderService;
Status Code: 400; Error Code: AccessDeniedException;Request ID: xxxxx)

回避策:

  • ロールバック状態にあるスタックに進みました->イベントをチェックして、(作成に失敗した)アクセス権のないいくつかのロールを確認できました、
  • そのため、割り当てられたIAMポリシーを確認しました。アクセス権がありませんでした。
  • 新しいポリシーを作成し、それをAWSからインポートして、インラインポリシーとして自分に割り当てました。

    aws-cognito-idp

    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Cognito-IDP",
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction",
                "cognito-idp:*"
            ],
            "Resource": "*"
        }
    ]
}

注:リソースおよびcognito-idpユーザーへのアクセスを制限できます。

これで-モジュールのcloudformation Stackを作成してデプロイすることに成功しました。

0
DHEERAJ