CloudFormation:您请求的资源不存在。

4

我有一个CloudFormation堆栈,其中包含将Lambda函数映射为SQS队列触发器的功能。

发生的情况是,因为我想要更改批处理大小,所以我不得不手动删除映射并重新创建它。现在,当我想要更新映射时,CloudFormation会抛出带有“您请求的资源不存在”消息的错误。

资源映射代码如下:

"EventSourceMapping":{
        "Properties":{
            "BatchSize":5,
            "Enabled":"true",
            "EventSourceArn":{
                "Fn::GetAtt":[
                    "ProcessorQueue",
                    "Arn"
                ]
            },
            "FunctionName":{
                "Fn::GetAtt":[
                    "ProcessorLambda",
                    "Arn"
                ]
            }
        },
        "Type":"AWS::Lambda::EventSourceMapping"
    }

我知道我删除了 CloudFormation 最初创建的映射,并手动添加了它,导致出现问题。 我该如何解决? 因为现在我无法推送任何更新。

请帮忙。


最简单的方法是删除您卡住的内容,然后重新创建。 - Marcin
是的,但可惜我负担不起这样做。如果有解决方法,将不胜感激。 - Red Bottle
2
“EventSourceMapping”不支持导入,因此您无法将手动创建的映射导入到堆栈中。我不确定这是否有效,但也许您可以尝试从模板中注释掉映射,更新您的堆栈以便cfn删除映射(它已经不存在了),然后取消注释映射并再次更新,这可能会重新创建新的映射?您可以先在其他虚拟堆栈上尝试一下。 - Marcin
那样做确实管用。有人提供了该解决方案。还是非常感谢您的帮助。 - Red Bottle
3个回答

15

从我的角度来看,你的做法是一个错误。当你使用Cloud Formation时,不应该手动应用更改。虽然你可以这样做,也许这是可以接受的,因为一旦创建了堆栈,就可能不再关心它。但是,由于你试图更新堆栈,这告诉我你想保留这个堆栈并在时间上进行更新。

为了缩小问题范围,首先让我们明确一点:手动创建的映射与你的Cloud Formation堆栈不同步。因此,从Cloud Formation的角度来看,保留该映射是否无所谓。我想知道,如果你保留手动创建的映射并从Cloud Formation中创建一个新的映射,会发生什么情况?也许会出现错误,因为你会有相同的(lambda,queue)对的重复映射。请尝试以下操作:

  1. 为堆栈创建一个更改,完全从脚本中删除EventSourceMapping资源。这一步基本上是为了清除失去的引用,应用更改集。
  2. 然后,在这一步骤中,我认为你可能会遇到某种问题,将EventSourceMapping重新添加到你的堆栈中。

如果你在第2步中遇到错误,比如“该映射已经存在”,那么你将需要从控制台中删除手动创建的映射。然后再次尝试第2步。


这确实起作用了。但是我们希望在CloudFormation上有更多的暴力控制。无论如何,非常感谢。 - Red Bottle

2

0

虽然上面的评论都是正确的,但我发现一个更简单的选项:使用SAM命令(sam build/sam deploy)。在开发过程和设计架构时可能会出现缺陷和需要手动输入控制台的情况,因此每次遇到类似问题时,我都会参考一些东西。

  1. 只需注释掉创建麻烦的代码块,在其上运行sam build/deploy,CloudFormation堆栈将识别模板中不再存在的资源并将其删除。
  2. 现在,由于该资源已经从架构中移除(之前手动删除),因此它将没有任何问题通过此步骤并成功更新堆栈。
  3. 然后只需取消注释,进行必要的更改(如果有的话)并部署即可。

每次都有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接