AWSOlderSnapShots.ps1

<#PSScriptInfo
 
    .VERSION 1.1
 
    .GUID cb0bb5f9-c1b1-467e-a297-5e498944a5e4
 
    .AUTHOR Vikas Sukhija
 
    .COMPANYNAME TechWizard.cloud
 
    .COPYRIGHT Vikas Sukhija
 
    .TAGS
 
    .LICENSEURI https://techwizard.cloud/
 
    .PROJECTURI https://techwizard.cloud/
 
    .ICONURI
 
    .EXTERNALMODULEDEPENDENCIES
 
    .REQUIREDSCRIPTS
 
    .EXTERNALSCRIPTDEPENDENCIES
 
    .RELEASENOTES https://techwizard.cloud/
 
 
    .PRIVATEDATA
    ===========================================================================
    Created with: ISE
    Created on: 4/18/2023 1:46 PM
    Created by: Vikas Sukhija
    Organization:
    Filename: AWSOlderSnapShots.ps1
    ===========================================================================
 
#>


<#
 
    .DESCRIPTION
    This solution will extract rport on older snapshots
 
#>
 
param()
#################logs and variables##########################
$log = Write-Log -Name "AWSOlderSnapShots" -folder "logs" -Ext "log"
$Failedaccountslog = Write-Log -Name "FailedAccounts" -folder "logs" -Ext "log"
$Report = Write-Log -Name "AWSOlderSnapShots" -folder "Report" -Ext "csv"
$logrecyclelimit = "60"
$3monthsAgo = (Get-Date).AddDays(-90)

$email1 =  "Vikas@labtest.com"
##################Admin params##########################
$smtpserver = "smtpserver"
$erroremail = "reports@labtest.com"
$from = "DoNotRespond@labtest.com"
######################Spo Cet Auth#########################
$AccessKey = "Access Key"
$SecretKey = "Secret Key"
#########################################################################
try
{
  Write-Log -message "Start ......... Script" -path $log
  Import-Module AWSPowershell
  Set-DefaultAWSRegion -Region us-east-1
  Set-AWSCredentials -AccessKey $AccessKey -SecretKey $SecretKey
  $Creds = (Use-STSRole -RoleArn "arn:aws:iam::123456789:role/Aws-Access-role" -RoleSessionName "assume_role_session").Credentials
  Write-Log -message "Loaded All Modules" -path $log
  Set-AWSCredential -AccessKey $Creds.AccessKeyId -SecretKey $Creds.SecretAccessKey -SessionToken $Creds.SessionToken
}
catch
{
  $exception = $_.Exception.Message
  Write-Log -message "exception $exception has occured loading modules - AWSOlderSnapShots" -path $log -Severity Error
  Send-MailMessage -SmtpServer $smtpserver -From $from -To $erroremail -Subject "Error - AWSOlderSnapShots" -Body $($_.Exception.Message)
  break;
}
#############################GEt all Accounts################################################
try
{
  Write-Log -message "Fetch all ORg Accounts" -path $log
  $allawsaccounts = Get-ORGAccountList | where{ $_.Status -eq "ACTIVE"}
  Write-Log -message "Fetch all ORg Regions" -path $log
  $regions = Get-EC2Region
  Write-Log -message "Total Accounts - $($allawsaccounts.count)" -path $log
}
catch
{
  $exception = $_.Exception.Message
  Write-Log -message "exception $exception has occured loading Accounts - AWSOlderSnapShots" -path $log -Severity Error
  Send-MailMessage -SmtpServer $smtpserver -From $from -To $erroremail -Subject "Error - AWSOlderSnapShots" -Body $($_.Exception.Message)
  break;
}

