我正在做一个项目,用户可以将文件上传到一个S3桶中,这些上传的文件被映射到一个GraphQL密钥(这个键是由lambda生成的),并触发了一个aws函数。所有这些都是可行的,但是我想要的下一步是为aws函数创建一个具有相同所有权属性的第二个文件,并将保存的第二个文件的位置发布到GraphQL API中。
我认为这不应该太困难,但我有很大的困难,无法理解问题的所在。
BACKGROUND/DETAILS
我希望数据所有者(上传器)是唯一能够访问数据的用户,aws函数在管理角色中运行,并且能够发布/获取任何所有者的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>"]
}我将"“替换为我提供了广泛访问权限的IAM角色,包括这个appsync访问:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"appsync:*"
],
"Resource": "*"
}
]
}这是我的aws函数的角色。
当我尝试使用上述设置在aws函数中运行一个简单的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角色之外,我还传递上面的API键和API。我知道可能只需要一个,但我正在努力让这个过程开始工作,然后再削减它。
问题
据我所知,我是
根据我的目标向我的below)
但很明显,有些东西不起作用。有人能指出我忽视的问题吗?
发布于 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数据。
https://stackoverflow.com/questions/71889548
复制相似问题