首页 > 解决方案 > “发生错误: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/*"

标签: amazon-web-servicesgraphqlamazon-iamserverless-frameworkaws-appsync

解决方案


抱歉迟了回应。不确定您是否找到了解决方案,但无论如何我都会回答,如果这对任何人都有帮助

我在这里注意到两件事:

  • serviceRoleARN拼写错误。它应该是serviceRoleArn
  • serviceRoleArn并且iamRoleStatements是互斥的。serviceRoleArn获取完整现有角色的 ARN,同时iamRoleStatements使用提供的策略声明为您自动生成角色。当两者都提供时,serviceRoleArn优先。

所以在这里,使用的是什么iamRoleStatements(因为serviceRoleArn拼写错误)。

生成的资源的名称确认:GraphQlDsUsersRole

至于为什么政策格式错误,这也是因为Resource拼写错误。它必须是单数的(即使你传递一个数组)。


推荐阅读