AWS SAM - 对有条件创建的资源应用策略模板

Ami*_*ibi 5 aws-lambda aws-serverless aws-sam

我有条件地创建 DynamoDb 表:

 MyDynamoTable:
    Type: AWS::DynamoDB::Table
    Condition: IsDevAccount
Run Code Online (Sandbox Code Playgroud)

这是IsDevAccount使用输入参数定义的方式:

Conditions:
  IsDevAccount: !Equals [ !Ref Stage, dev ]
Run Code Online (Sandbox Code Playgroud)

现在,我正在创建一个 Lambda 函数,该函数通过环境变量接受表名称(以及其他内容)作为输入。这也是有条件的。在函数的代码中,我将检查是否传递了表名(如果不满足条件则传递空)。如果是这样,我会在里面放一些东西。

但是,我不确定如何有条件地将策略模板应用于函数的角色。通常我会这样做:

MyFunction:
    Type: AWS::Serverless::Function
    Properties:
       Policies:
       - DynamoDBWritePolicy:
          TableName: !Ref MyDynamoTable
Run Code Online (Sandbox Code Playgroud)

如果由于不满足条件而未创建表(例如:在另一个帐户中),函数的执行角色会发生什么情况?我也可以有条件地应用此策略模板吗?

我不想做的是盲目地向帐户内的所有 DynamoDB 表授予写入权限。

dee*_*s27 1

是的,您可以将条件添加到数据库写入策略中,这样只有当条件满足时,才会允许写入策略。

仅当环境处于暂存或开发状态时,您才创建表,您可以在策略上应用条件来检查表名称,然后应用写入策略。下面的例子

MyDynamoTable:
    Type: AWS::DynamoDB::Table
    Condition: IsDevAccount

Conditions:
  IsDevAccount: !Equals [ !Ref Stage, dev ]
       
MyFunction:
    Type: AWS::Serverless::Function
    Properties:
       Policies:
       - DynamoDBWritePolicy:
          Condition: !Equals [ !Ref MyDynamoTable, "myTableName" ],
          TableName: !Ref MyDynamoTable
Run Code Online (Sandbox Code Playgroud)

针对评论更新:

!Ref 返回指定参数或资源的值。我们需要具有环境允许值和条件 DBtable 的参数。

Parameters:
    Environment:
        Type: String
        Default: dev
        AllowedValues:
          - dev
          - stage
          - prod 

  MyDynamoTable: 
    Description: table name for the db
    Type: String
    AllowedValues:
       - tableOne
       - tableTwo
       - myTableName

 Conditions:
      IsDevAccount: !Equals [ !Ref Environment, "dev" ]
      TableExists:  !Equals [ !Ref MyDynamoTable, "myTableName" ]

MyFunction:
    Type: AWS::Serverless::Function
    Properties:
       Policies:
       - DynamoDBWritePolicy:
          Condition: !And [IsDevAccount, TableExists] // Only with TableExists condition, it'll work fine with the added parameters
          TableName: !Ref MyDynamoTable
Run Code Online (Sandbox Code Playgroud)

参考:- https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/parameters-section-struct.html

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/conditions-section-struct.html

更新2:

同意,我研究并确认,无法检查在同一堆栈模板中创建的资源(这就是建议参数的原因)。条件都是基于参数的

但是,如果资源已在其他堆栈中创建,您可以通过Resource import来执行此操作。我不认为资源导入对您的需求有帮助。

但是,解决方法是为TableExists条件提供布尔参数,并可以在运行时通过 AWS CLI 传递值,如下所示:

MyDynamoTable: 
    Description: dynamo db table
    Type: String
    AllowedValues:
       - true
       - false
       
 Conditions:
      TableExists:  !Equals [ !Ref MyDynamoTable, "true" ]

 MyFunction:
    Type: AWS::Serverless::Function
    Properties:
       Policies:
       - DynamoDBWritePolicy:
          Condition: !Ref TableExists 
          TableName: !Ref MyDynamoTable
Run Code Online (Sandbox Code Playgroud)

部署时的 AWS CLI 传递所需参数

aws cloudformation deploy --template templateName.yml --parameter-overrides MyDynamoTable="true" dynamoDBtableName="myTableName" (any parameter required)
Run Code Online (Sandbox Code Playgroud)