2014年11月14日金曜日

CentOSのPHP(pdo-dblib)から、ODBCなしに Azure SQL Database に接続する(前回の続きです)

前回は、私の嫌いなODBCを使わなくてもコマンドラインで SQL Database につながることを確認しました。
SQL Database が use が使えないので、DB名を接続時に指定する必要があることがわかりました。

では、まずphpinfo()で、PDO周りの設定を確認しましょう。
(おそらくパッケージは epel の php-pdoでしょうか)

以下の状態ならOKです。(コマンドで見てます...)
PDO

PDO support => enabled
PDO drivers => dblib, firebird, mysql, odbc, pgsql, sqlite

pdo_dblib

PDO Driver for FreeTDS/Sybase DB-lib => enabled

Flavour => freetds

接続に必要なのは、dblibです。
FreeTDSのライブラリの中にある DB-Library を使っています。

なお、FreeTDSは前回の設定と同様です。
freetds.conf の内容はこんな感じでしたね。
[mymssql]
host = mssql1.database.windows.net
port = 1433
tds version = 8.0
client charset = UTF-8

この場合、PHPのコードはこうなります。
$server = 'mymssql';
$username = 'user@mssql1';
$password = 'password';
$database = 'mydatabase';

$db = new PDO("dblib:host=" . $server . ";dbname=" . $database . ";charset=UTF-8", $username, $password);
foreach ($db->query('SELECT DB_NAME()') as $row) {
  print_r($row);
}


公式ドキュメントでハマるところは、DSNのhostに渡す名前です。
これは freetds.conf に記述してあるサーバー名(ここでは mymssql)だったんですね。
そりゃわからんよ。

mssql関数でも、ある程度まではイケるんですが、接続時にDB名を指定する方法がわからずに断念しました。(masterには繋げます)

Azureの SQL Database は、唯一管理されたRDBMSなので、もっと他のOSや言語から簡単に繋がってほしいものです。

思い切って、OpenTechとかがFreeTDSプロジェクトに参加するとか、どうでしょう?










2014年11月11日火曜日

CentOSからコマンドラインで Azure SQL Database につなぐ

Azureで不便に思うことがある。
SQL Database をさくっとコマンドでなんとかしたい場合だ。
いろいろBingると、もちろんFreeTDS+UnixODBCを使ったサンプルが山ほどある。

しかし、yumでさくっとできないとかイヤじゃん。
ということでやってみた。

1. EPELリポジトリを有効にする
あなたのCentOSは、以下のコマンドでおそらくEPEL拡張パッケージが使えるようになるはず。
# yum install epel-release

くわしくはこちらを参考に。
https://fedoraproject.org/wiki/EPEL

2. FreeTDSをインストールする
以下のコマンドでインストールするだけ。
# yum install freetds

3. freetds.conf の設定
インストールすると、tsqlというコマンドが使える。
まずは設定ファイルの場所を確認する。
# tsql -C

たぶん良い子な皆さんは、/etc の下にあるはずだ。
こいつを環境に合わせて編集する。
# vi /etc/freetds.conf
[mymssql]
host = mssql1.database.windows.net
port = 1433
tds version = 8.0
client charset = UTF-8

この場合、[mymssql]が tsqlコマンド実行時に "-S" で指定する文字列。
接続する前に、もうひとつ。

4. SQL Database 側で接続許可
管理ポータルで、接続するホストのグローバルIPを許可する。
今回、同じリージョンからやってみたけど、なぜか繋がらないのでわざわざ許可。

5. 名前解決ができないので dig で接続したい SQL Database のIPアドレスを確認
なぜ出来なかったのかわからないが、先にIPアドレスを確認して指定したら接続できた。
謎が多すぎてここで挫ける人もいるかもしれない。

6. tsqlコマンドで接続
さて、やっと接続できる。
ユーザーが「user@mssql1」、パスワードが「password」、SQL Database のIPアドレスが「12.34.56.78」、データベース名が「mydatabase」の場合、こうなる。
# tsql -S mymssql -U user@mssql1 -P password -H 12.34.56.78 -p 1433 -D mydatabase

locale is "en_US.UTF-8"

locale charset is "UTF-8"
using default charset "UTF-8"
Default database being set to mydatabase
1> 

こうなったらあとはコマンドで好きなように。
ただひとつ、useコマンドが使えないのでご注意を。