#################################get inventory################################################>
$collinventory = New-Object System.Collections.ArrayList
foreach($awsAccount in $allawsaccounts)
{
  $error.clear()
  $accoundid = $Accountname = $null
  $accoundid  = $awsAccount.Id
  $Accountname = $awsAccount.Name
  if($accoundid -eq  '987654321'){
  Set-AWSCredentials -AccessKey $AccessKey -SecretKey $SecretKey
  $Creds = Get-AWSCredential
  }
  elseif($accoundid -eq  '123456789'){
  Set-AWSCredentials -AccessKey $AccessKey -SecretKey $SecretKey
  $Creds = (Use-STSRole -RoleArn "arn:aws:iam::123456789:role/Aws-Access-role" -RoleSessionName "assume_role_session").Credentials
  }
  else{
  Set-AWSCredentials -AccessKey $AccessKey -SecretKey $SecretKey
  $Creds = (Use-STSRole -RoleArn "arn:aws:iam::123456789:role/Aws-Access-role" -RoleSessionName "assume_role_session").Credentials
  Set-AWSCredential -AccessKey $Creds.AccessKeyId -SecretKey $Creds.SecretAccessKey -SessionToken $Creds.SessionToken
  $Creds = (Use-STSRole -RoleArn $("arn:aws:iam::$accoundid" + ":role/Aws-Access-role") -RoleSessionName "assume_role_session_1").Credentials
  }
  if($error)
  {
    Write-Log -message "------Error on Account - $accoundid------" -path $Failedaccountslog -Severity Warning
    $error.clear()
  }
  else
  {
    Write-Log -message "Success - $accoundid" -path $log
    foreach($region in $regions)
    {
      $error.clear()
      $SnapshotsinRegion = $null
      $filter = New-Object Amazon.EC2.Model.Filter
      $filter.Name = 'tag-key'
      $filter.Value.Add('Name')
      $SnapshotsinRegion =  Get-EC2Snapshot -Region $region.RegionName -Credential $Creds -OwnerId $accoundid -ErrorAction SilentlyContinue
      $SnapshotsinRegion = $SnapshotsinRegion.where{$_.StartTime -lt $3monthsAgo}
      if($error)
      {
        $error.clear
        Write-Log -message "$accoundid - $($region.RegionName) Inventory not found" -path $log -Severity Warning
      }
      else
      {

        Write-Log -message "$accoundid - $($region.RegionName) Inventory found - $($SnapshotsinRegion.count)" -path $log

        if($SnapshotsinRegion)
        { 
        ForEach($i in $SnapshotsinRegion) {
          $tags = $SnapshotName= $null
          $tags = $i.Tags

          if(!([string]::IsNullOrEmpty($tags)))
          {
            if($tags.Key -eq "Name")
            {
              $SnapshotName = $tags |
              Where-Object -FilterScript {
                $_.Key -eq "Name" 
              } |
              Select-Object -ExpandProperty Value
            }
          }
            $mcoll = "" | select AccountName,SnapshotName,SnapshotId,VolumeName,Size,RegionName,CreateDate,SnapshotAge
            $mcoll.AccountName = $Accountname
            if($SnapshotName){$mcoll.SnapshotName = $SnapshotName}
            else{$mcoll.SnapshotName = $i.SnapshotId}
            $mcoll.SnapshotId = $i.SnapshotId
            $mcoll.VolumeName = $i.VolumeId
            $mcoll.Size = $i.VolumeSize
            $mcoll.RegionName = $($region.RegionName)
            $mcoll.CreateDate= $i.StartTime
            $mcoll.SnapshotAge= $i.StartTime
            $collinventory.add($mcoll)

          }
        }
      }
    }
  }
}

$collinventory | Export-Csv $report -NoTypeInformation
Send-MailMessage -SmtpServer $smtpserver -From $from -To $email1 -bcc $erroremail -Subject "Critical Alert: $($collinventory.count) Amazon Snapshots are older than 3 months" -Attachments $Report
Move-Item -Path $report -Destination $hitoricalreports -Force
###############################Recycle logs ###############################################
Set-Recyclelogs -foldername "logs" -limit $logrecyclelimit -Confirm:$false
Write-Log -Message "Script Finished" -path $log
Send-MailMessage -SmtpServer $smtpserver -From $from -To $erroremail -Subject "Log - AWSOlderSnapShots" -Attachments $log