amazon-web-services - “发生错误:GraphQlDsUsersRole - 策略中的语法错误。” 使用 serverless-appsync-plugin 时
问题描述
遵循教程,但更改了一些语义内容,我在部署时从无服务器中收到此错误:
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/*"
解决方案
抱歉迟了回应。不确定您是否找到了解决方案,但无论如何我都会回答,如果这对任何人都有帮助
我在这里注意到两件事:
serviceRoleARN
拼写错误。它应该是serviceRoleArn
serviceRoleArn
并且iamRoleStatements
是互斥的。serviceRoleArn
获取完整现有角色的 ARN,同时iamRoleStatements
使用提供的策略声明为您自动生成角色。当两者都提供时,serviceRoleArn
优先。
所以在这里,使用的是什么iamRoleStatements
(因为serviceRoleArn
拼写错误)。
生成的资源的名称确认:GraphQlDsUsersRole
至于为什么政策格式错误,这也是因为Resource
拼写错误。它必须是单数的(即使你传递一个数组)。
推荐阅读
- python - SQLAlchemy .all() 在使用 filter_by() 调用时不返回全部
- assembly - i386指令“div ah”没有意义吗?
- reactjs - 我需要将浏览器路由器一分为二
- javascript - 你如何在闪亮的 htmlwidget (jsoneditor) 上调用 javascript 方法?
- java - 如何在 JAVA 中将十进制值转换为 24 小时时间格式
- java - 循环内的 printf
- html - 我的图片在 github 页面和 netlify 中都没有加载到我的站点中
- microsoft-graph-api - Microsoft Graph API - Odata 筛选器
- python - 具有嵌套 for 循环、条件和累加器的列表理解
- javascript - 在 Vue.js 中渲染双花括号 {{ }} 内的元素