32

I have an S3 bucket as a 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 the same bucket again, with an error message complaining that it already exists.

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"
              }
          }
Max
  • 105
  • 3
vartec
  • 6,137
  • 2
  • 32
  • 49
  • 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
  • AWS apparently added the ability to import existing resources recently. Not quite sure how it works or if it will be useful in this case but here's the link: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import.html – Tim Ludwinski Jan 15 '20 at 20:29

3 Answers3

15

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.

Eric Hammond
  • 10,901
  • 34
  • 56
  • 4
    +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 07 '14 at 14:01
  • 1
    There should be a way, if not: How does "CloudFormer" works? – jgomo3 Apr 04 '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.

djmitche
  • 247
  • 2
  • 6
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.