我目前正在为 AWS lambda 尝试无服务器,我目前被困在策略方面,以便无服务器能够部署。我已经搜索了所需的必要策略,并找到了这个特定的策略
{
"Effect": "Allow",
"Action": [
"cloudformation:CreateStack",
"cloudformation:UpdateStack",
"cloudformation:DeleteStack"
],
"Resource": "arn:aws:cloudformation:*:*:stack/${project}*"
}
我是 aws 政策的新手,我对$(project)
部分感到好奇。我认为这将是一个变量。我的问题是该变量在哪里定义?
在您的示例中,${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 策略。这些方法要复杂得多,如果您希望自动化部署,这些方法是必不可少的。
参考: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#policy-vars-infotouse