How DeletionPolicy works differently with AWS resources and snapshots of AWS resources
Tags: s3, rds, cloudformation, aws
Published: 2023-01-05 23:47:36

In this article, I am going to show you how to keep the resources and the snapshots **alive** even after you delete the CloudFormation stacks.

By default, AWS CloudFormation deletes all stack resources, and the data that was stored in your stack (unless you take manual snapshots). For example, data stored in Amazon EC2 Volumes, Amazon RDS DBInstances, and Amazon Redshift Cluster resources.

But what if you want to retain your data for you may need your data to be migrated to another stack or you do not want anyone to delete your data unintentionally. In that case, you can specify a **`DeletionPolicy`** for that particular resource you want to retain, in your CloudFormation template. This will preserve your data even after your stack is deleted.

The behaviour of the **`DeletionPolicy is different with the resources and the resources with a snapshot`**. I am going to show you how for both the cases.

Please visit my **[GitHub Repository for RDS articles](https://github.com/awsmine/RDS_projects)** on various topics being updated on constant basis.

_**Let’s get started!**_

# 1. Resources with a `DeletionPolicy` (S3bucket)

- When you launch a CloudFormation stack with this template snippet, it creates an Amazon S3 bucket. 

- However when the stack is deleted, the CloudFormation will delete the stack and all the stack resources except for the S3 bucket. 

- You have to delete S3 bucket manually to avoid any costs being billed if you do not need that bucket for later use. 

- You can specify **`retain`** with any AWS resource with such a template.

## Objectives:

**1.** Create a AWS CloudFormation Sample Template File -
**`S3_Bucket_With_Retain_On_Delete.yaml`**

**2.** Create an AWS CloudFormation Stack **`mys3stack`** with that template file

**3.** Go to S3 Dashboard to see the bucket 

**4.** Delete the stack **`mys3stack`**

**5.** Check to see S3 bucket still retained 


## Pre-requisites:
- AWS user account with admin access, not a root account to AWS Management Console

## Resources Used:

[CloudFormation Documentation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)

## Steps for implementation to this project:

### 1. Create a AWS CloudFormation Sample Template File  

**`S3_Bucket_With_Retain_On_Delete.yaml`**

```
AWSTemplateFormatVersion: '2010-09-09'
Metadata: 
  License: Apache-2.0
Description: 'AWS CloudFormation Sample Template S3_Bucket_With_Retain_On_Delete: Sample template showing how to create a publicly accessible S3 bucket with a deletion policy of retain on delete. It will create an S3 bucket that will NOT be deleted when the stack is deleted. You have to delete the S3 bucket from the S3 dashboard after the Template is deleted in order to save costs.'
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      AccessControl: PublicRead
      WebsiteConfiguration:
        IndexDocument: index.html
        ErrorDocument: error.html
    DeletionPolicy: Retain
Outputs:
  WebsiteURL:
    Value: !GetAtt [S3Bucket, WebsiteURL]
    Description: URL for website hosted on S3
  S3BucketSecureURL:
    Value: !Join ['', ['https://', !GetAtt [S3Bucket, DomainName]]]
    Description: Name of S3 bucket to hold website content

```
### 2. Create an AWS CloudFormation Stack **`mys3stack`** with that template file

- On CloudFormation Dashboard / Create stack

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0pzwh1ixt83u0ldtjb1j.png)

- Create Stack / Specify template / Prerequisite - Prepare template / Check Upload a Template file / Upload **`S3_Bucket_With_Retain_On_Delete.yaml`**

**Next**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uxa78xsithlhncf5l2od.png)


- Specify stack details / Stack name /

**Stack name** - **`mys3stack`**

**Next**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/im858x6snshomdro2vjj.png)


- Take all the defaults, review the details for **mys3stack** and

**Submit**

### 3. Go to S3 Dashboard to see the bucket 

After the CloudFormation Stack is completed, Go to the S3 Dashboard to see the bucket 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d0ccbe34pdgicadmm4c8.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xkpgpjq8ac0dvf3jy443.png)


### 4. Delete the stack 

**`mys3stack`**

- From the CloudFormation Dashboard, Delete the stack **`mys3stack`**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8gl07o4u6k5o8uo07tsy.png)


### 5. Check to see S3 bucket still retained 

However S3 bucket is not deleted automatically, you have to delete it manually


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ax7ynzieqst95hrtz33i.png)




# 2. Resources with a snapshot `DeletionPolicy` (RDS DBInstance)

- When you launch a CloudFormation stack with this template snippet, it creates a RDS DBInstance and an Amazon S3 bucket. 

- However when the stack is deleted, the CloudFormation will create a snapshot of the RDS DBInstance and then deletes the stack and all the stack resources (RDS DBInstance) except for snapshot and the S3 bucket. 

- The name of the snapshot will include the stack name, the logical ID of the database instance, and other identifying information.

- You have to delete snapshot and S3 bucket manually to avoid any costs being billed if you do not need them for later use. 

- You can only create snapshots of resources that support snapshots, such as the AWS::EC2::Volume, AWS::RDS::DBInstance, and AWS::Redshift::Cluster resources with such a template.

## Objectives:

**1.** Create an AWS CloudFormation Sample Template File -
**`RDS_Snapshot_On_Delete.yaml`**

**2.** Create an AWS CloudFormation Stack **`myrdsstack`** with that template file  

**3.** Go to RDS Dashboard to see the RDS DBInstance and the snapshot

**4.** Go to S3 Dashboard to see the S3 bucket

**5.** Delete the stack **`myrdsstack`**

**6.** Check to see the snapshot still retained and delete it manually

**7.** Check to see the S3 bucket still retained and delete it manually


## Pre-requisites:
- AWS user account with admin access, not a root account to AWS Management Console

## Resources Used:

[CloudFormation Documentation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)

## Steps for implementation to this project:

### 1. Create an AWS CloudFormation Sample Template File  

**`RDS_Snapshot_On_Delete.yaml`**

```
AWSTemplateFormatVersion: '2010-09-09'
Metadata: 
  License: Apache-2.0
Description: 'AWS CloudFormation Sample Template RDS_Snapshot_On_Delete: Sample template
  showing how to create an RDS DBInstance and upon deletion keeps the snapshot alive from stack deletion. 
  You have to delete the snapshot manually to save costs.'
Resources:
  MyDB:
    Type: AWS::RDS::DBInstance
    Properties:
      DBName: MyDatabase
      AllocatedStorage: '5'
      DBInstanceClass: db.t2.small
      Engine: MySQL
      MasterUsername: myName
      MasterUserPassword: myPassword
    DeletionPolicy: Snapshot
Outputs:
  JDBCConnectionString:
    Description: JDBC connection string for the database
    Value: !Join ['', ['jdbc:mysql://', !GetAtt [MyDB, Endpoint.Address], ':', !GetAtt [
          MyDB, Endpoint.Port], /MyDatabase]]
```

### 2. Create an AWS CloudFormation Stack **`myrdsstack`** with that template file 

- On CloudFormation Dashboard / Create stack

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0pzwh1ixt83u0ldtjb1j.png)

- Create Stack / Specify template / Prerequisite - Prepare template / Check Upload a Template file / Upload **`RDS_Snapshot_On_Delete.yaml`**

**Next**

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4jrd14dfkylc62n0q0w7.png)


- Specify stack details / Stack name /

**Stack name** - **`myrdsstack`**

**Next**


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xgp4z8nqqjdjde5myoax.png)


Take all the defaults, review the details for **myrdsstack** and

**Submit**


- It takes 4-5 min to create a RDS Database Instance and the snapshot

### 3. Go to RDS Dashboard to see the RDS DBInstance and the snapshot

- After the CloudFormation Stack is completed, Go to the RDS Dashboard to see the instance and the snapshot 

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x3augfb4oaxajbk0b3zp.png)



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/73d9emc1l9wisltxwmuq.png)



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/50idyv7l8bs8nx06544b.png)


### 4. Go to S3 Dashboard to see the S3 bucket

- It will also create a s3 bucket, because when I have uploaded a template file, it will create a S3 URL where it is stored

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1r8waz4jofcng7lo41tu.png)


### 5. Delete the stack **`myrdsstack`**

- From the CloudFormation Dashboard, delete the **`myrdsstack`** 

- You have to wait 4-5 min to see it's completion.

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ol96p6ev3bw3y18klmbj.png)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i1xj9ncbub5nz6041r6k.png)


### 6. Check to see the snapshot still retained and delete it manually


However, RDS Instance is deleted automatically. The snapshot is still alive, you have to delete it manually


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/50idyv7l8bs8nx06544b.png)


### 7. Check to see the S3 bucket still retained and delete it manually

S3 bucket also should be deleted manually

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1r8waz4jofcng7lo41tu.png)


## Cleanup

- Delete the CloudFormation stacks

- Delete S3 Bucket

- Delete RDS DBInstance

- Delete Snapshot


## What we have done so far

Demonstrated how a **`DeletionPolicy`** behaves differently with AWS resources and AWS resources with a snapshot. It is a great way to preserve your data after a CloudFormation stack is deleted.