AzureのSQL Databaseをrest apiからexportしてバックアップを90日以上とる

## 概要
AzureでSQL Databaseをexport(フルバックアップ)してbacpacなる形式でバックアップできる。
Azureにも当然自動エクスポート機能なるものが当然備わっているが、90日までしか指定できない...

参考:
[Azure SQL Database のバックアップと復元](https://msdn.microsoft.com/ja-jp/library/azure/jj650016.aspx)
* 「保有期間」のところで90日以下にしろとバリデーションが入る...

しかし諸事情でそれより長くバックアップを取りたい場合には、rest apiなりPower Shellでごりごりするしかないので、apiを叩くシェルスクリプトなど書いてみた。

(ちなみに普通の使い方してたら5分単位で任意ポイントへの復旧機能が
デフォルトであるからそれで十分じゃないか感はある)

## スクリプト作ってみた
中身としては、

+ rest api直打ちcurlでSQLのexportを実行し、blobに保管
+ azure-cliで古いblobのデータを探して(ファイル名一致)削除

(azure-cliはなんか興味本位で使ってみたかっただけではあるというか、
azure-cliでsqlのexportもあればいいのに...)

実際のコードは以下。

```bash:sql_export.sh

#!/bin/bash

_CURL="/usr/bin/curl"
_AZURE_CLI="/usr/bin/azure"
_CURRENT_DATE=`date +"%Y%m%d"`
_EXPIRE_DATE=`date +"%Y%m%d" --date "-180 day"`

# select by region from https://msdn.microsoft.com/ja-JP/library/azure/dn781282
_DB_EXPORT_BASE_URL="https://bl2prod-dacsvc.azure.com/DACWebService.svc/Export"
_DB_NAME="hoge"
_DB_SERVER="hoge.database.windows.net"
_DB_USER="hoge"
_DB_PASSWORD="hoge"

_STORAGE_ACCESS_KEY="hoge"
_STORAGE_ACCOUNT="hoge"
_STORAGE_CONTAINER="hoge"

_STORAGE_CONTAINER_URL="https://${_STORAGE_ACCOUNT}.blob.core.windows.net/${_STORAGE_CONTAINER}"
_FILE_NAME="${_DB_NAME}_export_${_CURRENT_DATE}.bacpac"
_EXPIRE_FILE_NAME="${_DB_NAME}_export_${_EXPIRE_DATE}.bacpac"
_STORAGE_FILE_URL="${_STORAGE_CONTAINER_URL}/${_FILE_NAME}"

_XML=`cat <<_EOT_
<ExportInput
   xmlns="http://schemas.datacontract.org/2004/07/Microsoft.SqlServer.Management.Dac.ServiceTypes"
   xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
   <BlobCredentials i:type="BlobStorageAccessKeyCredentials">
       <Uri>${_STORAGE_FILE_URL}</Uri>
       <StorageAccessKey>${_STORAGE_ACCESS_KEY}</StorageAccessKey>
   </BlobCredentials>
   <ConnectionInfo>
       <DatabaseName>${_DB_NAME}</DatabaseName>
       <Password>${_DB_PASSWORD}</Password>
       <ServerName>${_DB_SERVER}</ServerName>
       <UserName>${_DB_USER}</UserName>
   </ConnectionInfo>
</ExportInput>
_EOT_`

### export by azure api
${_CURL} -S -s -X POST -H 'Content-type:text/xml' -H 'x-ms-version:2012-03-01' -d "${_XML}" ${_DB_EXPORT_BASE_URL} > /dev/null 2>&1

### delete old export by azure-cli
${_AZURE_CLI} storage blob delete --container "${_STORAGE_CONTAINER}" -b "${_EXPIRE_FILE_NAME}" -a "${_STORAGE_ACCOUNT}" -k "${_STORAGE_ACCESS_KEY}" > /dev/null 2>&1

```

上記の通りazure-cliの事前インストールが必要です。
参考:
[Windows Azure コマンドライン ツール を使ってみる - THE TRUTH IS OUT THERE - Site Home - MSDN Blogs](http://blogs.msdn.com/b/chack/archive/2012/11/26/how-to-use-windows-azure-command-line-tool.aspx)

ちなみに上記は雑コードなので実行時の失敗とかレポーティングは考慮していないので適宜追加設定は必要。

で、これを毎日実行なcrontabで仕込む。

雑に手順まとめると以下な感じ。

```sh

## azure-cli install
cd /usr/local/src
curl -O http://download-i2.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm 
rpm -ivh epel-release-6-8.noarch.rpm
yum install npm ?enablerepo=epel

node -v 
# confirm version
npm -v
# confirm version

npm install -g azure-cli

npm ls -g azure-cli
# confirm installed

azure
# confirm logo displayed

cd /home/hoge
vi sql_export.sh
# above script

crontab -e
---
00 00 * * * /home/hoge/sql_export.sh
---


```

## まとめ
azure storage explorerなどで見てみるとbacpacファイルが毎日できてるのが確認できたのでなにより。

ただ、SQL Databaseのexportについては以下のようなことが起きる可能性もあるので、なるべくアクセスの少ないタイミングで実施したいなと。
参考:
[蒼の王座 » SQL DatabaseのエクスポートをするとDTUの上限に達してしまう](http://sqlazure.jp/b/sqlazure/2099/)

シェルスクリプトでヒアドキュメントな変数の宣言はちょっと勉強になった。