Windows Server インスタンスを使ってみる

今度はWindowsインスタンスを使ってみるが気になることがある。
WindowsはUbuntuなどライセンスフリーなソフトではなく有償なので料金が発生する。これらについてまとめてみた。(Microsoft社のライセンスは分かりにくいので、ここに書いてあることが正しいかどうかは保証は無いのであしからず。)

EC2で使うWindowsはMirosoftとAmazonとの間でSPLAというSaaS業者用の契約のもとEC2のユーザが使うことになる。このライセンスによるとWindows Server側のライセンス費用は追加のサーバ製品を使わない限り月額使用料に含まれている。
特に最初にWindowsインスタンスに接続するにはRemote Desktopで接続することになるが、Windows ServerのRemote Desktop Serviceに接続するにはRDS CALというライセンスが必要になる。これについては、管理用にアクセスするためのライセンスは(同時2ユーザ分)含まれている。
なので、先ずはRDSで接続して環境を設定することは問題ない。


《メモ》
・Windows Serverはプロセッサ ライセンス (PL) で提供される
・CAL が不要になるケース
以下の条件に当てはまるデバイスまたはユーザーは CAL を取得する必要がありません。
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

音声をリモートで再生する

AWSのインスタンスはヘッドレスなのでサウンドカードは装備されていない(あっても聞きようが無い)。
実際にはどれくらい役に立つか分からないがVNCの様にリモートで音声も再生してみる。
Linux(Ubuntu)の音声関連は、サウンドカードのドライバ周りはALSA、アプリケーションとのインターフェイスはPulseAudioが担っている。PulseAudioに対応していればPulseAudioの設定で音声をリモートに飛ばすことが可能である。PulseAuioのWikiにはマルチキャストで音声を配信する方法が書かれていて、また、その場合の音声形式はPCMである。LAN内なら良いがインターネット経由でアクセスする環境には適用できない。
いろいろ探していたら、vlcを音声をエンコードしてサウンドサーバーにしする方法が書かれていた。
・アプリケーションの出力をPulseAudioにする
・PulseAudioにダミーのサウンドカードをロードする
・ダミーのサウンドカードの出力をローカルに向けて配信する
・配信されたサウンドをvlcでエンコード(圧縮)して配信する
・配信はマルチキャスト(rpt)ではなくhttpでクライアント側から接続する

PulseAudioの設定
 PulseAudioの設定は/etc/pulseにあるファイルdefault.paに指定する。ダミーのサウンドカードと自分自身への配信の設定で下記の様になる。初期設定ではコメントになっているコマンドを修正し有効にする。
load-module module-null-sink sink_name=rtp format=s16be channels=2 rate=44100 sink_properties="device.description='RTP Multicast Sink'"
load-module module-rtp-send source=rtp.monitor destination=127.0.0.1 port=46998 loop=1


vlcをサーバーとして起動
cvlc rtp://@127.0.0.1:46998 ":sout=#transcode{acodec=aac,ab=64,channels=2}:duplicate{dst=http{dst=127.0.0.1:8080/sound,mux=ts}]"

当初、MP3にエンコードしようとしたがvlcがffmpegを呼び出した際にエラーになってしまう。ffmpegはUbuntuでは非推奨であり今後も考えると違うライブラリを使いたいところだ。しかし、方法が分からなかった(あまり調べていないが)ので、AACにしてみた。クライアント側もvlc(Windows)を使うので問題ない。
「ab=64」はビットレートで当然高いほうが音質が良くなる。

クライアント側のvlc
vlcを起動してネットワークストリームを開いて、URLを入力する。私の環境ではEC2インスタンスとの通信はすべてSSHトンネリングを使用しているので、http://127.0.0.1:8080/soundとなる。直接EC2インスタンスのアドレスを指定する場合は、FWの設定も忘れずに。

EC2側でYoutube(Chrome)とRhthymboxで音楽を再生したが上手できた...がバッファリングの関係などで音声が遅延するので実用的かどうかは微妙...

DDNSを使う

EC2インスタンスは起動ごとにパブリックIPアドレスが割り当てられるため毎回異なるアドレスになる。なので、SSHクライアントで接続時にIPアドレスを変更するかHOSTSを書き換えるかしなければならない。有料で固定のIPアドレスを使うこともできるが、無料のDDNSサービスを利用して固定のホスト名で接続できるようにして、手間を省く。
(1)利用するDDNSはPLANEXが運用しているCyberGate。先ずは利用登録を行いホスト名を登録する。

