“发生错误: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 serviceRoleArniamRoleStatements 是互斥的。 serviceRoleArn 采用完整现有角色的 ARN,而 iamRoleStatements 使用提供的策略声明为您自动生成角色。当两者都提供时,serviceRoleArn 优先。

所以这里使用的是iamRoleStatements(因为serviceRoleArn拼错了)。

生成的资源名称确认:GraphQlDsUsersRole

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

【讨论】:

以上是关于“发生错误:GraphQlDsUsersRole - 策略中的语法错误。”使用 serverless-appsync-plugin 时的主要内容,如果未能解决你的问题,请参考以下文章