如何在serverless.yml中引用二级索引?

3

我对CloudFormation中的引用或变量的工作原理非常不清楚。

目前,我在serverless.yml中的iAmRole如下:

  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:DescribeTable
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      # Restrict our IAM role permissions to
      # the specific table for the stage
      Resource:
        - "Fn::GetAtt": [ ReportsTable, Arn ]

ReportsTable 是在另一个文件中创建的表,它看起来像这样:

Resources:
  ReportsTable:
    Type: AWS::DynamoDB::Table
    Properties:
    ...
    LocalSecondaryIndexes:
        - IndexName: typeId-accessToken-index
          KeySchema:
          - AttributeName: typeId
            KeyType: HASH
            ...etc

我知道Fn::GetAtt数组中的第二个值是引用属性名,但我不明白Arn是从哪里来的。它看起来像一个变量,但它在任何地方都没有定义。

最终,我需要添加另一个Effect、Action、Resource块,引用我创建的本地二级索引,但我不知道从哪里开始。

编辑:看起来Arn来自于dynamoDB表返回的值(https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html)

编辑2:好吧,现在我有了格式为arn:aws:dynamodb:region:account-id:table/table-name/index/*的值,参考permissions reference docs,正在测试。


arn:aws:dynamodb:region:account-id:table/table-name/index/* 是正确的引用。现在我需要弄清楚如何动态地引用表名,就像上面所做的那样。可能还需要想办法引用我的账户ID和区域而不是硬编码。 - colemars
2个回答

6
您可以使用Cloudformation内置函数Sub来创建索引arn。
!Sub '${ReportsTable.Arn}/index/*'

0
在参考这些文档之后:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-dynamodb-table.html)和https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/api-permissions-reference.html,我能够找出引用索引表所需的格式为arn:aws:dynamodb:region:account-id:table/table-name/index/*
此外,为了不硬编码所有值(在我的情况下,因为我有几个分段环境),可以这样做一个连接。
        Fn::Join:
          - ''
          -
            - 'arn:aws:dynamodb:'
            - Ref: AWS::Region
            - ':'
            - Ref: AWS::AccountId
            - ':table/'
            - ${self:custom.tableName}/
            - 'index/*'

表名在您的自定义块中定义。


请注意,除非您对Join组件进行操作或导入它们,否则通常可以使用Sub而不是Join,这样可以使代码更易于阅读:!Sub arn:aws:dynamodb:${AWS::Region}:${AWS::AccountId}:table/${self:custom.tableName}/index/* - 404

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接