我目前正在为AWS lambda尝试无服务器,并且我目前停留在策略方面,以便能够无服务器地进行部署。我搜索了所需的必要政策,并找到了该特定政策
{
"Effect": "Allow",
"Action": [
"cloudformation:CreateStack",
"cloudformation:UpdateStack",
"cloudformation:DeleteStack"
],
"Resource": "arn:aws:cloudformation:*:*:stack/${project}*"
}
我对AWS政策并不陌生,并且对$(project)
部分感到好奇。我认为那将是一个变量。我的问题是该变量在哪里定义?
答案 0 :(得分:0)
在您的示例中, $ {project} 用作占位符,代表您需要通过硬编码静态堆栈名称或硬编码堆栈来提供的特定CloudFormation堆栈名称。名称加上通配符。
"Resource": "arn:aws:cloudformation:*:*:stack/foo"
"Resource": "arn:aws:cloudformation:*:*:stack/foo*"
第一个示例只是一个名为 foo 的静态堆栈名称,并且只会授予您具有确切名称 的CloudFormation堆栈的Lambda权限。
第二个示例表示任何以 foo 开头并可选以其他名称结尾的堆栈名称,例如 foo-05 , foobar , foo-tastic 或简单的 foo 。通配符为Lambda提供了更大的灵活性,使其具有许可的Cloudformation堆栈。
IAM策略支持预定义的变量,例如 $ {aws:username} , $ {aws:CurrentTime} 和 $ {aws:SourceIp} ,但它们不会自定义变量,例如 $(project} 。谁写的示例策略应该将堆栈名称表示为 或其他名称,以避免混淆这样。
一些额外的信息:
如果您想深入研究,实际上可以使用自定义变量对IAM策略进行参数化设置,但这需要您使用AWS CloudFormation或第三方工具(如Ansible)部署IAM策略。这些方法要复杂得多,如果您希望自动化部署,则必不可少。