Servers - Архивирование в 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)".
Вверх