SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Azure Container Instances で SQL Server on Linux のコンテナーを起動してみる

leave a comment

先日、Azure Container Instances (ACI) が Preview で使用できるようになりました。

Fast and Easy Containers: Azure Container Instances
Azure Container Instances Documentation
既に試されている方もいらっしゃいますね。
Azure Container Instances は Hypervisor レベルでの分離を備えた次世代のコンテナ実行環境
Azure Container Instances
Check! Azure Container Instances (ACI) 登場!単一のコンテナを必要な時にさくっと使いたいときに!
この機能で、コンテナーのホストを準備することなく、さくっと PaaS 上で管理されているコンテナーインスタンスを起動させることができますね。

Container Instances are available today in public preview for Linux containers. Windows container support will be available in the coming weeks.

現時点では、Linux コンテナーが利用可能で、今後 Windows コンテナーがサポートされるようですね。
Linux コンテナーが動作するなら、ACI 上で SQL Server on Linux が起動するのではないかと思って試してみました。

コンテナーを作ってみる


Cloud Shell 上で実行可能な Azure CLI でACI の作成ができますのでポータル上でインスタンスを作成することが可能です。
SQL Server on Linux ですが、メモリが 3.25 GB 以上割り当てられていない環境では起動することができないため、ACI 起動時のメモリ割り当ては変更する必要があります。
現状、利用できるリージョンとしては「westus」「eastus」「westeurope」に限定されているようですね。
昨日、試していた時には、3.5 GB ぐらいのメモリ割り当てが、eastus ではできず、westus でないと使えなかったのですが、今日試してみたところ eastus でも作成できるようになっていたので、日々変わっているところがありそうですね。
ACI で SQL Server on Linux を実行する場合、次のコマンドを Cloud Shell で実行することで起動できます。

rg=<リソースグループ名>
solpass=<パスワード>
az group create --name $rg --location japaneast
az container create --image microsoft/mssql-server-linux -n sol -g $rg --cpu 1 --memory 3.5 --port 1433 --ip-address public -e ACCEPT_EULA=Y MSSQL_SA_PASSWORD=$solpass MSSQL_PID=Developer MSSQL_LCID=1041 MSSQL_COLLATION=Japanese_XJIS_140_CI_AS_VSS MSSQL_ENABLE_HADR=Y -l westus

 
コマンドを実行したら、ACI の一覧からプロビジョニングの状態が「Succeeded」となっていることを確認します。
image
今回はパブリック IP を付与するようにしていますので、コンテナーの展開が完了すれば、表示されている IP アドレス経由で接続が可能となります。
しばやん先生のブログで書かれていますが、次のようのコマンドでコンテナーのイベントのログを確認することで、展開状況をチェックすることができるようですね。

az container show -g $rg -n sol --query "containers[0].instanceView.events" -o table

 
SQL Server on Linux のコンテナーの PULL に 1 分程度かかっているようなのですが、2,3 分で SQL Server を使用可能なコンテナーが起動してくると思いますので、検証をしたい場合にサクッと構築することができるかと。
image

az container list -g $rg -o table

SQL Server on Linux の起動時の ERRORLOG については次のログ確認のコマンドでも確認できますので、こちらも覚えておくとよいかと。

az container logs -g $rg -n sol

ACI のコンテナーを停止するというコマンドがないようなので、使い終わったら削除しておくことになるのでしょうかね。

az container delete -g $rg aci -n sol -y

 

データ領域の永続化


コンテナー内にデータベースを作成してしまうと、コンテナーの再作成が行われた際にデータベースが削除されてしまいますので、データ領域の永続化もついでに試しておきたいかと。
システムデータベースまで含めると面倒なので、まずはユーザーデータベースについて、コンテナー外に配置してみたいと思います。
SQL Server のユーザーデータベースを外部に保存するための方法としては、次の方法が考えらえるかと。

  • BLOB ストレージにユーザーデータベースを配置する
  • Azure Fire Share にユーザーデータベースを配置する

検証してみたのですが、Azure File Share は現状は、DB の配置先としては使用できないようでした。
 
BLOB ストレージにユーザーデータベースを配置する
SQL Server 2014 以降であれば、Azure の BLOB ストレージにユーザーデータベースのファイルを配置することが可能となっており、現状の ACI だと、この方法を使うのが一番簡単かなと。
設定方法については Microsoft Azure 内の SQL Server データ ファイル に記載されています。
BLOB ストレージに対して SAS を取得して、次のようなクエリで BLOB 上にデータベースを作成します。

