Организация бэкапа файловой 1С в Amazon S3 средствами Power Shell

Задача: организовать бэкап баз 1С в облако Amazon S3 при помощи PowerShell

ОС: Windows Server 2008 R2

Установка AWS Tools

Инструкция Amazon для AWS Tools

Для установки утилит PowerShell для работы с сервисами Amazon необходимо загрузить установщик по адресу: https://aws.amazon.com/ru/powershell/. При установке данного пакета достаточно выбрать опцию "AWS Tools for PowerShell"

Установка AWS Tools for Windows PowerShell

Для корректной работы необходимо под аккаунтом администратора разрешить запуск подписанных скриптов:

Set-ExecutionPolicy RemoteSigned

В нашем случае в составе Microsoft Windows 2008 R2 идет PowerShell 2.0, для которого требуется подключение AWS Tools командой:

Import-Module "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\AWSPowerShell.psd1"

Для проверки PowerShell запустим команду

Get-AWSPowerShellVersion -ListServiceVersionInfo

Проверяем работу AWS Tools

Если команда сработала, значит, AWS Tools подключены нормально. Иногда можно наблюдать ошибку типа: 

Невозможно загрузить файл или сборку "System.Core, Version=3.5.0.0

Невозможно загрузить файл или сборку "System.Core, Version=3.5.0.0

В таком случае необходимо установить Microsoft .NET 3.5. Для Windows Server 2008 R2 с помощью "Диспетчера сервера" - "Компоненты":

Установка .NET 3.5 на Windows Server 2008 R2

Создаем пользователя с помощью Amazon IAM

Для повышения безопасности и минимизации рисков в случае утечки ключа доступа, создадим отдельного пользователя с минимальными необходимыми правами (только запись объектов). Это проще всего осуществить с помощью сервиса AWS Identity and Access Management (IAM). Для работы скрипта ему требуется только 2 разрешения: S3:PutObject (запись объектов в корзину) и S3:PutObjectTagging (указание тегов для объектов)

Создадим новую policy и назовем ее "CustomS3WriteObject". Для ее создания можно воспользоваться визуальным конструктором, либо же указать готовую policy в виде JSON. Здесь привожу пример JSON (не забываем поменять bucket-name на название своей корзины):

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:PutObjectTagging"
            ],
            "Resource": "arn:aws:s3:::bucket-name/*"
        }
    ]
}

Создаем новую policy с помощью Amazon IAM

Далее создаем нового пользователя с типом доступа "Programmatic access":

Далее создаем нового пользователя с типом доступа "Programmatic access"

И присваиваем ему нашу новую policy:

Присваиваем новому пользователю policy "CustomS3WriteOnly"

Для нового пользователя необходимо сформировать AccessKey и SecretKey, которые мы будем использовать в нашем скрипте. Сделаем это при помощи кнопки "Create access key"

Создаем ключ доступа для пользователя Amazon IAM

Скрипт резервного копирования 1С

Данный скрипт резервного копирования запускаем с нужной периодичностью при помощи Планировщика Задач

$1c_bases = @{
'base1' = 'X:\base1';
'base2' = 'X:\base2';
'base3' = 'X:\base3';
}

$1c_base_filename = "1Cv8.1cd"
$zipFilePassword = "ArcPass"
$curDate = get-date -UFormat "%y%m%d-%H%M"
$7ZipPath = '"C:\Program Files\7-Zip\7z.exe"'

#S3 settings
$bucketName = "bucket-name"
$accessKey = "AccessKey"
$secretKey = "secretKey"
$keyPrefix = "1c"


Function CheckBackSlash ([string] $Str) {
    if ($Str.Substring($Str.Length-1) -ne "\") {
        $Str += "\"
    }
    Return $Str
}

Function ReturnPermament ([string] $baseName) {
    $curDayOfWeek = Get-Date -UFormat "%u"

    #Store permanent file created on monday
    If ($curDayOfWeek -eq "1") {
        Return "True"
    } else {
        Return "False"
    }
}

#required for PowerShell 2.0 (Windows Server 2008 R2)
Import-Module "C:\Program Files (x86)\AWS Tools\PowerShell\AWSPowerShell\AWSPowerShell.psd1"

foreach ($key in $1c_bases.Keys) {
    $Dir = CheckBackSlash $1c_bases[$key]

    $FullPath = $Dir + $1c_base_filename

    If (Test-Path $FullPath) {
        $ArcName = $key + "-" + $curdate + ".7z"
        $OutputFile = CheckBackSlash $Env:TEMP
        $OutputFile += $ArcName

        $command = "& $7ZipPath a ""$OutPutFile"" -y -mx9 -ssw -mmt4 -p""$zipFilePassword"" ""$FullPath"""

        iex $command
        
        If (Test-Path $OutputFile) {
	    $tag = New-Object Amazon.S3.Model.Tag
	    $tag.Key = "store"
	    $tag.Value = ReturnPermament $key
        Write-S3Object -BucketName $bucketName -File $OutputFile -AccessKey $accessKey -CannedACLName private -SecretKey $secretKey -Key "1c/$ArcName" -TagSet $tag
        Remove-Item $OutputFile
        }
    }
}
 

В начале скрипта необходимо указать несколько переменных:

  1. $1c_bases - хэш-таблица Ключ-Значение, где Ключ - это название базы (будет использоваться при генерации имени архива). Значение - путь к папке, в которой лежит база 1С.
  2. $zipFilePassword - пароль, который будет установлен на архив
  3. $7ZipPath - путь к архиватору 7Zip
  4. $bucketName - название корзины, куда будут загружены архивы
  5. $accessKey и $secretKey - ключи для доступа к сервису Amazon S3, полученные с помощью Amazon IAM
  6. $keyPrefix - папка в корзине Amazon в которую будут загружены архивы

Управляем архивами в Amazon S3 при помощи Lifecycle rules

Для уменьшения стоимости хранения информации в Amazon S3 воспользуемся их системой Object Lifecycle Management. Она позволяет задавать правила долговременного хранения объектов. В нашем случае мы имеем 2 типа объектов:

  1. Архивы 1С для которых мы будем хранить 15 дней
  2. Архивы 1С, которые мы будем сохранять длительный срок переместив их в более дешевое хранилище Amazon Glacier (в нашем случае, резервная копия в понедельник утром)

В зависимости от того, трубуется ли нам хранить файл долговременно или нет, при записи объекта в хранилище Amazon S3 мы присваиваем ему тег "Store" . Для обычных архивов этот тег имеет значение "False", для требующих длительного хранения - "True". За это отвечает функция скрипта ReturnPermanent. В текущей версии она возвращает значение True/False в зависимости от номера дня недели. При необходимости, эту функцию можно доработать под свои требования.

Итак, добавляем Lifecycle rule. Фильтруем объекты по тегу "Store" и папке "1c" (в терминологии Amazon - префиксу):

Amazon lifecycle rule фильтруем объекты

Для объектов у которых тег "Store" равен "False" задаем срок истечения (Expiration) 15 дней на 3-м шаге:

Срок истечения объектов 15 дней Amazon Lifecycle Rules

Для объектов у которых тег "Store" равен "True" создаем еще одно правило и задаем перемещение (Transition) в Amazon Glacier через 15 дней на 2-м шаге:

Amazon lifecycle rule перемещение в Amazon Glacier через 15 дней

Заключение

При помощи простого скрипта PowerShell и облачного хранилища Amazon S3 организована система автоматизированного резервного копирования баз 1С. Предусмотрена автоматическая выборочная очистка облачного хранилища для минимизации затрат.


Похожие материалы

Комментарии