自定义资源 cloudformation 的堆栈策略

Posted

技术标签:

【中文标题】自定义资源 cloudformation 的堆栈策略【英文标题】:Stack policy for custom resources cloudformation 【发布时间】:2021-03-09 14:55:51 【问题描述】:

我已经定义了这样的 cloudformation 模板:

AWSTemplateFormatVersion: 2010-09-09
Description: Auth stack
Transform: AWS::Serverless-2016-10-31

Parameters:
  DeveloperProviderName:
    Description: Developer provider name
    Type: String

Conditions:
  Never:
    !Equals [ "true", "false" ]

Resources:
  CognitoIdentityPool:
    Type: Custom::CognitoIdentityPool
    Version: '1.0'
    Properties:
      IdentityPoolName: !Sub "$AWS::StackName-cognito-idp"
      DeveloperProviderName: !Ref DeveloperProviderName
      ServiceToken: !GetAtt CreateIdentityPoolFunction.Arn

.
.
more stuff here for the lambda function etc
.
.

那我想加个栈策略,拒绝replace和delete:


  "Statement": [
    
      "Effect": "Allow",
      "Action": "Update:*",
      "Principal": "*",
      "Resource": "*"
    ,
    
      "Effect": "Deny",
      "Action": [
        "Update:Replace",
        "Update:Delete"
      ],
      "Principal": "*",
      "Resource": "*",
      "Condition": 
        "StringEquals": 
          "ResourceType": [
            "Custom::CognitoIdentityPool"
          ]
        
      
    
  ]

这就是我设置堆栈策略的方式:

aws cloudformation set-stack-policy \
    --stack-name $stackName \
    --stack-policy-body file://$policyPath 

这是我在设置堆栈策略时遇到的错误:

An error occurred (ValidationError) when calling the SetStackPolicy operation: Error validating stack policy: Unknown resource type 'Custom::CognitoIdentityPool' in statement 

任何想法如何使用堆栈策略保护这些自定义资源?

【问题讨论】:

【参考方案1】:

我认为您不能使用自定义资源。 AWS docs:

指定策略适用的the resource type。要指定特定资源的逻辑 ID,请使用 Resource 元素。

其中“资源类型”是 AWS 提供的资源类型之一。

【讨论】:

据我所知没有解决办法。 @StavrosZavrakas 它的自定义资源,因此您可以对其进行编程以忽略任何删除或更新。但除此之外,我不知道有什么更好的解决方案。

以上是关于自定义资源 cloudformation 的堆栈策略的主要内容,如果未能解决你的问题,请参考以下文章

无服务器错误,当自定义命名资源需要替换时,CloudFormation 无法更新堆栈

无法通过自定义 cloudformation 资源调用 lambda 函数

从 lambda 函数中检索 cloudformation 堆栈名称

创建没有资源的 CloudFormation 堆栈

将现有 AWS 资源整合到 CloudFormation 堆栈中

描述嵌套 CloudFormation 堆栈资源的正确方法是啥?