“发生错误:GraphQlDsUsersRole - 策略中的语法错误。”使用 serverless-appsync-plugin 时
Posted
技术标签:
【中文标题】“发生错误:GraphQlDsUsersRole - 策略中的语法错误。”使用 serverless-appsync-plugin 时【英文标题】:"An error occurred: GraphQlDsUsersRole - Syntax errors in policy." when using serverless-appsync-plugin 【发布时间】:2021-02-18 19:45:49 【问题描述】:按照教程,但更改了一些语义内容,我在部署时从无服务器中收到此错误:
An error occurred: GraphQlDsUsersRole - Syntax errors in policy. (Service: AmazonIdentityManagement; Status Code: 400; Error Code: MalformedPolicyDocument; Request ID: 4b486514-e57d-4828-9edc-f9150d8806b4; Proxy: null).
在我的目录上进行搜索,这个角色似乎是自动生成到 .serverless 文件中的。这是如何生成的,我能做些什么来搞砸它?
我的 serverless.yml 文件:
service: graphql-api
plugins:
- serverless-appsync-plugin
- serverless-pseudo-parameters
package:
exclude:
- node_modules/**
- ./node_modules/**
provider:
name: aws
runtime: nodejs12.x
region: us-east-1
custom:
stage: dev
appSync:
name: $self:service-$self:custom.stage
authenticationType: API_KEY
mappingTemplates:
- dataSource: Users
type: Query
field: getUsers
request: 'getUsers-request-mapping-template.txt'
response: 'getUsers-response-mapping-template.txt'
schema: schema.graphql
dataSources:
- type: AMAZON_DYNAMODB
name: Users
description: User Table
config:
tableName: Ref: UserTable
serviceRoleARN: Fn::GetAtt: [AppSyncDynamoDBServiceRole, Arn]
iamRoleStatements:
- Effect: Allow
Action:
- 'dynamodb:*'
Resources:
- 'arn:aws:dynamodb:$self:provider.region:#AWS::AccountId:table/Users'
- 'arn:aws:dynamodb:$self:provider.region:#AWS::AccountId:table/Users/*'
resources:
- $file(resources/roles.yml)
- $file(resources/dynamodb.yml)
我的角色.yml 文件:
AppSyncDynamoDBServiceRole:
Type: "AWS::IAM::Role"
Properties:
RoleName: "Dynamo-$self:service-Role"
AssumeRolePolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Principal:
Service:
- "appsync.amazonaws.com"
- "dynamodb.amazonaws.com"
Action:
- "sts:AssumeRole"
Policies:
- PolicyName: "Dynamo-$self:service-Policy"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action:
- "dynamodb:Query"
- "dynamodb:BatchWriteItem"
- "dynamodb:GetItem"
- "dynamodb:DeleteItem"
- "dynamodb:PutItem"
- "dynamodb:Scan"
- "dynamodb:UpdateItem"
Resource:
- "arn:aws:dynamodb:$self:provider.region:#AWS::AccountId:table/Users"
- "arn:aws:dynamodb:$self:provider.region:#AWS::AccountId:table/Users/*"
【问题讨论】:
【参考方案1】:抱歉,回复晚了。不确定您是否找到了解决方案,但如果对任何人有帮助,我还是会回答
我在这里注意到两件事:
serviceRoleARN
拼写错误。应该是serviceRoleArn
serviceRoleArn
和 iamRoleStatements
是互斥的。 serviceRoleArn
采用完整现有角色的 ARN,而 iamRoleStatements
使用提供的策略声明为您自动生成角色。当两者都提供时,serviceRoleArn
优先。
所以这里使用的是iamRoleStatements
(因为serviceRoleArn
拼错了)。
生成的资源名称确认:GraphQlDsUsersRole
至于为什么政策格式错误,这是因为Resource
也拼错了。
它必须是单数的(即使你传递一个数组)。
【讨论】:
以上是关于“发生错误:GraphQlDsUsersRole - 策略中的语法错误。”使用 serverless-appsync-plugin 时的主要内容,如果未能解决你的问题,请参考以下文章