(2)EC2インスタンスのパブリックIPアドレスはAWSのAPIで知ることができる。APIのインストールなどははここに書いてある。EC2インスタンスにインストールする。ちょっと手間がかかる。実行環境としてJavaが必要なのでJavaもインストールする。どのJavaにするか迷ったがOracleのJavaをインストールした。
ちょっと注意しなければならないのはAPI本体とAPIをコマンドとしてラッピングするCLIツールの二つがあること。まず、APIをこれに従ってインストールする。次にCLIツールをここからインストールする。これら2つの違いは、前者は、
「aws ec2 describe-instances ...」という指定でパラメータの設定形式も一般的なコマンドと異なる。
CLIツールの方は、
「ec2-describe-instances ...」という一般的なコマンドの形式で使える。
APIを使うにはAPI用のキーが必要になるのでコンソールからキーを生成しダウンロードする。また、APIの処理のリージョンを指定する。
CLIツールを使用するための設定は下記の通り。
-------------------------------------------------------------------------
export EC2_HOME=/opt/ec2-api-tools
export AWS_ACCESS_KEY=...
export AWS_SECRET_KEY=...
export EC2_URL=https://ec2.ap-northeast-1.amazonaws.com
export JAVA_HOME=/opt/jre
-------------------------------------------------------------------------
なお、ec2-api-tools、jreは後ろにバージョン番号が付いたフォルダにインストールしてリンクを張ってある。
EC2_URLはリージョンごとに異なるのでインスタンスのあるリージョン用のURLを指定する。
下記のコマンドを実行してインスタンス情報が出力されればOK。

/opt/ec2-api-tools/bin/ec2-describe-instances インスタンスID

このなかに割り当てられたパブリックIPアドレスがある。
/opt/ec2-api-tools/bin/ec2-describe-instances インスタンスID | grep NICASSOCIATION
と実行すると、
NICASSOCIATION x.x.x.x amazon y.y.y.y
パブリックアドレスx.x.x.xとプライベートアドレスが得られる。

(3)DDNSの更新
ddnsを更新するツールとしてGnuDIPを使う。perlで書かれているのでperlの実行環境もインストールする。tar.gzファイルを特定のフォルダに解凍すれば良い。余談だがWindowsの場合だと「program files¥メーカー¥製品」にインストールすれば良いプログラムのインストール場所に困ることがある。Java、CLIツールもこの形式。Linuxぽくないが、「/opt/pp名」のフォルダを作り必要なファイルを置くことにした。
/opt/gdipc/bin/gdipc.pl -c
と実行すると必要な情報を聞いてくる。CyberGateに登録した情報を答えていく。分からないことはとりあえずデフォルトで。すると、設定ファイルをホームの.GnuDIP2というファイルにしてくれる。中身はこんなもの。
-----------------------------------------------------------------------------
ホスト名;luna.ddns.vc;ddns.cybergate.planex.co.jp:3495;ユーザ情報;/home/xxx/.GnuDIP2.cache.ホスト名.luna.ddns.vc;0;2073600
-----------------------------------------------------------------------------
本来、GnuDIPは自分でIPアドレスを調べて登録してくれる。稼働中に動的に変更される場合、デーモンとして動作させれば監視して変更があった場合DDNSを更新してくれる。でもこのまま動かしてもアドレスはプライベートIPアドレスを登録してしまう。
GnuDIPにはIPアドレスを明示的に指定して登録する-qというオプションがある。ec2のコマンドとこのオプションを使ってIPアドレスを登録する。

[追記]
http://169.254.169.254/latest/meta-data/public-ipv4
で自インスタンスのipアドレスが得られる。

(4)起動時に自動更新する
ねたは揃ったので起動時に自動更新する様に仕込む。場所としては/etc/rc.localか/etc/init.dか。/etc/init.dにシェルを置いて/etc/rc2.dからリンクを張って実行することにした。
/etc/init.dに下記シェルをsetddnsとして作成。/etc/rc2.dにS95setddnsとしてリンクを作った。
-----------------------------------------------------------------------------
#!/bin/sh
. /root/ec2-env
case "$1" in
start)
/opt/ec2-api-tools/bin/ec2-describe-instances インスタンスID | grep NICASSOCIATION > /tmp/.gdipc-ipaddr
read w1 ipaddr w3 w4 < /tmp/.gdipc-ipaddr
/opt/gdipc/bin/gdipc.pl -f /etc/gdipc.conf -q "echo $ipaddr"
;;
stop)
/opt/gdipc/bin/gdipc.pl -f /etc/gdipc.conf -r
;;
esac
-----------------------------------------------------------------------------

/root/ec2-envには(2)で設定した環境変数の設定を書いてある。勿論setddnsにそのまま指定しても良いが、AWS_ACCESS_KEYとAWS_SECRET_KEYとはセキュリティーからrootのみ参照できる様にした。
/etc/gdipc.conf はgdipc -cで作成した設定ファイルである。内容は下記の様に少し変更した。
-----------------------------------------------------------------------------
aws-ホスト名;luna.ddns.vc;ddns.cybergate.planex.co.jp:3495;ユーザ情報;/var/cache/gdipc/gdipc.cache;0;2073600
-----------------------------------------------------------------------------
シャットダウン時にホストの状態をオフラインにするためgdipc.pl -f /etc/gdipc.conf -rを実行するようにした。/etc/rc0.dにK95setddnsとしてリンクを作成した。

P.S.
Windowsの場合DNSの更新タイミングが遅くインスタンスを起動してもすぐにホスト名が有効にならない。少しがっかり。Androidタブレットの場合すぐにホスト名でアクセスできるのだが。

LightDMを使う

VNC Serverを自動起動してそのままログインする方法を考えたが、今回はLightDMについて調べてみた。
LightDMはあまり情報が無く設定ファイル/etc/lightdm/lightdm.confについてもmanページもない。唯一、/usr/share/doc/lightdmにlightdm.conf(.gz)がという各パラメータにコメントを付したファイルがあるだけだ。
見ていて気になったのが、[VNCServer]セクション。
なんだこれ?
lightdmにはVNCServerが内包されているのか?
とにかく有功にして起動してみる。
----------------------------
[VNCServer]
enabled=true
port=5900
width=1280
height=1024
depth=24
---------------------------
話は前後するが初期設定ではX Serverが起動しないとLightDMはエラーで終了する。リモートからのログインのみで運用するために下記の設定を先頭に追加する。
---------------------------
[LightDM]
start-default-seat=false
---------------------------

PCのVNCViewerから接続してみる。VNCパスワードを聞いてくる。
?!どこで設定した
psでプロセスを見て分かった。
Xvnc :0 -auth /var/run/lightdm/root/:0 -inetd -nolisten tcp -geometry 1280x1024 -depth 24
というプロセスが接続要求がくると起動する。そう、lightdmがポート5900をリスンして接続要求が来たらinetdの様にXvncを起動するんだ!
だが、依然としてVNCパスワードの設定が分からない。root、ubuntuでvncserverを実行してパスワードを設定したがダメ。うーん
/usr/bin/Xvncをシェルにしてパラメータを設定して本物のXvncを実行しよう。
・/usr/bin/Xvncを/usr/bin/Xvnc.binにリネーム
・/usr/bin/Xvncはシェルにして内容は下記(実効権限を忘れずに)。パスワードを不要に設定
exec /usr/bin/Xvnc.bin $@ -SecurityTypes none

lightdmを起動してPCから接続すると、今度はパスワードは聞かれずそのままユーザー選択/ログイン画面が表示された。「足跡(GNOME)」アイコンでウィンドウマネジャを選択できる。gnome classic(no effect)を選べる。
ログイン画面.png

なぜか英語...

VNC Viewerとの通信はLightDMが受け持つことになるが、通信障害が起こるとセッションごとエラーで終了させてしまう。次回接続しなおした場合は、再度ログインからになる。VNC Serverと直接Viewerとで直接通信している場合は、再接続したら作業は継続できたのに。モバイルでアクセスする場合は困る。

lightdm.conf全体
---------------------------
[LightDM]
start-default-seat=false

[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu

[VNCServer]
enabled=true
port=5900
width=1280
height=1024
depth=24
---------------------------

言語の設定でエラーになる

システム設定→言語サポート(国連の旗)で言語として日本語を最上位に設定しようとするとエラーで設定画面が異常終了してしまう。その他ユーザアカウント操作時のロック解除もできない。環境変数でLANGなどを日本語に設定しているので、実用上日本語で動作しているので困ることはないが、前から気になっていた。EC2で使用しているイメージはUbuntu 12.04である。自宅のPCでは12.10を使用していてこちらは問題ない。
いろいろ調べてみたらL、どうもローカルでログインする場合とリモートした場合とでは操作できる範囲(権限)に違いがあるらしい(当然ローカルの方が何でもできる)。PAMを良く調べれば良いと思うがなかなか難しい。
また、インスタンスを起動したらデスクトップも自動で起動しているほうが便利ということもあって、起動時の設定を触ることにした。

起動時の設定は/etc/initにUpstartのスクリプトを書くことになっているが面倒(と言うか分からない)なので昔ながらの/etc/init.dにシェルを書いて/etc/rc2.dからリンクするスタイルで起動する。
よく見たら/etc/init.dにvncserverと言うスクリプトがインストールされている。しかし、Ubuntuと会わないのでこのままでは使えない。修正しようかとも思ったが自システムに特化したスクリプトを用意することにした。
/etc/init.d/vncserverはこんな感じ。
--こ-こ-か-ら-----------------------------------------------------------
#!/bin/bash
prog="Xvnc"
desc="TigerVNC remote Desktop"

start() {
echo "TigerVNC remote desktop"
su - ユーザー名 -c "vncserver :0 -geometry 1280x800 -localhost -SecurityTypes None"
RETVAL=1
}

stop() {
echo "Shutting down Xvnc remote desktop"
su - ユーザー名 -c "vncserver -kill :0"
RETVAL=1
}

restart() {
stop
start
}

case "$1" in
start)
start
;;
stop)
stop
;;
esac

exit $RETVAL
--こ-こ-ま-で-----------------------------------------------------------
/etc/rc2.dにS89vncserver -> ../init.d/vncserverとリンクを張ってファイル属性に実行を付加して出来上がり。
ところがこれだとこれまでと同様リモートからのログイン扱い。

次に考えたのが/etc/rc.localからの起動。

--こ-こ-か-ら-----------------------------------------------------------
swapon /pagefile
su - ユーザー名 -c /home/ユーザー名/autostart-vnc &
exit 0
--こ-こ-ま-で-----------------------------------------------------------

~/autostart-vncの内容は
--こ-こ-か-ら-----------------------------------------------------------
#!/bin/sh
Xvnc :0 -geometry 1280x800 -SecurityTypes none -localhost 2> .vnc/Xvnc.0.log &
export XvncPid=$!
export DISPLAY=:0
sleep 5
vncconfig -nowin &
gnome-session-fallback 2> .xsession-errors
kill -term $XvncPid
unset DISPLAY
unset XvncPid
--こ-こ-ま-で-----------------------------------------------------------
ちょっと強引か。

なお、EC2インスタンスへはsshでログインしポート5900をトネリングしている。なので、Xvncに-localhostを指定してSecurityTypesはNoneとしている。

だが、シャットダウンがログオフになるとかまだおかしい...
また、パスワードでログインしていないのでキーリングの解除がデスクトップ開始時にできていないなど、まだ改善の余地も。おいおい調べて改善していく。

デスクトップをGnome Classicに変更

AWS EC2のmicroインスタンスにはグラフィックアクセラレーターがないので、視覚効果を十分に発揮できる環境にないと判断され、gnomeのデスクトップはUnity-2Dという普通のUnityとは違うものが使われます。
Unity-2Dがきちんと動作すれば良いのですが、残念なことにVNCと組合すとランチャーが自動的に隠れません(auto hideが無効になる)。これはカーソル位置の検出の問題のようで、問題として挙がっていますが対策はされていないようです。また、隠れないにしてもアイコンを小さくしたいのですが、Unity Shellを手で編集しないといけなく面倒。もともと、昔のメニューの方が慣れているし昔のメニューに戻すことにします。(Windows 7からWindows 8での変更でも評判が良くない。)
パッケージgnome-session-fallbackをインストールし、ホームディレクトリの.xsessionファイルを下記に変更します。
gnome-session-fallback
VNC Serverを再起動すると昔風の階層メニューに変わります。
ClassicMenu.png

注意ですが、パネルの設定は右クリックではなく、ALT+右クリックです。

最初は軽量のXfce4を使おうかと思ったのですが、このmicroインスタンスですがgnomeでも十分実用になるように思えるのでそのままgnomeにしておこう。

もろもろの設定

(1) スワップファイル
microインスタンスはメモリが600MB程度しかないのでデスクトップを動かすとメモリに残りがなくなる。
スワップファイルを用意して仮想メモリを使用できるようにする。
通常、スワップは独立したパーティションに割り当てるが、Windowsの様にファイルに割り当てることも可能。今回は、スワップファイルを通常のファイルに割り当てる。
ルートに800MBのpagefileを設定する。
cd /
sudo dd if=/dev/zero of=pagefile ibs=4096 count=200000
sudo mkswap pagefile
スワップファイルを有効にするのは、
sudo swapon /pagefile
でできる。
起動時に自動でスワップを有効にするため、/etc/rc.localにこのコマンドを記述する。

(2) 不要なサービスを無効にする
各種サービスは/etc/initにあるconfファイルで設定する。昔は/etc/init.d下に起動シェルを記述していたが、最近はUpstartに代わっている。
ざっと見て、alsa(オーディオ)、network-manager、lightdmもいらない。Upstartは.confファイルを読んで実行するので、例えばnetwork-manager.conf.disableの様に名前を変更すると実行されなくなる。

AWS EC2インスタンスの設定(2)

次はデスクトップ環境の構築です。
microインスタンスはかなり非力なのでどうしようかと思いましたが、先ずは標準のgnomeで構築してます。
sudo apt-get install ubuntu-desktop
多数のパッケージがインストールされるので一休み。

さて、AWS EC2は当然リモートでログインするのですがなにを使うか。
LinuxなのでXでと思ったのですがWindowsでX Serverがほとんどない(Xmingだけか?)のと、更にAndoridには使えそうなものがない。また、世の中はVNCに進んでいるのでまずはVNCで構築。

Windows PCでも使っているTightVNCを考えましたがフリー版は開発が止まっているようで、開発者が新たに立ち上げたTigerVNCの方がホット。という訳でTigerVNCとしますがUbuntuのリポジトリにはありません。既にFedraは標準になっているのでそちらなら簡単なんだけど。
TigerVNCはここ
バイナリとソースがあるけどどちらにするか。リポジトリからインストールしないのでバイナリの場合前提機能がチェックできない。ビルドしてもいいが、だめもとでバイナリをインストール。
cd /tmp
wget http://jaist.dl.sourceforge.net/project/tigervnc/tigervnc/1.3.0/tigervnc-Linux-i686-1.3.0.tar.gz
gunzip tigervnc-Linux-i686-1.3.0.tar.gz
cd /
sudo tar xf /tmp/tigervnc-Linux-i686-1.3.0.tar
他のVNCと同様にvncserver :1で起動。だいたい上手く起動しているよう。
PC(Windows 7)からTightVNC Viewerで接続めでたくデスクトップが表示された。

標準のデスクトップはUnityだが軽量のxfceに変更も可能。xfce4をapt-getでインストール。
ホームディレクトリに .xsession というファイルがあってデスクトップを指定できる。
Unifyならgnome-session、xfce4ならxfce4-sessionと記述すれば好みのデスクトップが起動できる。
タグ:ubuntu AWS EC2

AWS EC2インスタンスの設定(1)

話題のAWS EC2を使ってみることにしました。
無料枠が一年分相当あり有料で使い続けるにしても料金が安いので試すことに。
サインアップからインスタンス作成まではAWSのページに詳しいので、それに従ってインスタンスを作成。初期状態ではアメリカ西海岸にインスタンスが作られます。私はリージョンを変更し東京にしました。
OSとして何を使うかですが、PCでも使い慣れているUbuntu12.04(LST)を使うことにします。
インスタンスを作成する最後にペアキーを作成し秘密鍵をダウンロードします。秘密鍵がないとUbuntuに
ログインできずなにもできないので注意。
・puttygenで秘密鍵をtera termが処理できる形式に変更
・インスタンスを起動する
・SSHでログイン。初期IDはubuntu、認証は先に変換した秘密鍵(パスワード認証ではない)認証
・接続の際、サーバーの指紋確認があるのですが、AWS EC2コンソールで表示されるものと異なります。
気持ち悪いがそのまま接続(接続後にサーバキーの指紋は、
ssh-keygen -lf /etc/ssh/ssh_host_ecdsa_key
で確認できます。
Ubuntuにログインできたら、apt-getでupdateとupgradeを実行し、次に日本語が使えるようにします。
Ubuntuの日本語化はここににあります。
バージョンを間違えないようにしてください。
最後に
sudo apt-get install ubuntu-defaults-ja
を実行とありますが、これだけではlocaleで日本語が指定できません。
sudo apt-get install language-pack-jaを実行し
export LANG=ja_JP.uft-8(ja_JP.UTF-8ではない)でコマンドも日本語化できます。
標準で日本語にするために.profileに設定。
gnomeデスクトップのためにlanguage-pack-gnome-jaもインストール。

/etc/timezoneの中身を
Asia/Tokyo
に変更。
また、/etc/localtimeを/usr/share/zoneinfo/Japanへのリンクに作り直す。
タグ:ubuntu AWS EC2

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。