gpt4 book ai didi

if-statement - 无服务器框架 - 在静态 iam 资源 ARN 和资源部分的引用之间进行选择

转载 作者:行者123 更新时间:2023-12-03 07:40:07 26 4
gpt4 key购买 nike

我正在使用无服务器框架来部署 lambda,以及 lambda 访问的可选发电机数据库表。

在开发阶段,sls 将表创建为成熟的资源(因此我可以引用该表)

或者,在生产阶段 sls 不会创建表,但自定义变量知道预创建表的 ARN

在制作 lambda 的 iam 策略文档的 Resource 子句时遇到问题,可能是因为我不理解 Cloudformation IF 语句和 sls 动态变量之间允许的混合。据我所知(缩写):

provider:
... unrelated stuff
iam:
role:
statements:
- Effect: 'Allow'
Action:
- dynamodb:DescribeTable
- ..more DynDB permissions
Resource:
- !If [ ${self:custom.slsMadeTheTable}, Fn::GetAtt:[MyDynDBTable, Arn], ${self:custom.staticArnOfPrecreatedTable} ]

地点:

${self:custom.slsMadeTheTable} 引用自定义变量中的 bool 值字符串,定义 sls 是否创建表(因此获取其引用并在资源中使用它)(因此使用已知的静态 Arn)

${self:custom.staticArnOfPrecreatedTable} 是一个自定义变量,其值为预创建的 DDB 表的文字 ARN 字符串

在此特定配置中,我收到语法错误,表明我错误地将 Cloudformation if 与 sls 表达式组合在一起。

Cannot parse "serverless.yml": missed comma between flow collection entries in "../serverless.yml" (64:22)


64 | - !If [ ${self:custom.slsMadeTheTable}, Fn::Ge ...
---------------------------^

尝试了许多其他变体,但没有成功。

寻求帮助制定策略,该策略将根据确定变量(当然与阶段相关)处理创建的 DDB 表或预创建的表 ARN

--- 另一个失败的方法 ---

资源很乐意接受自定义变量中的 ARN 字符串,例如

Resource: ${self:custom.productionTableArn}

所以你会认为一个简单的默认表达式就可以解决问题,就像

Resource:
${self:custom.devTableArn,
self:custom.productionTableArn}

其中 self:custom.devTableArn 包含创建的 DDB 表的内容。

但是对 sls ddb 表 arn: "Fn::GetAtt": [ TunesTable, Arn ] 的引用作为资源的直接条目工作得很好,但在设置为值时失败对于 self:custom.devTableArn:

devTableArn: "Fn::GetAtt": [ TunesTable, Arn ]

错误:

Cannot parse "serverless.yml": bad indentation of a mapping entry in "/home/rpc/tune-library-tunes/serverless.yml" (24:28)
24 | devTableArn: "Fn::GetAtt": [ TunesTable, Arn ]

最佳答案

问题的关键在于认识到 SLS,正如人们常说的,主要是 CloudFormation (CFN) 的包装器。比我想象的还要多。 CFN 脚本在 CFN 部署期间执行,而不是 SLS 解释。

因此,DynDB SLS 资源和自定义表达式之间的任何关联纯粹是语法上的。在我们的 IAM 资源中插入 "Fn::GetAtt": [ TunesTable, Arn ] 不在 SLS 中识别 TuneTable 的上下文中,它不会计算和替换,它字面上将字符串粘贴到CFN模板中,以便稍后执行(无论好坏)。

知道将问题范围缩小到“CFN 中的哪些表达式可以工作以及 SLS 可以生成它们”,这导致了 https://www.npmjs.com/package/serverless-plugin-ifelse 的插件解决方案。我希望该功能包含在未来的基本 SLS 版本中(但语法更简单)。

关于if-statement - 无服务器框架 - 在静态 iam 资源 ARN 和资源部分的引用之间进行选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71120452/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com