Windows Azure

Windows Azure Powershellとは

GitHubリポジトリ:https://github.com/WindowsAzure/azure-sdk-tools

開発者と管理者がWindows Azureアプリケーションを管理したり、デプロイしたり、開発するためのPowerShellコマンドレットです。

SQL Azure関連の機能

  • データベースサーバー、データベース、FirewallルールのCRUDに対応
  • データベースサーバーの容量情報の取得
  • データベースサーバーのサービスs指定のGet/Setに対応

更新履歴:参照元

2013.07.18 Version 0.6.17

  • 参照するWindows Azure SDKのバージョンを1.8から2.0へ更新しました。
  • サブスクリプションの所有者の場合、SQL Azure DatabaseのCRUDコマンドレットは、SQL認証不要になりました
  • Get-AzureSqlDatabaseServerQuota は、指定したWindows Azure SQL Databaseサーバーの容量情報を取得するためのコマンドレットです。
  • SQL Azureサービスの対象をサポートしました。
    ・Get-AzureSqlDatabaseServiceObjective は、Windows Azure SQL Databaseサーバーを指定するためのコマンドレットです。
    ・Set-AzureSqlDatabase にWindows Azure SQL Databaseを指定するための -ServiceObjective パラメーターを追加しました。
  • Get-AzureWebsite のローカルキャッシュ問題を修正しました。新しい Get-AzureWebsite は常に最新のWebサイトの情報を返します。

2013.06.24 Version 0.6.16

  • Add-AzureEnvironment は、Windows Azure Packのようにカスタマイズ環境を追加するコマンドレットです。
  • Set-AzureEnvironment は、Windows Azure Packのようにカスタマイズ環境をセットするコマンドレットです。
  • Remove-AzureEnvironment は、Windows Azure Packのようにカスタマイズ環境を削除するコマンドレットです。
  • Webサイトコマンドレットは、Windows Azure Packをサポートしました。
  • Service Busコマンドレットは、Windows Azure Packをサポートしました。
  • Windows Azure Packをサポートした全てのコマンドレットに、WAPackプレフィックスを追加しました。「help WAPack」を使用すると、サポートする全てのコマンドレットを確認できます。
  • New-AzureQuickVM と Add-AzureProvisioningConfig に -NoWinRMEndpoint パラメーターを追加しました。
  • New-AzureSqlDatabaseServerFirewallRule に -AllowAllAzureSerivces パラメーターを追加しました。
  • 仮想マシン、クラウドサービス、Webサイトの診断周りの多くのバグを修正しました。

Windows Azure

Windows Azure Blogの「Alerting and Notifications Support for Windows Azure Applications」を一部抜粋して、ざっくり意訳した投稿です。

コンピュートサービス(クラウドサービス、仮想マシン、Webサイト、モバイルサービス)用の監視メトリックをベースにしたアラートを設定できるようになりました。
アプリケーションでアクティブに、もしくは緊急事態をメール通知できるようになりました。

この機能は、監視メトリックス上でアラートルールを作成できます。重大事態のルールを定義し、アラートを作成します。アラートルールを作成すると、サービス管理者か共同管理者のメールにEメール通知するかどうかを選択することができます。

仮想マシンの監視メトリックスは、ホストOSから収集した性能情報(CPU使用率、ネットワークI/O、ディスクRead bytes/sec、ディスクWrite bytes/sec)や設定した監視WebエンドポイントURLのレスポンス時間やアップタイムを対象とします。

クラウドサービスの監視メトリックスは、ホストOS、ゲストOSから収集した性能カウンターと設定した監視WebエンドポイントURLのレスポンス時間やアップタイムを対象とします。

アラートルールの作成

Windows Azure管理ポータルの左サイドメニューから「設定」を選択し、画面中央の「アラート」タブを選択します。アラートルールを作成するには「Add Rule」ボタンをクリックします。

たとえば、5分間CPU使用率が50%を超えていた場合にアラートとするルールを作成できます。
アラートルールを作成すると最初は「Not Activated」状態になります。
閾値を超過すると「Active」になり、アラート状態が解決すると「Not Active」状態に戻ります。

CPU使用率の値は、過去5分間の平均値で判例されます。値が閾値を境に、問題が発生したり解決したりして状態が変更するたびにアラートされます。

アラート状態は次のように一覧表示されます。

詳細を見たいときは、アラーとルールをクリックするとアラーと詳細ページに遷移します。

