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 https://www.coveros.com/aws-snapshots-daily-backup/.

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.

X