首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法授予aws-lambda对aws-appsync API的访问权限。

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

Stack Overflow用户
提问于 2022-04-15 22:37:47
回答 1查看 494关注 0票数 1

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

我认为这不应该太困难,但我有很大的困难,无法理解问题的所在。

BACKGROUND/DETAILS

我希望数据所有者(上传器)是唯一能够访问数据的用户,aws函数在管理角色中运行,并且能够发布/获取任何所有者的API。

GraphQL模式如下所示:

代码语言:javascript
复制
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文件并用

代码语言:javascript
复制
{
  "adminRoleNames": ["<YOUR_IAM_ROLE_NAME>"]
}

我将"“替换为我提供了广泛访问权限的IAM角色,包括这个appsync访问:

代码语言:javascript
复制
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "appsync:*"
            ],
            "Resource": "*"
        }
    ]
}

这是我的aws函数的角色。

当我尝试使用上述设置在aws函数中运行一个简单的API查询时,我会得到以下错误:

代码语言:javascript
复制
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脚本是

代码语言:javascript
复制
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角色之外,我还传递上面的API键和API。我知道可能只需要一个,但我正在努力让这个过程开始工作,然后再削减它。

问题

据我所知,我是

根据我的目标向我的below)

  • giving模式提供适当的@auth规则,并且(2
  1. -lambda函数通过IAM角色和API键)足够的IAM授权来覆盖模式的任何潜在的限制性@auth规则。

但很明显,有些东西不起作用。有人能指出我忽视的问题吗?

EN

回答 1

Stack Overflow用户

发布于 2022-04-17 09:51:03

我昨天也遇到了类似的问题。这不是你想要做的事情,但也许它还是有帮助的。

因此,我试图授予lambda函数基于我的graphql模式访问数据的权限。模式有不同的@auth指令,这导致lambda函数不再访问数据。尽管我通过cli和IAM角色给了他们权限。尽管文档中说这应该有效,但它没有:

如果您在

项目中通过扩容更新函数授予Lambda函数对GraphQL API的访问权限,则允许Lambda函数的IAM执行角色列表以满足对查询、突变和订阅类型授予的权限。因此,这些函数具有基于IAM策略的特殊访问权限,而不是任何特定的@auth规则。

因此,我最终将@auth(rules: [{ allow: custom }])添加到我希望通过lambda函数访问的架构的所有部分。

在执行此操作时,请确保通过amplify update api将"lambda“作为auth模式添加到api中。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71889548

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档