最近Activeになったアラートの履歴を参照することができます。

アラート通知

アラートがActiveになったときに、Windows Azure Alerts(alerts-noreply@mail.windowsazure.com)からメールでアラートを管理者から共同管理者のアドレスに通知されることができます。

メール通知はアラートの状態が変化した際(ActiveやNot Activeになったタイミング)に送信されます。

サブスクリプション毎に最大10個のアラートルールを作成できます。

まとめ

今回のアップデートにより、監視メトリックスをベースにしたアラートルールを簡単に作成でき、アプリケーションで注意が必要な状況が発生したり解決した際に通知できるようになりました。
プレビューの間は、サブスクリプションのアラートルールの作成制限数は10となっています。この上限に達した場合、新しいルールを作成するには1つ以上のルールを削除する必要があります。

ちなみに・・・

まだ、自分のサブスクリプションには表示されていない。。

image

Windows Azure

概要

スタートアップスクリプトはたいていの場合、ServiceDefinition.csdefで定義されます。
もしIISの設定を変更する必要があるなら、ロールのOnStartメソッドからスクリプトを実行する必要があります。この投稿は、configuration-driven定義を使用して設定するためのいくつかのサンプルを提供します。

本題

Windows Azureクラウドサービスで、ServiceDefinition.csdefで<Startup>エレメントを使用してロールスタート時に実行すべきスクリプトを指定します。
しかし、IISの設定に対して変更したりクエリを発行する場合には使用することができません。

Kevin Williamsが投稿したブログWindows Azure Roleアーキテクチャ)で説明されています。
スタートアップタスクが完了した後(Step7)まで、IISConfiguratorはIISウェブサイトを作成(Step8)しません。
IISに対して何か設定したくても、ServiceDefinition.csdefでは定義を設定することができません。IISConfiguratorが動作した後で処理する必要があります。

ロールのOnStartメソッド(Step9がトリガーで動作します)で処理します。通常、Process.Startコールを経由して処理します。

OnStartメソッドからプロセスとスクリプトを開始する定義を使用した単純なソリューションを書きました。フルコードは、ここからダウンロードできます。一部を抜粋して説明します。

このソリューションでは、ServiceConfiguration.cscfgで設定の定義をするためにスクリプトを指定しています。

<ConfigurationSettings>
  <Setting name="RoleStartupScripts" value="startup\test1.cmd!;startup\test2.cmd;Powershell.exe startup\test3.ps1" />
    ....
</ConfigurationSettings>

この例では、一つ目のファイル名の後ろに「!」マークを書いています。

これは次のスクリプトを実行する前に、一つ目のファイルのプロセスが完全に終了するのを待つ必要があることを定義しています。「!」マークが無い場合は、処理が完了するのを待たずに次のスクリプトを実行することができます。

これらのスクリプトは権限の昇格が必要ありません。権限の昇格が必要な場合、ServiceDefinition.csdefファイルで<Runtime executionContext="elevated" />を設定します。

次に、プロセスを自動実行させるためにRoleEntriPointを拡張する抽象クラスStartupScriptEntryPointクラスを書きました。

public abstract class StartupScriptRoleEntryPoint : RoleEntryPoint
{
    public override bool OnStart()
    {
        var startupScripts = CloudConfigurationManager.GetSetting("RoleStartupScripts");
        if (!String.IsNullOrEmpty(startupScripts))
        {
            var scriptList = startupScripts.Split(';');
            foreach (var script in scriptList)
            {
                bool waitForExit = false;

                string scriptCommandLine = script;
                if (script.EndsWith("!"))
                {
                    scriptCommandLine = script.Substring(0, script.Length - 1);
                    waitForExit = true;
                }

                var args = CmdLineToArgvW.SplitArgs(scriptCommandLine);

                var processStartInfo = new ProcessStartInfo()
                {
                    FileName = args[0],
                    Arguments = string.Join(" ", args.Skip(1).ToArray()),
                    WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory,
                    UseShellExecute = true,
                };
                var process = Process.Start(processStartInfo);
                if (waitForExit)
                {
                    process.WaitForExit();
                }
            }
        }
        return base.OnStart();
    }
}

デフォルトのRoleEntryPointの代わりにStartupScriptRoleEntryPointからWebRoleクラスを更新します。ほかにはコードの変更をする必要はありません。