わかったことは、「UnixODBCいらない」ってことか。勉強になった。
たぶんPHPだと、ここに php-mssql 入れたら繋がるんじゃないかな。
ODBC経由しかないと思ってたけど、思い込みは良くない。反省。

なお、PHPでmssql関数を使えば、FreeTDS(dblib)だけでイケるんですが、
SQL Server の場合はOKでも、SQL Databaseの場合はuseが使えなくて詰んでしまう。
(要調査)








2014年10月30日木曜日

Microsoft Azure で CoreOS を動かせ(とりあえず仮想マシン作る)

発表がありましたが、Microsoft が Docker に取り組むようですね。
Azure でも Linux Based な仮想マシンのイメージに CoreOS Alpha が来ました。

まあさくっとやってみましょう。
但し、新ポータル(https://portal.azure.com/)からのみです。(おそらく)


入力するときに必要なのは、ホスト名、ユーザー名(CoreOSへのログイン名)、SSHの公開鍵です。
もちろん、日本リージョンにも作れます。

作成してしばらく経つと、インスタンスが上がってきます。
こんな感じでポータルから見えます。


ドメイン名がホスト名と若干異なる他は、だいたい普通の仮想マシンと同じですね。
もちろん、公開鍵を用いてSSHでの接続が可能です。

ここにDockerイメージをデプロイすれば、普通に使えます。(そのうちやる)

なお、仮想マシンができれば、旧ポータルからも設定することが可能です。






2014年9月23日火曜日

AzureにDインスタンス(SSDベースかつCPU性能アップ)がきた

SSDきましたね。
さっそくD1にCentOS7入れて、lshwコマンドでハードウェアを見てみました。
もちろん、これだけではSSDかどうかはわかりませんがw

CPUはIntelになってますね。
smpboot: CPU0: Intel(R) Xeon(R) CPU E5-2660 0 @ 2.20GHz (fam: 06, model: 2d, stepping: 07)

以下、lshwコマンドの抜粋です。

    description: Desktop Computer
    product: Virtual Machine
    vendor: Microsoft Corporation
    version: 7.0
    serial: 0000-0016-7211-8467-7193-8608-97
    width: 64 bits
    capabilities: smbios-2.3 dmi-2.3 vsyscall32
    configuration: boot=normal chassis=desktop uuid=80CEDF23-283E-6245-8A6B-E93FBC650846
  *-core
       description: Motherboard
       product: Virtual Machine
       vendor: Microsoft Corporation
       physical id: 0
       version: 7.0
       serial: 0000-0011-6135-1979-7359-9976-12
     *-firmware
          description: BIOS
          vendor: American Megatrends Inc.
          physical id: 0
          version: 090006
          date: 05/23/2012
          size: 64KiB
          capacity: 192KiB
          capabilities: isa pci pnp upgrade shadowing escd cdboot bootselect socketedrom edd int13floppy360 int13floppy1200 int13floppy720 int13floppy2880 int5printscreen int9keyboard int14serial int17printer int10video agp ls120boot zipboot biosbootspecification
     *-cpu:0
          description: CPU
          product: Xeon (None)
          vendor: Intel Corp.
          physical id: 5
          bus info: cpu@0
          version: Intel(R) Xeon(R) CPU E5-2660 @ 2.20GHz
          serial: None
          slot: None
          size: 2200MHz
          capacity: 4GHz
          width: 64 bits
          clock: 100MHz
          capabilities: fpu fpu_exception wp vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx x86-64 constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 cx16 sse4_1 sse4_2 popcnt aes xsave avx hypervisor lahf_lm xsaveopt

     *-memory
          description: System Memory
          physical id: 51
          size: 3584MiB
        *-bank:0
             product: None
             vendor: Microsoft
             physical id: 0
             serial: None
             slot: M0
             size: 512MiB
        *-bank:1
             product: None
             vendor: Microsoft
             physical id: 1
             serial: None
             slot: M1
             size: 3GiB

     *-pci
          description: Host bridge
          product: 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (AGP disabled)
          vendor: Intel Corporation
          physical id: 100
          bus info: pci@0000:00:00.0
          version: 03
          width: 32 bits
          clock: 33MHz
        *-isa
             description: ISA bridge
             product: 82371AB/EB/MB PIIX4 ISA
             vendor: Intel Corporation
             physical id: 7
             bus info: pci@0000:00:07.0
             version: 01
             width: 32 bits
             clock: 33MHz
             capabilities: isa bus_master
             configuration: latency=0
        *-ide
             description: IDE interface
             product: 82371AB/EB/MB PIIX4 IDE
             vendor: Intel Corporation
             physical id: 7.1
             bus info: pci@0000:00:07.1
             version: 01
             width: 32 bits
             clock: 33MHz
             capabilities: ide bus_master
             configuration: driver=ata_piix latency=0
             resources: irq:0 ioport:1f0(size=8) ioport:3f6 ioport:170(size=8) ioport:376 ioport:ffa0(size=16)
        *-bridge UNCLAIMED
             description: Bridge
             product: 82371AB/EB/MB PIIX4 ACPI
             vendor: Intel Corporation
             physical id: 7.3
             bus info: pci@0000:00:07.3
             version: 02
             width: 32 bits
             clock: 33MHz
             capabilities: bridge
             configuration: latency=0
        *-display
             description: VGA compatible controller
             product: Hyper-V virtual VGA
             vendor: Microsoft Corporation
             physical id: 8
             bus info: pci@0000:00:08.0
             version: 00
             width: 32 bits
             clock: 33MHz
             capabilities: vga_controller bus_master rom
             configuration: driver=hyperv_fb latency=0
             resources: irq:11 memory:f8000000-fbffffff
     *-scsi:0
          physical id: 1
          logical name: scsi1
          capabilities: emulated
        *-cdrom
             description: DVD reader
             physical id: 0.0.0
             bus info: scsi@1:0.0.0
             logical name: /dev/cdrom
             logical name: /dev/sr0
             capabilities: audio dvd
             configuration: status=ready
     *-scsi:1
          physical id: 2
          logical name: scsi2
        *-disk
             description: SCSI Disk
             physical id: 0.0.0
             bus info: scsi@2:0.0.0
             logical name: /dev/sda
             size: 30GiB (32GB)
             capabilities: partitioned partitioned:dos
             configuration: logicalsectorsize=512 sectorsize=512 signature=00083660
           *-volume:0
                description: EXT4 volume
                vendor: Linux
                physical id: 1
                bus info: scsi@2:0.0.0,1
                logical name: /dev/sda1
                logical name: /
                version: 1.0
                serial: 427e4cf4-85d2-4b58-ac5b-a5c12d0b70dd
                size: 29GiB
                capacity: 29GiB
                capabilities: primary bootable journaled extended_attributes large_files huge_files dir_nlink recover 64bit extents ext4 ext2 initialized
                configuration: created=2014-07-22 19:41:22 filesystem=ext4 lastmountpoint=/ modified=2014-09-23 03:28:19 mount.fstype=ext4 mount.options=rw,seclabel,relatime,data=ordered mounted=2014-09-23 03:28:19 state=mounted
           *-volume:1
                description: Linux swap volume
                physical id: 2
                bus info: scsi@2:0.0.0,2
                logical name: /dev/sda2
                version: 1
                serial: 89aabb77-9b57-40cd-8469-da8c6016cd5d
                size: 1000MiB
                capacity: 1000MiB
                capabilities: primary nofs swap initialized
                configuration: filesystem=swap pagesize=4096
     *-scsi:2
          physical id: 3
          logical name: scsi3
        *-disk
             description: SCSI Disk
             physical id: 0.1.0
             bus info: scsi@3:0.1.0
             logical name: /dev/sdb
             size: 50GiB (53GB)
             capabilities: partitioned partitioned:dos
             configuration: logicalsectorsize=512 sectorsize=512 signature=2c4f248a
           *-volume
                description: EXT4 volume
                vendor: Linux
                physical id: 1
                bus info: scsi@3:0.1.0,1
                logical name: /dev/sdb1
                logical name: /mnt/resource
                version: 1.0
                serial: 4b9cdb96-30c6-4db3-adc8-e7b3ac28a021
                size: 49GiB
                capacity: 49GiB
                capabilities: primary bootable journaled extended_attributes large_files huge_files dir_nlink recover 64bit extents ext4 ext2 initialized
                configuration: created=2014-09-23 03:28:42 filesystem=ext4 lastmountpoint=/mnt/resource modified=2014-09-23 03:28:46 mount.fstype=ext4 mount.options=rw,seclabel,relatime,data=ordered mounted=2014-09-23 03:28:46 state=mounted
  *-network
       description: Ethernet interface
       physical id: 1
       logical name: eth0
       serial: 00:15:5d:10:e4:94
       capabilities: ethernet physical
       configuration: broadcast=yes driver=hv_netvsc firmware=N/A ip=100.78.16.68 link=yes multicast=yes

2014年9月13日土曜日

Docker で Node OS を動かせ on Azure

Node OS というLinuxディストリビューションが出ました。
コマンドがNode.jsで実装されているとのこと。
http://node-os.com/

もちろん、Azureで動かしてみます。
ただし、公式サイトのドキュメントではDockerで動作させているので、
それに倣ってDockerでやってみます。

もの凄くシンプルに、以下の通りに実行します。

# docker -i -t nodeos/nodeos

イメージをダウンロードして、デフォルトのシェルである「nsh」が実行されます。
どんなコマンドがあるのか、/binと/usr/binの下を見てみます。

/ # ls /bin/
[ 'init', 'ip', 'node', 'npkg', 'npm', 'sh' ]

/ # ls /usr/bin

[ 'env' ]

まだコマンドは少ないですね。
パッケージは「npkg」コマンドでインストールできます。
パッケージはここにあるようです。

なお、サンプルにあった bin-ncurl はインストールに失敗してました…

次は /etc の下を見てみます。
/ # ls /etc/
[ 'hostname', 'hosts', 'mtab', 'resolv.conf' ]

必要最小限でしょうか。

さて、コマンドは /root/bin にもあるようです。
その中のcatコマンドのソースを覗いてみましょう。

/root/bin # cat cat
#!/usr/bin/env node

var fs = require('fs');
var fi = 2;

var arg;

function cat( file ){
  var stream = fs.createReadStream( file )
  stream.on('close',function(){
    if( arg = process.argv[fi++] ) cat(arg);
  });
  stream.pipe(process.stdout);
}

if( arg = process.argv[fi++] ) cat(arg);

マジでNode.jsですw

胸熱なディストリビューションがまた増えましたね。


2014年9月1日月曜日

AzureでDockerやってみよう(IaaS)

AzureのLinux仮想マシンでも、もちろんDockerを動かす事が可能です。
今ならUbuntuの方が楽な気もしますが、ここはCentOS6.5でやってみましょう。

DockerはEPELからyumでインストールしたいので、以下のようにrpmをインストールします。

$ sudo rpm -i http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

これで、/etc/yum.repos.d/epel.repo というファイルができてEPELを利用できます。
docker-io をyumでインストールするとすぐに使えます。

$ sudo yum install docker-io
$ sudo chkconfig docker on
$ sudo service docker start

これでDockerが使えるようになります。
以下のコマンドを実行すると、Dockerイメージを勝手に取ってきてコンテナを実行します。

$ sudo docker run -i -t centos /bin/bash
Unable to find image 'centos' locally
Pulling repository centos
b157b77b1a65: Download complete 
511136ea3c5a: Download complete 
34e94e67e63a: Download complete 
bash-4.2# uname -a
Linux a9732c8635f9 2.6.32-431.17.1.el6.centos.plus.x86_64 #1 SMP Thu May 8 02:18:11 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
bash-4.2# cat /etc/redhat-release 
CentOS Linux release 7.0.1406 (Core) 

今回はCentOSのlatestを実行しているのでCentOS7ですが、kernelバージョンが2.6.32となっており、ホストのKernelと同じバージョンが実行されている事がわかります。
なお、ホストがCentOS6の場合systemdが動作しませんので、"centos:centos6"などと指定してCentOS6で運用するのが良いかと思います。

他のクラウドなどで実行されているコンテナをそのまま持ってくることが可能ですので、ぜひお試しを。

2014年7月30日水曜日

PHPのセッションを Microsoft Azure Storage に保存してみる

PHPのセッションハンドラを Microsoft Azure Table Storage に保存するためのプログラムを、githubに公開してみた。
https://github.com/cocteau666/php-azure-session/

Azure SDK for PHP に依存しています。
https://github.com/cocteau666/azure-sdk-for-php

Microsoft Azure でPHPを使う場合に、セッションデータをローカルに持たないようにするためにも、使ってみてはいかがでしょうか?

使い方は、こんな感じ。

require 'AzureTableSessionHandler.php'; 
$sessionHandler = new AzureTableSessionHandler($blob_account, $blob_key); 
session_set_save_handler($sessionHandler, TRUE); 
session_start();

シンプルですねー。

2014年7月14日月曜日

CentOS7 あれこれ

Microsoft Azure で CentOS7 を動かし始めて数日。
どうでも良いかもしれない、気が付いた事を。

1. firewalld ってもしかして Pythonスクリプト?

psコマンドで確認すると、以下のような表示が。

root      2726     1  0 20:17 ?        00:00:01 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid

まさか、こいつ…。
と思って vim で開いたら、

#!/usr/bin/python -Es
# -*- coding: utf-8 -*-

ではじまってるんだが。
時間があったら見てみよう。

2. httpdを公開するために

firewalld が iptables の設定を管理するようになったので、設定方法が変わっています。
デフォルトでは ssh しか許可されてません。
httpd を許可するためには、firewalld が動作中に firewall-cmd コマンドで設定する必要があります。

こうすると、現在の設定が一覧表示されます。

$ sudo firewall-cmd --list-all-zone

httpd を永続的に追加するにはこうします。(若干、--permanent オプションにハマる)

$ sudo firewall-cmd --permanent --add-service=http --zone=public

3. gccにGO言語のコンパイラあるのね

gcc-go ってパッケージがあるんだー。知らなかったよ。

2014年7月12日土曜日

さっそくMicrosoftAzureでCentOS7を動かしてみる

7月7日に公開になったCentOS7ですが、各方面で情報が出回っているかと思います。

http://centos.org

特徴としては、


  • Kernelが3.10.0
  • Apacheが2.4系に
  • systemdの採用(今までのinitではない)
  • firewalldの採用(iptablesの設定を管理する)
  • MariaDBの採用(MySQLの代替)


ってところでしょうか。

※なお、私が作ったCentOS7のVMDepotイメージはこちらで。
http://vmdepot.msopentech.com/Vhd/Show?vhdId=42491&version=43576

MicrosoftAzureでCentOS7を動かすには、自分でHyper-Vからイメージをアップロードする必要があります。

必要なものは以下の通り。


  • Hyper-V(Windows8のものでOK)
  • Azureストレージにアップロードするツール(私はCloudBerryExplorerでやりました)
  • MicrosoftAzureサブスクリプション
  • WALinuxAgent(githubより取得)

ハマるところだけいくつか解説します。


1. CentOS7をHyper-V上の仮想マシンにインストール


基本的には、以下のリンクの通りで良いのですが、
http://www.atmarkit.co.jp/ait/articles/1405/29/news148.html

Azureで動作させるためのVHDには条件があり、サイズ固定で127GB以下である必要がありますのでご注意ください。

2. WALinuxAgentのインストール

インストールが終わったら、WALinuxAgentのインストールを行います。
以下のサイトからgitで取得します。(gitコマンドはyumでインストールできます)
https://github.com/Azure/WALinuxAgent

中身はPythonですので、以下のようにインストールを。

$ cd WALinuxAgent
$ sudo python setup.py install

ここでインストールされるのですが、systemd向けのスクリプトがありませんので、別途導入します。

$ sudo cp distro/systemd/waagent.service /etc/systemd/system/
$ sudo systemctl enable waagent
$ sudo systemctl start waagent

3. 設定の初期化

Azureでマイイメージとして利用するために、以下のように初期化を行います。
$ sudo waagent -deprovision

このコマンドは以下の処理を行います。

  • waagentの停止
  • SSHホストキーのペアを削除
  • DHCPリースの削除
  • resolv.confの削除
  • rootパスワードの削除

4. Azureストレージへのアップロード

仮想マシンを停止したら、作成したVHDをAzureストレージにPageBlobとしてアップロードします。
アップロード方法はPageBlobでアップロード可能であれば何でもOKです。

5. マイイメージの作成

Azureポータルにログインして、アップロードしたVHDファイルからイメージを作成します。
仮想マシン>イメージ>作成、ですね。



以下のように入力してイメージを作成すると、仮想マシン作成時にアップロードしたイメージから仮想マシンが作成できます。


6. 仮想マシンを作成して遊ぶ

あとは仮想マシンを作るだけです。