Amazon web services 从Lambda函数访问Congito授权的AppSync API

Amazon web services 从Lambda函数访问Congito授权的AppSync API,amazon-web-services,aws-lambda,amazon-cognito,aws-appsync,Amazon Web Services,Aws Lambda,Amazon Cognito,Aws Appsync,我想从Lambda函数调用AppSync API上的突变,以响应外部事件。现在,如果我将AppSync设置为使用IAM授权,然后以Lambda函数的角色提供访问权限,我就能够做到这一点。问题是我需要使用Cognito授权,因为我需要在我的许多解析器模板中访问Cognito用户名,而我不知道在使用IAM授权时有什么方法可以做到这一点 因此,我想知道是否有任何方法可以使用Cognito用户池授权Lambda函数调用我的AppSync端点。显然,我可以在我的池中创建一个虚拟用户,并简单地在Lambda

我想从Lambda函数调用AppSync API上的突变,以响应外部事件。现在,如果我将AppSync设置为使用IAM授权,然后以Lambda函数的角色提供访问权限,我就能够做到这一点。问题是我需要使用Cognito授权,因为我需要在我的许多解析器模板中访问Cognito用户名,而我不知道在使用IAM授权时有什么方法可以做到这一点

因此,我想知道是否有任何方法可以使用Cognito用户池授权Lambda函数调用我的AppSync端点。显然,我可以在我的池中创建一个虚拟用户,并简单地在Lambda中使用它登录,但是Cognito用户池登录是一个非常缓慢的过程,而且这种方法听起来无论如何都是错误的。我想从Lambdas调用的突变不需要任何Cognito信息


如果在使用IAM授权时我有办法访问解析器模板中的Cognito用户名,也可以解决我的问题。

@Gerharddc,如果您尝试添加允许未经身份验证访问您的Cognito标识池的策略,该怎么办

我有一段代码,它定义了对我的身份池的经过身份验证和未经身份验证的访问(您可以在我的个人资料中查看完整代码)

当我声明我的AWS AppSync模板时,我添加了此模板,允许用户在登录时访问我的AppSync端点:

AppSyncIAMPolicy:
    Type: AWS::IAM::Policy
    Description: Allow user consume AppSync when signed in
    DependsOn: AppSyncGraphQLApi
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - appsync:GraphQL
            Resource:
              - !Join ['/', [!GetAtt AppSyncGraphQLApi.Arn, '*']]
      PolicyName: !Sub ${StackName}-appsync-iam-policy
      Roles:
        - !Sub ${IdentityPoolAuthorizedIAMRoleRef}
我的观点是:您可以附加一个允许用户
未签名
(未经身份验证)访问AppSync的策略。相反,
-!Sub${IdentityPoolAuthorizedIAMRoleRef}
您可以在上面的模板中,尝试
-!Sub${identitypool unauthorizediamrolef}

当然,您可以指定允许未经验证的访问的内容,例如:

AppSyncIAMPolicy:
    Type: AWS::IAM::Policy
    Description: Allow user consume AppSync when NOT signed in
    DependsOn: AppSyncGraphQLApi
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - appsync:GraphQL
            Resource:
              - arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/<Field-1>
              - arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/<Field-2>
      PolicyName: !Sub ${StackName}-appsync-iam-policy-unauthenticated
      Roles:
        - !Sub ${IdentityPoolUnauthorizedIAMRoleRef}
AppSyncIAMPolicy:
类型:AWS::IAM::策略
描述:允许用户在未登录时使用AppSync
DependsOn:AppSyncGraphQLApi
特性:
政策文件:
版本:2012-10-17
声明:
-效果:允许
行动:
-appsync:GraphQL
资源:
-arn:aws:appsync:us-west-2:123456789012:api/yourgraphqlapid/types/Query/fields/
-arn:aws:appsync:us-west-2:123456789012:api/yourgraphqlapid/types/Query/fields/
保单名称:!Sub${StackName}-appsync iam策略未经身份验证
角色:
- !Sub${IdentityPool UnauthorizeDiamrolef}

使用用户池作为身份验证机制,在某些情况下,如果不登录,就无法获取令牌以通过AWS AppSync进行授权。话虽如此,您可以稍微减少这方面的开销。最终,它归结为您在问题中提出的建议,使用“假用户”。这不是一个少见的解决方案,它涉及到一些管理员级别的用户,这些用户的凭据只能从这个Lambda访问

首先,出于延迟原因,我建议您不要使用传统的SRP登录。一种替代方法是使用AdminInitiateAuth/ADMIN_NO_SRP_AUTH,在池中打开ADMIN_NO_SRP_AUTH的情况下,将SRP计算的开销从Lambda转移到Cognito后端。我从您的另一个问题()中看到,您正在考虑这样做,但是需要指出的是,这只是用于登录用户的不同API。您可以在此处阅读更多信息:

另一种选择是自定义身份验证流。上面的同一链接有更多关于如何实现这一点的详细信息,但简而言之,您可以建立一个更快的流程,以满足您添加的任何特定需求


为了进一步提高开销,您可以在一定程度上缓存这些令牌。这可能只是意味着将其保存在Lambda中的内存中,并在使用它们之前检查它们的有效性/到期日,甚至附加远程缓存机制。

我可能没有正确理解它,但您的解决方案是否不是指使用IAM身份验证的情况(因为涉及身份池)?我在这个项目中使用了
AuthenticationType:AWS_IAM
。是的,但正如我在问题中提到的,我在使用AWS_IAM时从Lambdas访问API没有问题,我的问题是在使用AMAZON_COGNITO_USER_pool时访问API。我想澄清一下,你是不是在询问使用COGNITO用户池访问调用AppSync的Lambda,或者你是想在Lambda中使用Cognito用户池来调用AppSync吗?@JeffBailey我想使用Lambda调用AppSync API,并进行用户池身份验证,但最好不要在Lambda中进行普通用户池登录。
AppSyncIAMPolicy:
    Type: AWS::IAM::Policy
    Description: Allow user consume AppSync when NOT signed in
    DependsOn: AppSyncGraphQLApi
    Properties:
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Action:
              - appsync:GraphQL
            Resource:
              - arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/<Field-1>
              - arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/<Field-2>
      PolicyName: !Sub ${StackName}-appsync-iam-policy-unauthenticated
      Roles:
        - !Sub ${IdentityPoolUnauthorizedIAMRoleRef}