public class WebRole : StartupScriptRoleEntryPoint
{
    public override bool OnStart()
    {
        // For information on handling configuration changes
        // see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.

        return base.OnStart();
    }
}

意訳元のBlog

Running scripts from a Windows Azure role’s OnStart method

Windows Azure

Windows Azureにデプロイしたアプリに、特定のIPからのみ接続できるようにアクセス制限をする必要がある場合、Windowsファイヤーウォールの設定をプログラム的に変更することて対応できます。スタートアップ時と(Windows Azureゲストエージェントがファイヤーウォールの設定を戻してしまうので)ロールの変更時に設定する必要があります。

アクセス制限をしたい理由

Windows AzureにPaaSクラウドサースをデプロイすると、インターネット上にデプロイされます。
これは、インターネット上で誰でもアクセスできることを意味します(アプリケーションの認証ロジックがあるかもしれませんが)。
通常は、これは問題にはなりません。アプリを構築しデプロイすれば使用できるようになるからです。
しかし、特定マシンからのみ接続できるようにアクセス制限をしたいことがあります。

  • 未リリースで、準備が整うまでは非公開にしたいアプリケーション。
  • 複数の異なる環境のデプロイ(開発、テスト用など)があって、アプリケーションの認証ロジックを変更せずに許可された人だけがアクセスできるようにしたい
  • アプリケーションがインターナルユーザーのみ使用することを想定して設計されており、リモートから接続を許可したくない。この場合は、個別ユーザー認証のためアイデンティティソリューションを使用すべきです。
  • RDPや別のポートで運用している管理画面のような管理サービスに追加のセキュリティを施したい場合。

IISの「IPアドレスおよびドメインの制限」では不十分?

IIS干すテッドサービスへのトラフィックのみをブロックすることに興味がある場合、
IISの「IPアドレスおよびドメインの制限」機能が選択肢の一つになります
(詳細は、Liam CavanaghのBlog参照)。デフォルトではインストールされていないので、「IPアドレスおよびドメインの制限(IP and Domain Restrictions)」昨日をセットアップスクリプトをでインストールする必要があります。

この解決策では、RDPなどのIIS以外の接続も制限したい場合不十分です。

Windows Firewallでのアクセス制限

この場合、Windows Azure VMのローカルで動作しているWindows Firewallの設定を変更してあげる必要があります。通常、特定IPアドレスとポートからのみアクセスを許可するように設定するのは簡単です。

ここでは、Windows Server 2012、Windows Azure osFamilyの3で動作する、Netowork Security PowerShellコマンドレットを使用して、80と3389の2つのポートへの接続を特定IPからのみ許可する設定例を提示します。

# SetFirewallRestrictions.ps1
$date = Get-Date
Write-Host "Updating firewall rule restrictions at " $date "`r`n"
$allowedRanges = ('3.2.1.0/24', '1.2.3.4') 
Get-NetFirewallPortFilter | ? LocalPort -eq '80' | Get-NetFirewallRule | Set-NetFirewallRule -RemoteAddress $allowedRanges
Get-NetFirewallPortFilter | ? LocalPort -eq '3389' | Get-NetFirewallRule | Set-NetFirewallRule -RemoteAddress $allowedRanges

このスクリプトが呼び出されてたときログを出力するように.cmdファイルでラップします。

rem SetFirewallRestrictions.cmd
cd /d %~dp0
Powershell set-executionpolicy remotesigned -force
Powershell .\SetFirewallRestrictions.ps1 >> SetFirewallRestrictions.out.log 2>> SetFirewallRestrictions.err.log

スタートアップタスクで呼び出されるように、ServiceDefinition.csdefファイルを設定します。セキュリティ設定を昇格するように<Runtime>エレメントで設定します。

<ServiceDefinition name="FirewallTest" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition" schemaVersion="2013-03.2.0">
  <WebRole name="WebRole1" vmsize="Small">
   ...  
    <Startup>
      <Task commandLine="Startup\SetFirewallRestrictions.cmd" executionContext="elevated" taskType="simple" />
    </Startup>
    <Runtime executionContext="elevated" />
  </WebRole>
</ServiceDefinition>

スタートアップタスクを設定すると、Windows Azureは自動的にファイヤーウォールの設定を更新し、IP制限を設定しインスタンスを起動します。ロースをスケールさせると、Windows Azure Gesut Agentは、Windows Firewallの設定を再作成します。IP制限を継続するには、ロールのトポロジーが変わった際に、スクリプトを再適用する必要があります。

