【问题标题】:How to user Fn::Join in serverless framework YAML?如何在无服务器框架 YAML 中使用 Fn::Join?
【发布时间】:2019-03-15 02:49:16
【问题描述】:

我在 Serverless.yaml 文件中有一个策略,如下所述。

    AppSyncDynamoDBPolicy:
      Type: AWS::IAM::ManagedPolicy
      Properties:
        Description: 'Managed policy' 
        Path: /appsync/
        PolicyDocument:
          Version: 2012-10-17
          Statement:
            - Effect: Allow
              Action: 
                - dynamodb:GetItem
                - dynamodb:PutItem
                - dynamodb:DeleteItem
                - dynamodb:UpdateItem
                - dynamodb:Query
                - dynamodb:Scan
                - dynamodb:BatchGetItem
                - dynamodb:BatchWriteItem
              Resource: 
                Fn::Join: 
                  - ""
                  - - Fn::GetAtt: [dslvehicleState, Arn]
                    - "*"

当 sls deploy 完成时,它会抛出如下所述的错误。

发生错误:AppSyncDynamoDBPolicy - 策略中的语法错误。 (服务:AmazonIdentityManagement;状态代码:400;错误代码: 格式错误的政策文件;请求编号: 166ba0b3-cc67-11e8-8f74-3339d857f829)。

我在这里错过了什么?

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation amazon-iam serverless-framework


    【解决方案1】:

    试试这个,使用Ref方法:

    AppSyncDynamoDBPolicy:
      Type: AWS::IAM::ManagedPolicy
      Properties:
        Description: 'Managed policy' 
        Path: /appsync/
        PolicyDocument:
          Version: 2012-10-17
          Statement:
            - Effect: Allow
              Action: 
                - dynamodb:GetItem
                - dynamodb:PutItem
                - dynamodb:DeleteItem
                - dynamodb:UpdateItem
                - dynamodb:Query
                - dynamodb:Scan
                - dynamodb:BatchGetItem
                - dynamodb:BatchWriteItem
              Resource: 
                Fn::Join: 
                  - ""
                  - - "Ref": "dslvehicleState"
                    - "*"
    

    【讨论】:

      【解决方案2】:
      AppSyncDynamoDBPolicy:
        Type: AWS::IAM::ManagedPolicy
        Properties:
          Description: 'Managed policy' 
          Path: /appsync/
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action: 
                  - dynamodb:GetItem
                  - dynamodb:PutItem
                  - dynamodb:DeleteItem
                  - dynamodb:UpdateItem
                  - dynamodb:Query
                  - dynamodb:Scan
                  - dynamodb:BatchGetItem
                  - dynamodb:BatchWriteItem
                Resource: !GetAtt "dslvehicleState.Arn"
      

      您可以阅读更多关于返回值here

      【讨论】:

      • 我认为我们不能在无服务器框架中使用 !GetAtt。因此这不会解决问题。 !GetAtt "dslvehicleState.Arn"
      • 您可以将资源替换为; !Sub "arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${dslvehicleState}" 其中“dslvehicleState” = 在您的 DynamoDB 资源中赋予 TableName 的值。
      【解决方案3】:

      检查并重试后,我发现srings应该使用''

      AppSyncDynamoDBPolicy:
        Type: AWS::IAM::ManagedPolicy
        Properties:
          Description: 'Managed policy' 
          Path: /appsync/
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              - Effect: Allow
                Action: 
                  - 'dynamodb:GetItem'
                  - 'dynamodb:PutItem'
                  - 'dynamodb:DeleteItem'
                  - 'dynamodb:UpdateItem'
                  - 'dynamodb:Query'
                  - 'dynamodb:Scan'
                  - 'dynamodb:BatchGetItem'
                  - 'dynamodb:BatchWriteItem'
                Resource: 
                  Fn::Join: 
                    - ""
                    - - Fn::GetAtt: [dslvehicleState, Arn]
                      - "*"
      

      更换以下设置后运行顺利

      版本:'2012-10-17' 行动: - 'dynamodb:GetItem' - 'dynamodb:PutItem' - 'dynamodb:DeleteItem' - 'dynamodb:UpdateItem' - 'dynamodb:查询' - 'dynamodb:扫描' - 'dynamodb:BatchGetItem' - 'dynamodb:BatchWriteItem'

      【讨论】:

        猜你喜欢
        • 2021-04-12
        • 2017-12-29
        • 2021-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        • 1970-01-01
        相关资源
        最近更新 更多