CREATE CREDENTIAL [https://<ストレージアカウント>.blob.core.windows.net/<コンテナー>]
WITH IDENTITY='SHARED ACCESS SIGNATURE',
SECRET = 'sv=~'
GO
CREATE DATABASE BLOBTEST
ON
(NAME=BLOBTEST_Data, FILENAME='https://<ストレージアカウント>.blob.core.windows.net/<コンテナー>/BLOBTEST_Data1.mdf')
LOG ON
(NAME=BLOBTEST_Log, FILENAME='https://<ストレージアカウント>.blob.core.windows.net/<コンテナー>/BLOBTEST_Log.ldf')
GO

 
作成したデータベースを他のコンテナーでアタッチする場合は、CREATE DATABASE を「FOR ATTACH」で実行します。

CREATE DATABASE BLOBTEST
ON
(NAME=BLOBTEST_Data, FILENAME='https://<ストレージアカウント>.blob.core.windows.net/<コンテナー>/BLOBTEST_Data1.mdf')
LOG ON
(NAME=BLOBTEST_Log, FILENAME='https://<ストレージアカウント>.blob.core.windows.net/<コンテナー>/BLOBTEST_Log.ldf')
FOR ATTACH
GO

 
Azure File Share を使う (検証してみたところ、配置できませんでした)
ACI では Azure File Share をマウントすることができるようになっています。
Mounting an Azure file share with Azure Container Instances
現時点では、Azure CLI から直接はマウントできず、ARM テンプレートで ACI をデプロイする必要があるようですね。
Cloud Shell から File Share 内のファイルを使用することができるようになっていますので、ARM テンプレートを Cloud Shell でマウントされている File Share にアップロードしておきます。
Azure Cloud Shell でのファイルの永続化
それを使用して、Cloud Shell からテンプレートをデプロイしてみます。
テンプレートは次のような内容が使えるかと。
Mounting an Azure file share with Azure Container Instances のコメントでも指摘されていますが、現時点で公開されているテンプレートの JSON は、構成が誤っているようでした。

現状のテンプレートの構成としては、[containers].[properties] 内に、各種設定を行う必要があるのですが、公開されているテンプレートでは、[containers] 配下に記載しているのですよね。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {
      "storageaccountname" : "<ストレージアカウント名>",
      "storageaccountkey" : "<ストレージアカウントキー>",
      "solpass" : "<sql Server sa パスワード>",
      "collation" : "Japanese_XJIS_140_CI_AS_VSS"
  },
  "resources":[{
    "name": "sol",
    "type": "Microsoft.ContainerInstance/containerGroups",
    "apiVersion": "2017-08-01-preview",
    "location": "westus",
    "properties": {
      "containers": [{
        "name": "sol",
        "properties" :{
            "image": "microsoft/mssql-server-linux",
            "resources": {
                "requests": {
                    "memoryInGB": 3.5,
                    "cpu": 1
                }
            },
            "ports": [{
                "port": 1433
            }],
            "volumeMounts": [{
                "name": "myvolume",
                "mountPath": "/aci/data/"
            }],
            "environmentVariables": [
                {
                    "name": "ACCEPT_EULA",
                    "value": "Y"
                },
                {
                    "name": "MSSQL_SA_PASSWORD",
                    "value": "[variables('solpass')]"
                },
                {
                    "name": "MSSQL_PID",
                    "value": "Developer"
                },
                {
                    "name": "MSSQL_LCID",
                    "value": "1041"
                },
                {
                    "name": "MSSQL_COLLATION",
                    "value": "[variables('collation')]"
                },
                {
                    "name": "MSSQL_ENABLE_HADR",
                    "value": "Y"
                }
            ]
        }
      }],
    "ipAddress": {
        "ports": [{
            "protocol": "TCP",
            "port": 1433
        }],
        "type": "Public"
    },
    "volumes": [{
        "name": "myvolume",
        "azureFile": {
            "shareName": "acishare",
            "storageAccountName": "[variables('storageaccountname')]",
            "storageAccountKey": "[variables('storageaccountkey')]"
        }
    }],
    "osType": "Linux"
    }
  }]
}

テンプレートは次のコマンドでデプロイできます。

az group deployment create --name deploy --template-file ~/clouddrive/deploy.json --resource-group $rg

「/aci/data」として、Azure File Share がマウントされるのですが、マウントされたボリュームは、ユーザーデータベースの作成先として使えないようです。

CREATE DATABASE SHARETEST
ON
(NAME=SHARETEST_Data, FILENAME='/aci/data/SHARETEST_Data1.mdf')
LOG ON
(NAME=SHARETEST_Log, FILENAME='/aci/data//SHARETEST_Log.ldf')
GO

 
で、データベースを作成しようとしてもエラーとなってしまいました。

メッセージ 5149、レベル 16、状態 3、行 2

物理ファイル ‘/aci/data/SHARETEST_Data1.mdf’ を拡張しようとしたときに、MODIFY FILE でオペレーティング システム エラー 31(システムに接続されたデバイスが機能していません。) が発生しました。

メッセージ 1802、レベル 16、状態 4、行 2

CREATE DATABASE が失敗しました。一覧されたファイル名の一部を作成できませんでした。関連するエラーを確認してください。

Mac の Docker でもこのようなエラーとなっていたかと思いますが同様の現象ですかね。
 
Windows コンテナーは近日と記載されていましたが、現時点でも使えるようですね。

ARM テンプレートで展開する場合は、次のような内容で展開可能です。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {
      "storageaccountname" : "<ストレージアカウント名>",
      "storageaccountkey" : "<ストレージアカウントキー>",
      "solpass" : "<sql Server sa パスワード>",
  },
  "resources":[{
    "name": "sow",
    "type": "Microsoft.ContainerInstance/containerGroups",
    "apiVersion": "2017-08-01-preview",
    "location": "westus",
    "properties": {
      "containers": [{
        "name": "sow",
        "properties" :{
            "image": "microsoft/mssql-server-windows",
            "resources": {
                "requests": {
                    "memoryInGB": 3.5,
                    "cpu": 2
                }
            },
            "ports": [{
                "port": 1433
            }],
            "environmentVariables": [
                {
                    "name": "ACCEPT_EULA",
                    "value": "Y"
                },
                {
                    "name": "SA_PASSWORD",
                    "value": "[variables('solpass')]"
                }
            ]
        }
      }],
    "ipAddress": {
        "ports": [{
            "protocol": "TCP",
            "port": 1433
        }],
        "type": "Public"
    },
    "osType": "Windows"
    }
  }]
}

Windows コンテナーの場合、ボリュームのマウントはサポートしていないようでした。

image

Share

Written by Masayuki.Ozawa

7月 29th, 2017 at 3:05 pm

Leave a Reply