アプリケーションがスケールしたときに、ファイヤーウォールルールを再適用するために、RoleEntryPointクラスで、RoleEnvironment.Changedイベントを使用します。

public class WebRole : RoleEntryPoint
{
    public override bool OnStart()
    {
        RoleEnvironment.Changed += RoleEnvironment_Changed;
        return base.OnStart();
    }

    void RoleEnvironment_Changed(object sender, RoleEnvironmentChangedEventArgs e)
    {
        if (e.Changes.Any(ch => ch is RoleEnvironmentTopologyChange))
        {
            var processStartInfo = new ProcessStartInfo(@"Startup\SetFirewallRestrictions.cmd");
            var process = Process.Start(processStartInfo);
        }
    }
}

元記事

MSDNブログ:Using Windows Firewall to restrict access to Windows Azure instances

Windows Azure

分散ストレージ技術を使用したNOSQL型のOSSであるriakをWindows Azure Virtual Machineにインストールする方法が紹介されていたので、ざっくり意訳してみた。

ざっくりとしたインストール手順は次の4ステップ。

  1. Windows Azure Previce Management Portalを使用してCentOSの仮想マシンを作成する
  2. PuttyやSSHを使用してCentOS仮想マシンに接続する
  3. シェルスクリプトを使用してCentOSとRiakを設定する
  4. Riakのクラスター化とテストデータをロードする

CentOS仮想マシンを作成する

Windows Azure Virtual Machine Preview機能をサインアップする。

仮想マシンをWindows Azure上に作成するには、Windows Azure Virtual Machine Previewに申し込む必要があります。もし、まだWindows Azureアカウントを持っていないなら、フリートライアルアカウントをサインアップすることもできます。

  1. https://account.windowsazure.com/ に移動し、Windwos Azureアカウントでインストールする
  2. アカウント→プレビュー機能をクリックする。Virtual Machine & Virtual Networkをクリック。
    image

CentOS Linuxが動作する仮想マシンを作成する

  1. Windows Azure Preview Management PortalにWindows Azureアカウントでログインする
  2. Managementポータルで、ページの左下の「+NEW」をクリックする。
    image
  3. [Compute]-[Virtual Machine]を選択。
    image
    [From Gyallery]を選択する。
    image
    [PLATFORM IMAGE]-[OpenLogic CentOS 6.2]を選択する。右下の矢印ボタンをクリックする。
    image
  4. VM Configurationページで、次の情報を設定します。
    CONNECT TO EXISITING VIRTUAL MACHINE
    Virtual Machine Name:「testlinuxvm」
    User Name:「newuser」
    Password:強力なパスワードを入力
    Confirm Password:パスワードの再入力
    ドロップダウンリストからサイズを選択する
    image
  5. VM Modeページで、次の情報を設定します。
    STANDALONE VIRTUAL MACHINEを選択する。
    DNS名に、任意のDNS名を入力する。たとえば、「testlinuxvm」
    Storage Accountで、Use Automatically Generated Storage Accountを選択する
    REGION/AFFINITY GROUP/VIRTUAL NETWORKで、仮想マシンのイメージをホストするリージョンを選択する。
  6. VM OptionページのAvailability Setで、noneを選択する
  7. Windows Azure上に仮想マシンの準備が完了します。

エンドポイントの設定

Windows Azure 仮想マシンにリモート接続するには、必ずエンドポイントを設定しなければなりません。

  1. Management Portalで、Virtual Machineを選択し、新しい仮想マシン名を選択し、Endpointを選択します。
    image
  2. エンドポイントの設定ページの下部の「Edit Endpoint」ボタンを選択します。パブリックポート22番のSSHエンドポイントの設定をします。
    image
  3. [Add Endpoint]ボタンを選択し、次の情報を設定します。
    riak_web
    TCP
    8098
    8098
    image

CentOS仮想マシンにPuttyかSSHで接続する

SSHかPuttyを使用して設定したEndpointで仮想マシンに接続します。
Linux/Macユーザー

$ ssh newuser@testlinuxvm.cloudapp.net -o ServerAliveInterval=180

シェルスクリプトを使用してCentOSとRiakの設定をする

次のコマンドを入力する。

sudo su –

curl –s https://github.com/glickbot/riak_on_azure/blob/master/azure_install_riak.sh|sh

参考情報

https://github.com/glickbot/riak_on_azure