简体   繁体   中英

Cloudformation: The resource you requested does not exist

I have a cloudformation stack which has a Lambda function that is mapped as a trigger to an SQS queue.

What happened was that I had to delete the mapping and create it again manually cos I wanted to change the batch size . Now when I want to update the mapping the cloudformation throws an error with The resource you requested does not exist. message.

The resource mapping code looks like this:

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

I know that I've deleted the mapping cloudformation created initially and added it manually which is causing the issue. How do I fix this? Cos I cannot push any update now.

Please help

What you did, from my perspective, it is a mistake. When you use Cloud Formation you are not suppose to apply changes manually. You can, and maybe that's fine since one may don't care about the stack once is created. But since you are trying to update the stack, this tells me that you want to keep the stack and update it on a time basis.

To narrow down your problem, first let make clear that the manually-created mapping is out of sync with your cloud formation stack. So, from a cloud formation perspective, it doesn't matter if you keep that mapping or not. I'm wondering, what would happen if you keep the manually-created mapping and create a new from Cloud Formation? Maybe it will complain, since you would have repeated mappings for the same pair of (lambda,queue). Try this:

  1. Create a change for your stack, where you completely remove the EventSourceMapping resource from your script. This step is to basically clean loosing references. Apply the change set.
  2. Then, and this is where I think you may get some kind of issue, add back again EventSourceMapping to your stack.

If you get errors in the step 2, like "this mapping already exists", you will have to remove the manually-created mapping from the console. And then try again step 2.

You probably know now that you should not have removed the resource manually. If you change the CF, you can update it without changing resources which did not change in CF. You can try to replace the resource with the exact same physical name https://aws.amazon.com/premiumsupport/knowledge-center/failing-stack-updates-deleted/ The other option is to remove the resource from CF, update, and then add it back and update again - from the same doc.

While comments above are valid, I found it interesting, that no one mentioned much simpler option: using SAM commands ( sam build / sam deploy ). It's understandable that during the development process and designing the architecture, there might be flaws and situations where manual input in the console is necessary, therefore there's something I reference to every time I have similar issue.

  1. Simply comment out the chunk of code that is creating troubles, run sam build/deploy on top of it, CloudFormation stack will recognize that the resource no longer in the template and will delete it.
  2. Now, since the resource is no longer in the architecture anyway(removed manually prior), it will have no issues passing the step and successfully updating the stack.
  3. Then simply uncomment, make any necessary changes (if any) and deploy.

Works every time.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM