I was recently on a project which required my team and I to implement a comprehensive backup scheme involving an AWS (Amazon Web Services) Windows 2012 R2 server. Critical data stored on this server had to be available at all times. My team and I decided to approach the backup task by creating snapshots of the volume that was associated with the server on a daily basis. This task was automated. The blog regarding the automation of the snapshots can be found at .
In addition to the daily snapshots in AWS, we needed another backup strategy which would allow us to restore the data if AWS ever goes down. The chances of AWS going down are low; however, we wanted to be prepared if the event did occur. In order to address the issue, the team and I decided that we would compress two folders: one that held critical company data files and another that contained the ISO image of the Windows Server. We would then transfer them to a server outside of AWS on a daily basis. We decided that the task of zipping and transferring these folders should be automated as it was repetitive. Therefore, the following scripts were used in combination to accomplish the task:
Zip.vbs
Option Explicit
Dim ObjArgs
Set ObjArgs = Wscript.Arguments
IF (ObjArgs.Count <> 3) Then
Wscript.echo "The number of arguments should be three"
Wscript.echo "Options : "
Wscript.echo "For Zipping -"
Wscript.echo "cscript Zip.vbs C [path_to_folder] [path_to_zip_file] "
Wscript.echo "For Unzipping -"
Wscript.echo "cscript Zip.vbs E [path_to_zip_archive] [path_to _extract]"
Wscript.quit
End IF
Select Case ObjArgs(0)
Case "C","c"
Zipper ObjArgs(1), ObjArgs(2)
Case "E","e"
Unzipper ObjArgs(1), ObjArgs(2)
Case Else
Wscript.echo "No match found"
Wscript.echo "Options : "
Wscript.echo "For Zipping -"
Wscript.echo "cscript Zip.vbs C [path_to_folder] [path_to_zip_file] "
Wscript.echo "For Unzipping -"
Wscript.echo "cscript Zip.vbs E [path_to_zip_archive] [path_to _extract]"
End Select
'
' Zipping Function
'
Function Zipper(SrcF, DestF)
Dim fsys
set fsys = Wscript.CreateObject("Scripting.FileSystemObject")
IF Not (fsys.FolderExists(SrcF)) then
Wscript.echo "Source folder could not be found so please check the path again"
Exit Function
End IF
IF (fsys.FileExists(DestF)) then
Wscript.echo " Zip file already exists"
fsys.DeleteFile DestF
Wscript.echo " Zip file deleted successfully."
End IF
' create an empty zip file
CreateObject("Scripting.FileSystemObject").CreateTextFile(DestF, True).Write "PK" & chr(5) & chr(6) & String(18, 0)
dim objshell, src, des
Set objshell = CreateObject("Shell.Application")
Set src = objshell.NameSpace(SrcF)
Set des = objshell.NameSpace(DestF)
des.CopyHere(src.Items)
Do Until des.Items.Count = src.Items.Count
Wscript.Sleep(200)
Loop
Wscript.echo "Successfully zipped"
Set fsys = Nothing
Set objshell = Nothing
Set src = Nothing
Set des = Nothing
End Function
'
' Unzipping Function
'
Function Unzipper(zipF, extrF)
Dim fsys
set fsys = Wscript.CreateObject("Scripting.FileSystemObject")
IF Not (fsys.FileExists(zipF)) Then
Wscript.echo "Could not find the zip archive so please check the path again."
Exit Function
End IF
IF Not (fsys.FolderExists(extrF)) Then
Wscript.echo "Could not locate the folder to extract"
fsys.CreateFolder(extrF)
Wscript.echo "Folder created successFully."
End IF
Dim objshell, zip, extr
Set objshell = CreateObject("Shell.Application")
Set zip = objshell.NameSpace(zipF)
Set extr = objshell.NameSpace(extrF)
extr.CopyHere(zip.Items)
Do Until extr.Items.Count = zip.Items.Count
Wscript.Sleep(200)
Loop
Wscript.echo "SuccessFully extracted.!!"
Set fsys = Nothing
Set objshell = Nothing
Set zip = Nothing
Set extr = Nothing
End Function
ZipCompanyFile.bat
@echo off
echo *************Zipping Company File***********
CScript C:\Users\Administrator\Desktop\scripts\Zip.vbs C C:\MY_FOLDER C:\Users\Administrator\Desktop\zipFiles\MY_FOLDER.zip
echo *************Zipping is done***********
ZipIso.bat
@echo off
echo *************Zipping ISO Image*************
CScript C:\Users\Administrator\Desktop\scripts\Zip.vbs C D:\ISO_IMAGE C:\Users\Administrator\Desktop\zipFiles\ISO_IMAGE.zip
echo *************Zipping is done***********
FTPTransfer.txt
open ftpes://username:password@ip_address/
put C:\Users\Administrator\Desktop\zipFiles\MY_FOLDER.zip /CoverosQBBackup/MY_FOLDER.zip
put C:\Users\Administrator\Desktop\zipFiles\ISO_IMAGE.zip /CoverosQBBackup/ISO_IMAGE.zip
exit
FTPScript.bat
C:\Program^ Files\WinSCP\WinSCP.exe /script=C:\Users\Administrator\Desktop\scripts\FTPTransfer.txt
Collectively, these 5 scripts zip the two folders and transfer them to an external server. All of these scripts were tied to the Windows Task Scheduler to run at specified times. The first script that ran was the ZipCompanyFile.bat and 2 minutes after that script finished executing, the ZipIso.bat script was scheduled to run. Both of these batch files called Zip.vbs which compressed the specified source folders to the specified destination folders. After both of the folders were zipped appropriately, the FTPscript.bat and FTPTransfer.txt files came into play. The FTPScript.bat starts the WinSCP program (a free and open source FTP and SFTP client for the Windows platform) and feeds it the script “FTPTransfer.txt.” .The FTPTransfer.txt script first tells WinSCP to establish a connection with the server by providing the username, password and the IP address of the server. After a connection is successfully established, both of the zipped folders are transferred onto the server and the connection to the server is closed.
In case there is ever an issue with AWS, our backup strategy gives us the ability to restore in a timely manner. The two folders that are transferred to the external server can both be used for restoration purposes. Restoring from the zipped folder which contains the critical data files would be faster than restoring from the ISO image as all you have to do is copy the contents of that folder onto a new server and unzip it. This restoration method should be sufficient in most cases. However, if it is necessary to do a complete restoration of the entire system, one can restore from the ISO image of the server. We tested both of the solutions thoroughly by standing up Coveros-owned physical servers. In the first case, we copied the directory that contained the critical company data onto a physical server outside of AWS and unzipped it. To test the restoration from the ISO image, we stood up another physical server and restored the operating system from the ISO file. In both of these tests, we configured the Quickbooks software on the server to imitate the server in AWS. The tests were successful as the Quickbooks software performed similarly to the way it did when the server lived in AWS. This backup strategy gives us full confidence in our ability to proceed with our daily operations if any issues arise as the restoration has been tested fully.