【发布时间】:2022-08-12 05:10:30
【问题描述】:
我正在使用放大堆栈,需要对我的 graphql api 执行一些操作,它后面有 dynamodb。我的 lambda 函数中的请求返回未经授权的错误:“未授权访问类型 SourceSync 的 getSourceSync”,其中 getSourceSync 是 gql 查询,SourceSync 是模型名称。
我的这个特定模型的 schema.graphql 设置如下。注意 auth 规则允许私有提供程序 iam:
type SourceSync @model (subscriptions: { level: off }) @auth(rules: [
{allow: private, provider: iam}
{allow: groups, groups: [\"Admins\"], provider: userPools},
{allow: groups, groups: [\"Users\"], operations: [create], provider: userPools},
{allow: groups, groupsField: \"readGroups\", operations: [create, read], provider: userPools},
{allow: groups, groupsField: \"editGroups\", provider: userPools}]) {
id: ID! @primaryKey
name: String
settings_id: ID @index(name: \"bySettingsId\", queryField: \"sourceSyncBySettingsId\")
settings: Settings @hasOne(fields: [\"settings_id\"])
childLookup: String
createdAt: AWSDateTime!
updatedAt: AWSDateTime!
_createdBy: String
_lastChangedBy: String
_localChanges: AWSJSON
readGroups: [String]
editGroups: [String]
}
我的 lambda 函数的角色附加了以下内联策略。 (出于安全目的,本文省略了实际 ID 值):
{
\"Version\": \"2012-10-17\",
\"Statement\": [
{
\"Action\": [
\"appsync:GraphQL\"
],
\"Resource\": [
\"arn:aws:appsync:us-east-1:111myaccountID:apis/11mygraphqlapiID/*\"
],
\"Effect\": \"Allow\"
},
{
\"Action\": [
\"appsync:GetType\"
],
\"Resource\": [
\"*\"
],
\"Effect\": \"Allow\"
}
]
}
最后,我的 lambda 函数通过一个简单的查询测试设置如下:
/* stuff */
\"use strict\";
const axios = require(\"axios\");
const awsAppSync = require(\"aws-appsync\").default;
const gql = require(\"graphql-tag\");
require(\"cross-fetch/polyfill\");
const { PassThrough } = require(\"stream\");
const aws = require(\"aws-sdk\");
aws.config.update({
region: process.env.AWS_REGION,
});
const appSync = new aws.AppSync();
const graphqlClient = new awsAppSync({
url: process.env.API_GRAPHQLAPIENDPOINTOUTPUT,
region: process.env.AWS_REGION,
auth: {
type: \"AWS_IAM\",
credentials: aws.config.credentials,
},
disableOffline: true
});
exports.handler = async (event, context) => {
console.log(\'context :: \'+JSON.stringify(context));
console.log(\'aws config :: \'+JSON.stringify(aws.config));
const sourceSyncTypes = await appSync
.getType({
apiId: process.env.API_GRAPHQLAPIIDOUTPUT,
format: \"JSON\",
typeName: \"SourceSync\",
})
.promise();
console.log(\'ss = \'+JSON.stringify(sourceSyncTypes));
try {
const qs = gql`query GetSourceSync {
getSourceSync(id: \"ov3\") {
id
name
}
}`;
const res = await graphqlClient.query({query: qs, fetchPolicy: \'no-cache\'});
console.log(JSON.stringify(res));
}
catch(e) {
console.log(\'ERR :: \'+e);
console.log(JSON.stringify(e));
}
};
-
你找到问题了吗?
-
@lionbigcat 是的,发布了答案。
标签: amazon-web-services aws-lambda aws-appsync appsync-apollo-client