bacpacファイル出力プログラム

Azure SQLは最大で35日までのバックアップが可能。
それ以上にバックアップを保管しておく必要があったため、bacpacファイルを出力することに。
CentOSで自動で実行できるようするための対応を記載。個人的メモ。

#注意
ここで書いたプログラムは、日々行われるAzureのバージョンアップで、使えなくなってしまう可能性がある。
そうなった際はAzureのサポート要求を登録して確認すること。

#Azure設定
__・SQL Server作成__
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--> ファイアウォールの設定で、Azureサービスの許可を on にする

__・SQL Database作成__

__・Blobストレージ、コンテナ作成__

__・Azure ADのアプリケーション登録__
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--> アプリケーションIDとアプリケーションのキーを取得。後で説明するconfig.ymlで使用する。

__・仮想マシン作成（CentOS7）__
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--> AzureのCentOS7なら、たぶん最初からPowerShellがインストールされてるはず。

#CentOS

__・AzureRM インストール__

PowerShellのプログラムでAzureにアクセスさせるので、関連モジュールをインストール

```
[user@centos7 ~]$ sudo pwsh
PS /root> Install-Module AzureRM.NetCore
PS /root> Import-Module AzureRM.Netcore
PS /root> Import-Module AzureRM.Profile.Netcore
``` 
<br />
__・powershell-yaml インストール__

設定値をyamlファイルに定義して、PowerShellの実行プログラムで読み込んで利用するため、powershell-yamlをインストール

```
PS /root> Install-Module powershell-yaml
```

#設定ファイル
PowerShellの実行プログラムで参照する設定を定義

```yaml:config.yml
azure:
  resource_group: hogefuga-rg
  tenant_id: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
  app_id: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
  app_key: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'

  sqlserver: 
    -
      host: sqlsv-hogefuga-001
      admin: sql-admin@sqlsv-hogefuga-001
      password: 'P@$$w0rd'
    -
      host: sqlsv-hogefuga-002
      admin: sql-admin@sqlsv-hogefuga-002
      password: 'Passw0rd!!!'

  storage:
    backup:
      storage_name: hogefuga_st001
      storage_key: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
      storage_key_type: StorageAccessKey
      container: 'bacpac-export'
```

#実行ファイル

```powershell:export_bacpac.ps1
# 引数（1:sqlserver配列番号, 2:DB名）
$num = $Args[0]
# config.yml の読み込み（powershell-yamlを利用）
$config = Get-Content config.yml -Raw
$config_yaml = ConvertFrom-Yaml $config

# AzureADに登録したアプリの情報でアクセス（アプリケーションID・キー・テナントID）
$AppKey = $config_yaml.azure.app_key
$AppId = $config_yaml.azure.app_id
$TenantId = $config_yaml.azure.tenant_id
$secpassword = ConvertTo-SecureString $AppKey -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential($AppId, $secpassword)
Login-AzureRmAccount -ServicePrincipal -TenantId $TenantId -Credential $mycreds

# バックアップ用リソース設定
$ResourceGroupName = $config_yaml.azure.resource_group
$ServerName = $config_yaml.azure.sqlserver[$num].host
$DatabaseName = $Args[1]

# バックアップ用ストレージ・コンテナ設定
$storageName = $config_yaml.azure.storage.backup.storage_name
$StorageKeyType = $config_yaml.azure.storage.backup.storage_key_type
$StorageKey = $config_yaml.azure.storage.backup.storage_key
$containerName = $config_yaml.azure.storage.backup.container

# バックアップファイル名設定
$BacpacFileName = $DatabaseName + '.bacpac'
$BacpacUri = ('https://' + $storageName + '.blob.core.windows.net/' + $containerName + '/export/dir/' + $ServerName + '/' + $BacpacFileName).Replace("-", "_")

# SQL Database へのログイン設定。パスワードは SecureString に変換。
$Login = $config_yaml.azure.sqlserver[$num].admin
$Password = $config_yaml.azure.sqlserver[$num].password | ConvertTo-SecureString -AsPlainText -Force

# エクスポート開始
$exportRequest = New-AzureRmSqlDatabaseExport -ResourceGroupName $ResourceGroupName -ServerName $ServerName -DatabaseName $DatabaseName -StorageKeytype $StorageKeytype -StorageKey $StorageKey -StorageUri $BacpacUri -AdministratorLogin $Login -AdministratorLoginPassword $Password
```

#実行
config.ymlに定義した最初のSQL Serverにあるhogefuga_databaseをバックアップ

```
[user@centos7 ~]$ pwsh -File bacpac_export.ps1 0 hogefuga_database
```