【问题标题】:AWS SAM YAML - Attach same policy multiple times, or multiple tables on same DynamoDB policyAWS SAM YAML - 多次附加相同的策略,或在相同的 DynamoDB 策略上附加多个表
【发布时间】:2020-03-02 18:06:54
【问题描述】:

无法让角色访问两个表。 template.yaml 的示例 YAML:

Resources:
  MyFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: path/to/something
      Handler: index.handler
      Runtime: nodejs10.x
      Events:
        Get:
          Type: Api
          Properties:
            RestApiId: !Ref MyApi
            Path: /path/to/other/thing
            Method: post
      Policies:
        DynamoDBCrudPolicy:
          TableName:
            table1
            table2

我需要这个函数才能在 table1 和 table2 上读/写,但这不起作用。我试过了:

- table1
- table2

但这也不起作用。也试过了:

Policies:
  - DynamoDBCrudPolicy:
    TableName:
      table1
  - DynamoDBCrudPolicy:
    TableName:
      table2

但这也会出错。我该如何正确地做到这一点?

【问题讨论】:

    标签: amazon-web-services aws-lambda yaml amazon-cloudformation aws-sam


    【解决方案1】:

    你有什么错误?看起来你错过了TableName 的缩进,试试这个:

    Policies:
     - DynamoDBCrudPolicy: 
         TableName: table1
     - DynamoDBCrudPolicy: 
         TableName: table2
    

    PS:我本可以将其写入评论,但代码格式不正确

    【讨论】:

    • 就是这样做的。我不是 YAML 专家。如果您编辑您的以将第一个“-DynamoDBCrudPolicy”一直对齐到左侧,我可以接受答案。所以基本上,我需要将“-”放在“策略”中的“P”下,然后我将“TableName:”行缩进 4 个空格,这样就可以了。
    【解决方案2】:

    我要做的是为您的 lambda 函数创建一个角色,如下所示:

    Resources:
      MyFunction:
        Type: AWS::Serverless::Function
        Properties:
          CodeUri: path/to/something
          Handler: index.handler
          Runtime: nodejs10.x
          Events:
            Get:
              Type: Api
              Properties:
                RestApiId: !Ref MyApi
                Path: /path/to/other/thing
                Method: post
          Role: !GetAtt MyDynamoDBRole.Arn
    

    然后将策略附加到该角色。像这样的:

      MyDynamoDBRole:    
        Type: AWS::IAM::Role
        Properties:
          Path: "/"
          Policies:
            -
              PolicyName: "myDynamoDBPolicy"
              PolicyDocument:
                Version: "2012-10-17"
                Statement:
                  -
                    Effect: "Allow"
                    Action:
                      - "dynamodb:BatchGetItem"
                      - "dynamodb:BatchWriteItem"
                      - "dynamodb:PutItem"
                      - "dynamodb:GetItem"
                      - "dynamodb:Scan"
                      - "dynamodb:Query"
                      - "dynamodb:UpdateItem"
                      - "dynamodb:UpdateTable"
                      - "dynamodb:GetRecords"
                    Resource: "arn:aws:dynamodb:us-east-1:123456789012:table/table1"
          AssumeRolePolicyDocument:
              Version: '2012-10-17'
              Statement:
              -
                Effect: Allow
                Principal:
                  Service:
                  - dynamodb.amazonaws.com
                Action: sts:AssumeRole
    

    请注意:您可能需要调整特定权限以适合您的用例,上面的代码只是一个示例,用于说明我建议的结构。

    【讨论】:

    • 如果我想创建角色也没关系;我只是尝试使用 SAM 中的预定义策略来做到这一点,因为 SAM 被称为能够使无服务器基础架构更容易推出。我想我正在寻找一种方法来做到这一点,而不必编写自己的策略,而只需使用“DynamoDBCrudPolicy”预定义策略。我只需要该函数能够访问 2 个表而不是 1 个,那么该策略有没有办法访问 2 个表,或者将策略附加两次?
    猜你喜欢
    • 2021-02-07
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 2022-01-19
    • 2015-08-04
    相关资源
    最近更新 更多