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 表授予写入权限。
是的,您可以将条件添加到数据库写入策略中,这样只有当条件满足时,才会允许写入策略。
仅当环境处于暂存或开发状态时,您才创建表,您可以在策略上应用条件来检查表名称,然后应用写入策略。下面的例子
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)
| 归档时间: |
|
| 查看次数: |
1114 次 |
| 最近记录: |