30

I've have S3 bucket as resource in my CloudFormation template. With DeletionPolicy set to Retain. This works as expected, when deleting the stack, it does indeed retain the bucket. However, when I attempt to create the stack again, creation fails while attempting to create same bucket again, with error message complaining that it already exist.

What do I need to add to my CloudFormation template to make it not try recreating a resource which already exist?

Relevant fragment of my template is as follows:

  "Resources": {
    "SomeS3Bucket" : {
      "Type" : "AWS::S3::Bucket",
      "DeletionPolicy" : "Retain",
      "Properties": {
          "BucketName": "SomeS3Bucket"
          }
      }
  • out of interest, what's the bucket used for? Maybe there's another way around it depending on what you're trying to do. – Drew Khoury Apr 23 '14 at 10:09
14

One approach is to add an input parameter to the CloudFormation template to indicate that an existing bucket should be used.

Use Condition clauses in the template to create the bucket only if the parameter indicates it is needed.

  • 3
    +1 as so far this is the only way I've seen. Not marking it as answer though, because I'm really looking at a way to automate that. – vartec Apr 7 '14 at 14:01
  • 1
    There should be a way, if not: How does "CloudFormer" works? – jgomo3 Apr 4 '18 at 19:14
7

CloudFormation uses tags with the "aws:" prefix to keep track of what resources are associated with what entries in which stacks -- that's the "live" state it uses to compare with a template before deciding what to add/delete/update.

As a user, you can't add, edit, or delete such tags.

So if your existing resources don't have these tags, or don't have the correct values for those tags, then they aren't considered part of the new stack, and I don't see a way to change that.

2

I am trying to automate this too, as it seems it cannot be done just with Cloudformation template. The process I am thinking of would:

  1. create another temporary bucket temp-$originalbucketname
  2. copy all the content there bucket-to-bucket to save time
  3. remove all the content from $originalbucketname
  4. remove $originalbucketname now that it is empty
  5. create the Cloudformation stack (which will recreate the bucket)
  6. copy the content back
  7. remove temp-$originalbucketname

That's a very involved process, depending on the bucket size it could easily take hours as most of the steps are O(n) with the number of keys.

You would think Cloudformation is the basic layer of AWS automation, but I think it's just a (pretty limited) monster pulling together byzantine APIs for all their services.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.