Архивирование в AWS Glacier (часть 3)

Опубликовано: 24.07.2017
Автор: Виталий Бочкарев
Поддержать автора статьи по этой ссылке

В этой заметке описывается скрипт для установки задания по инвентаризации облачного архива AWS Glacier для того, чтобы удостовериться, что файл, скопированный на предыдущем этапе, успешно размещен в облаке.

Логика скрипта:

  • Подключиться к AWS Glacier.
  • Создать задание на инвентаризацию коллекции архивов.
  • Создать файл с номером задания, чтобы через 4-12 часов считать результаты инвентаризации, основываясь на записанном в файле номере задания.

Код скрипта:

# AWS variables
$AWSAccountID = 'AWS_Account_ID'
$AWSRegion = 'AWS_region'
$AWSVaultName = 'AWS_Vault_Name'
$AWSProfileAccessKey = "AWS_Access_Key"
$AWSProfileSecretKey = "AWS_Secret_Key"
$AWSJobIdFileName = "AWSGlacier-InventoryJobId.txt"

# Registering AWS libraries
Add-Type -Path "C:\Program Files (x86)\AWS SDK for .NET\bin\Net45\AWSSDK.Core.dll"
Add-Type -Path "C:\Program Files (x86)\AWS SDK for .NET\bin\Net45\AWSSDK.Glacier.dll"

Function Write-ScriptLog {
 Param(
   [CmdletBinding()]
   [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
   [String]$Message,
   [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$true)]
   [String]$LogFile
 )
 Process {
   $LogMessage = Get-Date -uformat "%d.%m.%Y %H:%M:%S"
   $LogMessage += "`t"
   $LogMessage += $Message
   $LogMessage | Out-File -FilePath $LogFile -Append
 }
}#End Function

# --- Start ---

# Calculating variables
$CurrentDate = Get-Date
$ScriptFolder = $MyInvocation.MyCommand.Path.SubString(0,($MyInvocation.MyCommand.Path.Length - `
 $MyInvocation.MyCommand.Name.Length))
$LogFile = $ScriptFolder + 'Logs\' + (Get-Date -format yyyy_MM_dd) + "_" + `
 $MyInvocation.MyCommand.Name.SubString(0,($MyInvocation.MyCommand.Name.Length - 4)) + ".log"

# Log-file creation
If (-not(Test-Path ($ScriptFolder + 'Logs') -PathType Container )) {
 New-Item -ItemType Directory -Path ($ScriptFolder + 'Logs')
}
Out-File -FilePath $LogFile

Write-ScriptLog -LogFile $LogFile -Message ($MyInvocation.MyCommand.Name + " started")

Write-ScriptLog -LogFile $LogFile -Message ("============================== Input data ==============================")
Write-ScriptLog -LogFile $LogFile -Message ("AWS Account ID = $AWSAccountID")
Write-ScriptLog -LogFile $LogFile -Message ("AWS Region = $AWSRegion")
Write-ScriptLog -LogFile $LogFile -Message ("AWS Vault Name = $AWSVaultName")
Write-ScriptLog -LogFile $LogFile -Message ("AWS Job Id File Name = $AWSJobIdFileName")

Write-ScriptLog -LogFile $LogFile -Message ("============================== Processing ==============================")

# Output file name
$AWSJobIdFilePath = $ScriptFolder + $AWSJobIdFileName

If (-not (Test-Path($AWSJobIdFilePath))) {
 $AWSEndpoint = [Amazon.RegionEndpoint]::GetBySystemName($AWSRegion)
 # Set inventory job for a AWS Glacier vault
 $AWSGlacierClient = [Amazon.Glacier.AmazonGlacierClient]::New($AWSProfileAccessKey, $AWSProfileSecretKey, $AWSEndpoint)
 Write-ScriptLog -LogFile $LogFile -Message ("Connection to AWS Glacier is opened")
 $AWSGlacierJobParameters  = [Amazon.Glacier.Model.JobParameters]::new()
 $AWSGlacierJobParameters.Type = "inventory-retrieval"
 $AWSGlacierJobParameters.Description = "Retrieve inventory of a vault"
 $AWSGlacierJobRequest  = [Amazon.Glacier.Model.InitiateJobRequest]::new($AWSAccountID, $AWSVaultName, $AWSGlacierJobParameters)
 Try {
   $AWSGlacerJobId = $AWSGlacierClient.InitiateJob($AWSGlacierJobRequest).JobId
   Write-ScriptLog -LogFile $LogFile -Message ("Inventory retrieval job is set with Id $AWSGlacerJobId")
 }
 Catch {
   Write-ScriptLog -LogFile $LogFile -Message ("----> Error: " + $_.Exception.Message)
 }
 # Saving the result to the output file
 If ($AWSGlacerJobId -ne $Nothing) {
   $AWSGlacerJobId | Out-File -FilePath $AWSJobIdFilePath
   $AWSGlacierClient.Dispose()
 } Else {
   Write-ScriptLog -LogFile $LogFile -Message ("Job is not set")
 }
 Write-ScriptLog -LogFile $LogFile -Message ("Connection to AWS Glacier is closed")
}
Else {
 Write-ScriptLog -LogFile $LogFile -Message ("The processing is stopped")
 Write-ScriptLog -LogFile $LogFile -Message ("Use Process-AWSGlacierChecking.ps1 script to process existing Job Id")
}

# --- End ---
Write-ScriptLog -LogFile $LogFile -Message ("========================================================================")
Write-ScriptLog -LogFile $LogFile -Message ($MyInvocation.MyCommand.Name + " stopped")

Входные данные скрипта:

  • AWSAccountID - ID учетной записи Amazon Web Services
  • AWSRegion - регион, где находится коллекция архивов
  • AWSVaultName - имя коллекции архивов
  • AWSProfileAccessKey - учетная запись AWS с правом доступа к коллекции архивов
  • AWSProfileSecretKey - ключ к учетной записи AWS
  • AWSJobIdFileName - имя файла, в котором нужно сохранить номер задания (файл сохраняется в той же папке, где лежит скрипт)

Результат работы скрипта:

  • Установленное задание на инвентаризацию коллекции архивов в AWS Glacier.
  • Файл с номером задания по инвентаризации.
  • Лог-файл работы скрипта.
Продолжение в заметке "Servers - Архивирование в AWS Glacier (часть 4)".