繁体   English   中英

无法授予 aws-lambda 对 aws-appsync API 的访问权限

[英]Cannot give aws-lambda access to aws-appsync API

我正在开发一个用户可以将文件上传到 S3 存储桶的项目,这些上传的文件映射到 GraphQL 密钥(由 Amplify CLI 生成),并触发 aws-lambda function。 所有这些都有效,但我想要的下一步是为此 aws-lambda function 创建具有相同所有权属性的第二个文件并将保存的第二个文件的位置发布到 GraphQL API。

我认为这应该不会太难,但我遇到了很多困难,无法理解问题出在哪里。

背景/细节

我希望数据的所有者(上传者)是唯一能够访问数据的用户,aws-lambda function 以管理员角色运行,并且能够 POST/GET 到任何所有者的 API。

GraphQL 架构如下所示:

type FileUpload @model 
@auth(rules: [
  { allow: owner}]) {
  id: ID!
  foo: String
  bar: String
}

我还发现了这个看似很有前途的 AWS 指南,我认为它会给 IAM 角色管理员访问权限( https://docs.amplify.aws/cli/graphql/authorization-rules/#configure-custom-identity-and-group- claims ),然后我创建了文件amplify/backend/api/<your-api-name>/custom-roles.json并将其保存为

{
  "adminRoleNames": ["<YOUR_IAM_ROLE_NAME>"]
}

我将“<YOUR_IAM_ROLE_NAME>”替换为我已授予广泛访问权限的 IAM 角色,包括此 appsync 访问权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "appsync:*"
            ],
            "Resource": "*"
        }
    ]
}

哪个是给我aws-lambda function的角色。

当我尝试使用上述设置在我的 aws-lambda function 中运行一个简单的 API 查询时,出现此错误

response string:  
{
    "data": {
        "getFileUpload": null
    },
    "errors": [
        {
            "path": [
                "getFileUpload"
            ],
            "data": null,
            "errorType": "Unauthorized",
            "errorInfo": null,
            "locations": [
                {
                    "line": 3,
                    "column": 11,
                    "sourceName": null
                }
            ],
            "message": "Not Authorized to access getFileUpload on type Query"
        }
    ]
}

我的实际 python lambda 脚本是

import http
API_URL = '<MY_API_URL>'
API_KEY = '<>MY_API_KEY'
HOST = API_URL.replace('https://','').replace('/graphql','')

def queryAPI():
    conn = http.client.HTTPSConnection(HOST, 443)
    headers = {
        'Content-type': 'application/graphql', 
        'x-api-key': API_KEY,
        'host': HOST
    }

    print('conn: ', conn)
    
    query = '''
            {
          getFileUpload(id: "<ID_HERE>") {
            description
            createdAt
            baseFilePath
          }
        }
    '''
    graphql_query = {
        'query': query
    }
    query_data = json.dumps(graphql_query)
    print('query data: ', query_data)
    conn.request('POST', '/graphql', query_data, headers)
    response = conn.getresponse()
    response_string = response.read().decode('utf-8')
    print('response string: ', response_string)

除了赋予 AWS-lambda IAM 角色外,我还传递了上面的 API 密钥和 API URL。 我知道可能只需要一个,但我正在尝试让流程正常运行然后将其缩减。

问题)

据我了解,我是

  1. 根据我的目标和(以下 2)向我的 GraphQL 模式提供适当的@auth 规则
  2. 给我的 aws-lambda function 足够的 IAM 授权(通过 IAM 角色和 API 密钥)覆盖我的 GraphQL 模式的任何潜在限制性@auth 规则

但显然有些东西不起作用。 谁能指出我忽略的问题?

就在昨天,我遇到了类似的问题。 这不是您要尝试做的 1:1,但也许它仍然有帮助。

所以我试图根据我的 graphql 模式授予 lambda 函数访问数据的权限。 该架构具有不同的 @auth 指令,这导致 lambda 函数无法再访问数据。 即使我通过 cli 和 IAM 角色授予他们权限。 尽管文档说这应该有效,但它没有:

如果您通过放大更新 function 授予 Amplify 项目中的 Lambda function 访问 GraphQL API 的权限,则 Lambda 函数的 IAM 执行角色被允许列出并授予查询权限。 因此,这些函数具有特殊的访问权限,其范围基于其 IAM 策略而不是任何特定的 @auth 规则。

所以我最终将@auth(rules: [{ allow: custom }])添加到我想通过 lambda 函数访问的模式的所有部分。

执行此操作时,请确保通过amplify update api

在身份验证 lambda function 中,您可以检查调用 function 的用户是否有权访问请求的查询/S3 数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM