移行とかでDBはやむを得ずそのままでフロントは頑張った系の構成つくろう、つまり Windows Azureのクラウドサービス(Web RoleとかWorker Role)をVirtual Networkに参加させちゃおうという話です。
ついでに同じVirtual NetworkにWindows Azure 仮想マシンも参加させてサービス間通信もしちゃいましょう。
今回想定しているのはざっくり以下のような構成です。
バックエンドのVMはDBとかまぁそういうのを想定。通信の方向性としては双方向で通信できますが、今回はフロントのWebRoleからVMへのアクセスを想定します。
といっても対してすることは無く。Web RoleなどのCloud ServicesでのVirtual Networkへの参加方法と、VMのVirutla Networkへの参加方法、名前解決についてあたりを書こうと思います。
Virtual Networkの作成
管理ポータルからウィザードを使って簡単に作ります。
サブネットは使う分だけ追加しておきましょう。
今回はDNSもローカル接続もなしです。
以上です。簡単ですね。
クラウドサービスの作成
次にクラウドサービスを作成します。クラウドサービス作成時の注意点としてはリージョン選ぶところで先ほど作成したVirtual Networkのアフィニティグループを指定するところですね。
これでこのクラウドサービスはVirutal Networkに参加する準備ができました。でもこれだけだと単に近い場所に配置されるだけでネットワーク的には何の関連付けもありません。
クラウドサービスのロールがどのサブネットに所属するかはサービス設定ファイル(*.cscfg)で定義します。
こんな感じでNetworkConfiguration要素を追加して参加させるVirtual NetworkをVirtualNetworkSite要素に、対象のロールをInstanceAddress要素のroleName属性に、そのロールが参加するサブネットをSubnet属性で指定します。
これでデプロイすると指定されたサブネット上に配置されます。IPアドレスはDHCP(DynamicIP)になりますが、インスタンスのMACアドレスと紐づいてデプロイされてる間はほぼ固定になるようです。
ちゃんと指定したサブネット上のIPアドレスが振られてますね。
クラウドサービス側はこんな感じで完了です。
Virtual Machineの作成
Virtual MachineはWindowsの場合であればさほど難しくありません。管理ポータルのギャラリー等から作成する際にサブネットを指定するだけです。
IPアドレスはDHCP(DynamicIP)になりますが、インスタンスのMACアドレスと紐づいてデプロイされてる間はほぼ固定になるようです。
Windowsの場合は以上です。
それぞれサブネットは異なっても同一Virtual Networkなので、適切にOSが設定されていれば問題なく通信できます。
名前解決について
今回、名前解決に使用するDNSは特に何も指定しませんでしたので、Windows Azureが提供する内部用のDNSが使えます。
但し、クラウドサービスと仮想マシンでDNS Suffixが異なるのでお互いの名前を解決することはできないようです。
※同一クラウドサービス内のインスタンスや別ロールとかは問題ない。
Hostname resolution is not available between virtual machines or role instances that are distributed across multiple cloud services.
これを回避するには、自前でどこかにDDNSを立ててインスタンス起動時に登録するようにするか伝統のHosts編集をするしかないです。
まぁこれ以上は要件によりけりですし、バックエンドをVMにした時点でそこまで冗長化は考えてないだろうということでフロント(クラウドサービス)→バックエンド(VM)方向の通信はIPアドレス指定でもいいかなーと思います。
LinuxのVirtual Machineの場合
Linuxで仮想マシンを構築する場合は管理ポータルのウィザードからではサブネットの指定ができないので、PowerShell経由で作成する必要があります。
面倒ですね。
作成する際はNew-AzureQuickVMを使用してそれぞれ指定すればOKです。参考までにコマンドの一覧をあげておきます。
# Azureの設定ファイル読み込み Import-AzurePublishSettingsFile azure.publishsettings # 操作対象のサブスクリプションID(Get-AzureSubscriptionから取得する) $subid='4507588b-c31f-4881-99e0-939b195ad59c' # 管理用証明書の指定( dir Cert:\CurrentUser\My で一覧みれるのでサムプリントを取得する) $cert = Get-Item Cert:\CurrentUser\My\XXXXXXXXXXXXXXXXXXXXXXXXXXXX # 操作対象のサブスクリプションを設定 Set-AzureSubscription -SubscriptionName 'yourSubscription' -SubscriptionId $subid -Certificate $cert -CurrentStorageAccount 'yourstorageaccount' # 仮想マシンを作成する # 作る元となるVMImageは Get-AzureVMImage で得られる中から選んでImageNameを控えましょう New-AzureQuickVM -Linux -LinuxUser buchizo -Name 'backend02' -ImageName '5112500ae3b842c8b9c604889f8753c3__OpenLogic-CentOS63DEC20121220' -ServiceName 'buchibackend02' -Password 'FAKE' -AffinityGroup 'TestAffinityGroup' -SubnetNames 'AzureBackendSubne' -InstanceSize 'ExtraSmall' -VNetName 'TestNetwork'
上記コマンドで仮想マシンを作ると、指定したサブネットに配置されてクラウドサービス等とちゃんとIPレベルでは疎通できます。
まとめ
Virtual MachineもVirtual NetworkもまだまだPreviewであとちょっと、というところはありますが、結構いろいろ複雑な構成も取れるようになっています。
何事も工夫次第ですね。