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



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

我想这应该不太难,但我遇到了很多困难,不明白问题出在哪里。

背景/详细信息

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

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-自定义身份和组声明),然后创建文件amplify/backend/api/<your-api-name>/custom-roles.json并用保存

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

我替换了"<YOUR_IAM_ROLE_NAME>quot;具有IAM角色,我已授予该角色广泛的访问权限,包括此appsync访问权限:

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

这是我的aws lambda函数的角色。

当我试图用上面的设置在aws-lambda函数中运行一个简单的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函数提供足够的IAM授权(通过IAM角色和API密钥),以覆盖GraphQL模式的任何潜在限制性@auth规则

但显然有些东西不起作用。有人能给我指出一个我忽略的问题吗?

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

因此,我试图授予lambda函数访问基于我的graphql模式的数据的权限。该架构具有不同的@auth指令,这导致lambda函数无法再访问数据。尽管我通过cli和IAM角色授予了他们权限。尽管文件上说这应该有效,但事实并非如此:

如果您通过放大更新函数授予Amplify项目中的Lambda函数对GraphQL API的访问权限,则Lambda函数的IAM执行角色将被允许登录以遵守对查询、突变和订阅类型授予的权限。因此,这些函数具有特殊的访问权限,其作用域基于其IAM策略,而不是任何特定的@auth规则。

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

执行此操作时,请确保添加";λ";作为身份验证模式通过amplify update api发送到您的api。

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

最新更新