Azure Functions をリモートデバッグしながら編集する on Visual Studio 2015

Azure FunctionsがGAしたところで、Visual StudioのFunctions向け拡張機能はまだ出てきていませんが、それまでにVisual Studio(拡張機能)が持っている便利な機能を何か使う方法はないか?ということで。

必要なもの

最初に・・・

Visual Studio 2015を起動していきなりサーバーエクスプローラーを起動します。
出てない場合は、メニュー>表示>サーバーエクスプローラー

資格情報の入力

Azureサブスクリプションが関連付けられているアカウントでログインしておきます。何も出ない場合は、(サーバーエクスプローラー>Azure>コンテキストメニューから)サブスクリプションの管理を開きチェック状態を確認します。
2016-12-01_03

リモートデバッグ

サーバーエクスプローラーのAzureノードから、AppService→「Function App」があるリソースグループ>Functionsのアイコンからコンテキストメニューを表示するとデバッガーのアタッチというメニューがあります。これを選択します。

2016-12-01_04

しばらく待ちます。これはAppService上でリモートデバッガを起動してそこを経由させてアタッチとなるので、少し時間がかかります。

2016-12-01_05

上の画像は、Kuduのプロセスで見た感じ。
リモートデバッグ用のプロセスが起動しています。
これはポータルでは、こんなところに相当します。

2016-12-01_06

上記はポータルのAppService上のアプリケーションの設定にある一部です。

さて、アタッチできて満足しててもよいのですが、
ブレークポイントで息の根・・・じゃなかった、プログラムをブレークしてみたいですね。

リモートファイルを開く

先ほどのサーバーエクスプローラーから、csxファイルを選んでコンテキストメニューを表示して、開くを選びます。

2016-12-01_07

さて開けたところで、デバッグへ。

デバッグ(ブレークポイント)

開いたファイルにブレークポイントを設定します。
2016-12-01_08

このとき、シンボル、モジュールが読み込まれていない状態になっていますが気にしないことにします。というのも、Functionsは常時起動しているわけではないからです。なので、アクセスさせてみましょう。

実行!(ポータル)

ポータルから、テスト実行ボタンを押してみます。
(このほうがリモートしてる感じ出るからね

2016-12-01_09

ポチっと

2016-12-01_10

きたーっ!!

2016-12-01_11

 

というわけで、ここまでです。

ここからデバッグした状態のままリモートファイルを編集することもできます。
インテリセンスは不完全ですが、テキストエディタよりはいいでしょう。
何よりデバッグした状態で、変数を確認することができますので、
想定で実装するよりも、ずっと捗るんじゃないかと思います。

※編集した場合、保存して、同期をしないとサーバーには反映されません。

アドベントカレンダーが始まって、盛り上がってきていますが、正式なToolには期待しつつも、どんなものか?触ることができたら、またきっかけになれば幸いです。

 

Visual Studio 2015 拡張機能 Cloud Explorer

Visual Studio 2017 RCが出ているところにあえて2015からある拡張機能の紹介ですが、この拡張機能は個人的に気に入ってます。

Cloud Explorer for Visual Studio 2015

イイところ

1.ツリー構造をリソースの種類、リソースグループ別でみることができる。

いろいろ試してとかやったり、目的があって作っていたりするときにリソースグループを使うことで、そこにデプロイしているリソースをグループのように見ることができます。後から一括削除とかできたりするので、リソースグループは使うと便利

2.操作するボタンが大きく、リモートデスクトップ環境(iPhone、Android、Mobile)などで操作しやすい

ただ、ほとんど同じことは、サーバーエクスプローラーからできます。
さらにサーバエクスプローラーでしかできないこともあります。
なので、これだけあればいいというものではないですね。

 

デモをするとか、見せるときは文字が大きく見やすいかも。
リソースグループをリソースの種類よりも上位の階層で分類してくれるってのは、いろいろ試してるときは結構助かります。

 

Azure Functions ローカル Git リポジトリ

Azure Functionsのソースを、ローカルGit管理にしてしまう方法

少し試してポータルで編集している分には、それはそれでいいのですが
慣れた馴染んだエディタで編集したいとき、ローカルマシン上に持っていきたいというときにいいのかな?ということで。

1.ポータルから ローカル Git リポジトリ 設定

ポータルから対象のFunction Appを開き、
Function App の設定>継続的インテグレーションの構成

2016-11-26-4

 

デプロイのブレードが表示されるのでセットアップ

2016-11-26-5

 

ローカル Git リポジトリを選択

2016-11-26-6

ユーザー名パスワードを求められたら、
入力して忘れないようにしておきます。
(2回目以降入力が省略された!

2.ローカルマシンでclone

gitが入っている前提で

[FunctionAppName]には、作成時に入力したFunctionAppの名前を入れます

>git clone https://[FunctionAppName].scm.azurewebsites.net/

2016-11-26-7

忘れないようにしていたユーザー名とパスワードを入力

Cloning into '[FunctionAppName].scm.azurewebsites.net'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
Checking connectivity... done.

 

[FunctionAppName].scm.azurewebsites.net
というディレクトリが作成されていたらできあがり!

vscodeで開いた状態
ちゃんとコミットできる状態になってた

2016-11-26-8

注意点

ローカルGitリポジトリを設定すると、ポータルから編集できなくなります。

その場合、新しい関数を追加したいとき地道にファイルを追加するか。
一度ローカルGitリポジトリを無効にするか。
Azure-Functions-Cliを使う必要がありそうです。

※ローカルGitの切断・セットアップを繰り返しているうちに何かおかしくなった
※Visual Studio拡張機能が待ち遠しい

 

azure-functions-cli installと実行を試してみた

azure-functions-cliとはなんぞや?となるかもしれませんが、
Azure FunctionsがGAされたアナウンスの中でツールについての話がありました。

announcing-general-availability-of-azure-functions

We now have support for creating, running, and debugging Functions locally on Windows, with the beta Azure Functions CLI. For JavaScript Functions on NodeJS, the CLI integrates with Visual Studio Code and sets up debug targets automatically. While the CLI currently only works on Windows, we’re working on support on Mac and Linux.

ということで、NodeJSで動くものですよと。
ひとまずWindowsは動くからと。
私自身NodeJSをほとんど扱ったことがありませんので、何か変なところがあれば教えてください。
というわけで、まずは入れてみました。

1.NodeJSのインストール

nodejs.org からダウンロード。ひとまずv6.9.1 LTSを入れた。
特に何かあるわけでもなく。

2.npmでインストール

npm i -g azure-functions-cli

しばらくまって、完了。

 

3.CLI funcコマンド

まずは、公式に通り「func」「azfun」「azure-function」
のうち短いのでfunc

>func
Azure Functions Cli (1.0.0-beta.5)
Function Runtime Version: 1.0.0.0
Usage: func [context] [context] <action> [-/--options]

Contexts:
azure        For Azure login and working with Function Apps on Azure
function     For local function settings and actions
functionapp  For local function app settings and actions
host         For local Functions host settings and actions
settings     For local settings for your Functions host

Actions:
init    Create a new Function App in the current folder. Initializes git repo. Aliases: init, create
run     Run a function directly

1.0.0-beta.5というバージョン情報、それからこの先に渡すコンテキストの情報が出てきました。

4.作る

最初にフォルダーを作り、カレントディレクトリにして

>func init
Writing .gitignore
Writing host.json
Writing appsettings.json
Initialized empty Git repository in C:/******/Source/samples/.git/

という感じで、gitリポジトリとして初期化され、
host.jsonとappsettings.jsonができてます。

次にfunctionを作ります。

>func function create
     _-----_
    |       |    ╭──────────────────────────╮
    |--(o)--|    │   Welcome to the Azure   │
   `---------´   │   Functions generator!   │
    ( _´U`_ )    ╰──────────────────────────╯
    /___A___\   /
     |  ~  |
   __'.___.'__
 ´   `  |° ´ Y `

? Select an option...
  1) List all templates
  2) List templates by language
  3) List templates by type
  Answer:

という形でyeomanが起動しました。

1)ですべてのテンプレート
2)で開発言語別のテンプレート
3)で種別のテンプレート
のようです。

2を選ぶと

? Select an option... List templates by language
There are 8 languages available
? Select a language...
  1) Batch
  2) C#
  3) F#
  4) JavaScript
  5) Python
  6) Php
  7) PowerShell
  8) Bash
  Answer:

こんな感じに、4) JavaScriptを選びました。

? Select from one of the available templates...
  FaceLocator-JavaScript
  GenericWebHook-JavaScript
  GitHubCommenter-JavaScript
> GitHubWebHook-JavaScript
  HttpGET(CRUD)-JavaScript
  HttpPOST(CRUD)-JavaScript
  HttpTrigger-JavaScript
(Move up and down to reveal more choices)

ひとまず GitHubWebHookを選ぶ

? Enter a name for your function... (MyAzureFunction)

名前を聞かれるので、とりあえず「GitHubWebHookSample」と入れた
そうすると「GitHubWebHookSample」というディレクトリができてました。
中はこんな感じ

function.json
index.js
sample.dat

5.動かす

>func host start

とすると、権限確認のダイアログが出て続けると以下のような状態に

Listening on http://localhost:7071/
Hit CTRL-C to exit...
Reading host configuration file '***\Source\samples\host.json'
Generating 1 job function(s)
Starting Host (HostId=44d3feb53b1b49439bf13fdc57c64832, Version=1.0.0.0, ProcessId=29564, Debug=True)
Found the following functions:
Host.Functions.GitHubWebHookSample

Job host started
Http Function GitHubWebHookSample: http://localhost:7071/api/GitHubWebHookSample
File change of type 'Changed' detected for '***\Source\samples\data\functions\sampledata'
Host configuration has changed. Signaling restart.
Stopping Host
Job host stopped
Reading host configuration file '***\Source\samples\host.json'
Generating 1 job function(s)
Starting Host (HostId=44d3feb53b1b49439bf13fdc57c64832, Version=1.0.0.0, ProcessId=29564, Debug=True)
Found the following functions:
Host.Functions.GitHubWebHookSample

Job host started
Debugger listening on [::]:5858

一度ホストが上がって、ファイルの変更を検出して再び動いているようです。
この後、いろいろいじってみるとそのたびに起動しなおしたりしてました。

vscodeを起動して、デバッグを構成

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Attach to Process",
            "type": "node",
            "request": "attach",
            "port": 5858
        }
    ]
}

デバッグにアタッチで成功。
ブレークポイントを設定して、
「http://localhost:7071/api/GitHubWebHookSample」にアクセスしてみます

すると・・・

2016-11-26-2

 

 

無事に動きましたとさー
ほっ・・・

Azure Functions を使ってみる

Microsoft Azureのサブスクリプションを持ってる人

https://functions.azure.com/signin

 

ポータルから作る

https://portal.azure.com/#create/Microsoft.FunctionApp

Microsoft Azureのサブスクリプションを持っていない人(1時間限定の無償お試し)

https://functions.azure.com/try

※Microsoftアカウント、Google、 Facebook いずれかのアカウントが必要

 

 

Bot-as-a-Serviceなるものが・・・

どうも、BotFrameworkを用いて、
Functionsで動作するBot as a Serviceなるものが出たようす。

https://azure.microsoft.com/ja-jp/blog/microsoft-azure-announces-industry-s-first-cloud-bot-as-a-service/

合わせて、FunctionsもPreviewが取れてますね。

https://azure.microsoft.com/ja-jp/blog/announcing-general-availability-of-azure-functions/

これは明日が楽しみ!

AppVeyorのデプロイ先にMicrosoft Azure Blob Storageを使ってみたメモ

AppVeyorのドキュメントを眺めていて、デプロイの先としても使える場所に、AzureのStorageがありました。
Deploying to Azure blob storage

というわけで、AzureStorage(Microsoft Azure Storage の概要)に対して
デプロイしてみるメモです。

Microsoft Azure Storage

で、実際に使うとして、Azure Blob Storageっていうものになりますと、
このBlobには、「ホット」「クール」の種類があります。
Azure Blob Storage: ホット ストレージ層とクール ストレージ層
料金の違い)

ざっくりでいうと、クールは普段アクセスしないバックアップなどの用途に
ホットは、頻繁にアクセスする用途にという私の解釈です。
価格でみても、クールは容量単価が安く、
ホットはトラフィック、操作の単価が安くなっているようです。

デプロイするリソースは、頻繁に不特定多数にアクセスされる前提ですので
ホットにしてみようかと思います。

Azure側の準備

まずは、ポータルでBlobStorageを作ります。
+新規 > データ + ストレージ > ストレージ アカウント

名前:適当に入れますが、ホスト名に相当しインターネット上で一意である必要があります
デプロイモデル:リソースマネージャー
アカウントの種類:BLOBストレージ
アクセスレベル:ホット
ほか、お好みで。また、リソースグループは、その作業、やりたいこと、目的に応じて作っておいたほうが後で管理が楽です。(まとめて消すことができるとか)
作成で、しばらく待ちます・・・数十分もかかったことは今のところない

 

出来上がったら、さっそくコンテナ(実際にファイルを格納するもの)を作ります。
名前は適当にアクセスの種類はBlobです。そのほかのものは、今回使えないかと思います。

 

もう一つ、アクセスキーというのを控えておきます。
これは、書き込み削除のアクセスで、必要となる秘密のカギですので、見せないようにします。

どうでもいい余談ですが、これを間違って、公開してしまってひどい目にあうという話もあったりなかったりします。
過去、GitHubにあげてしまったとき、有志の人が機械的(?)にメール連絡してくれました。
(そのときは、サンプルのものでしたので、リポジトリごと削除した。)
もう一つ、キーを再生成するという方法もあります。

というところで、Azure側は準備完了!

AppVeyor側の準備

大きく2つあるように見えました、
プロジェクトごとのデプロイ先として設定するか、
Environmentとして全体に設定するか。

で、今回はEnvironmentとして設定しました。

Provider:Azure Blob Storage
Environment name:お好み
Storage account name:Azure側で作成したアカウント名
Storage access key:控えておいた秘密キーの1または2どちらか
Container name:Azure側で作成したコンテナ名
Folder:今回は何も入れない
Artifacts:デプロイしたい生成物の定義名

ビルド!

ビルドは成功!そしてアップロードされたらしきログがある!

追記(ここでProjects>[project]>Deployments>New Deployment)

Azureのポータル側でも確認

すっきり!これで、最新のpublish生成物を公開できるようになりました。

 

2016/07/23 追記
どうやら、自動にできたつもりが、手動でやったものが残っていただけらしい・・・(確認怠り
ひとまず、手動で
Projects>[project]>Deployments>New Deployment
でアップロードは確認した。

自動化するために必要なこと。
SettingsのDeploymentにEnvironmentsを設定する

Docker Cloud触ってみた(With Micorsoft Azure)

Docker-cloudを触ってみたメモ書き
Nodes、Services、Stacksというコンポーネントに分かれている様子。
Welcomeというチュートリアルがあるので、それに従っていくだけで概ね実行させるまではなんとかなった。

Microsoft AzureをDocker-Cloudで扱えるようにする

まず、Docker-CloudがAzureを制御するための入り口となる証明書をダウンロード。
それを
https://manage.windowsazure.com/
にアクセスして、アップロードしておく。こうすることで、Docker-CloudがAzureの中のリソースを制御できるようになる。そして、対象となるサブスクリプションのIDを取得(わけのわからないGUIDみたいなやつ)。それを、Docker-Cloudに渡してあげるという流れ。

Nodes

Nodesという、Dockerの本体そのものをまず作る。これがServicesを詰め込む居住スペースになる。当然、親(今だとAzureの仮想マシン)のマシンによってその空間は変わるだろうけれども(メモリとかCPUとか)。Azureのサブスクリプションを関連付けておけば、そこから自動的に仮想マシンを立ち上げてくれる。ただしこれはASM(クラシック仮想マシン)となる。データディスクがホストキャッシュなしで接続されていた(ノード用かな?)。また、2ノード以上は、課金が必要な様子。

Services

Servicesは、Nodesに詰め込むコンテナとなるサービスを定義する。これはDockerHubにあるものを使うことができる。自分用のPrivateなものもここで使える。このサービスは、公開ポートなど通常コマンドでやることも定義しておくことができる。

Deploy

定義したサービスを、Node上で動かすことになる。このときにServiceで定義された必要なポートは、Azure上のエンドポイントにも自動的に追加され開放された。また、サービスを変更した場合などは、Redeployすることができる。

 

Stacks

定義したServiceを組み合わせたものとなる様子。一括でデプロイできる様子。チュートリアルのものしか見てないけれども、他のサービスにリンクすることができるっぽい。

メモ

  • Nodeを削除したら、Azure上の仮想マシンも削除された。
  • DockerCloud上からRedeployすると、ポートの開放もやり直してくれる様子。
  • ロードバランスは、それ用のサービスを使うか、DNSを使うか。
  • 複数ノードのデプロイメントストラテジーとか試してみたいけど、課金して怒られるのは嫌なので、ぐっとこらえた。
  • 独自のServiceのリンクをどうやって動的に結ぶか
  • そういえば、DockerのホストOSには入れない。

JAZUG 札幌支部第10回勉強会 ~祝!! きたあず2周年記念勉強会~

無事に終了しましたー

そして、ひさしぶりにBlog更新

今回、登壇がメインで、ほとんどスタッフ業務にかかわらなかった分、いろいろ聞けて良かったー(懇親会参加される方はお金払ってください。というくらいしかしていない。ごめんなさい。ごめんなさい・・・)

今回は、きたあず2名、福岡から2名、SendGridの方が1名のセッションでした。

1.BaaSとAzureを絡めたお話(仮)

前半はかるたの話で、いつの間にかWebな話に。

2.Webアプリと他のサービスを絡めてみよう!

自分のセッションは、がんばった!!・・・として。Webアプリの話はできたので、よかったけど、時間があればApplicationInsghtsで、PowerBIのダッシュボード表示を説明したかった!!

 

3.Web制作的にWebAppsを活かす使い方

実際に使った話で、黒い画面がコワイ人でも安心して使えるというWebアプリサービス。

非常にわかりやすいセッションでした!そんな視点でAzure見たことなかったので、IaaSとか出したら、大変なことになりそうと。いろいろ考えさせられました。

4.PaaSを使い倒すためにApp Serviceのおさらいしよう

おさらいのあと、API中毒になればいい!と言い残し、気付いたら登壇者はとうじょうのぞみさん(仮)に変身していて、ライブプログラミングのうえ去っていかれました。

5.Azureでサードパーティサービスを活用する。SendGridを例に。

メールサービスの在り方が変わってきてるよねー。から始まり、スパムメールとして扱われてしまった話、AzureのMarketPlaceからでもサービス開始できるよーと。ただしアカウントは公式サイトで作ったものと違うので注意してねーとのこと。さっそく作ってみましたが、まだ何も活用はしてません。API使えるってことで、SchedulerやらWebJobやら、自動処理の結果を返すものとして組み合わせてみたいですね。

発表資料
Twitterのまとめ
余談

ApplicatoinInsightsをPowerBIに出してましたが、結果報告していませんでしたので、ここで。

人気のあった例外は、Null参照の16回!

ログイン者のアクセストップは67回!

・・・みなさんストレスたまってなくて何よりです!

デバイスは、

Windows10、Windows7、Ubuntu、Windows8.1、OSX10.11、なぜか、WindowsPhone10.0、OSX10.10の順でした。

これは、サーバーサイドにいろいろ埋め込めるってのが面白いサービスですねー

 

ちなみに、上は私の独自ダッシュボードですが、PowerBIのテンプレートのApplicationInsghtsで作ると、日ごとに情報を集約してくれるレポートとダッシュボードがありました。こんな感じ。

さいご

次回は未定です。

個人的に少し回数増えてもいいのじゃないかとも思いますが、アンケートの結果も踏まえてまたよりよくしていきたいなぁときっとおそらくスタッフ一同思っているんじゃないかと思います。

それでは!

 

Office365 独自ドメインをAzureDNSで設定したメモ – PowerShell

Office365で外部DNSを利用して、独自のドメインを利用することができると。
ポータルからはまだよく見えてなかったけど存在しているAzureDNSを使って設定したメモをマスクしながらここに残しておきます。
ただ、最近はポータルからも設定できるようになってきましたので、そもそもこれでやるメリットはそこまでないと思う。テンプレート化してというのもあるけど、ARMもあるわけで、メモ程度と考えてください
課金形態は、クエリ単位のものなので、利用者が極端に多い場合は、DNSサーバー使ったほうがいいかもしれない。けど可用性や負荷の面倒から解放されるというの機能も捨てがたいかもしれない。
また、AzureDNSは一つのゾーンで、4つのDNSサーバーを持つ様子。
おそらくは、それぞれの地域でサーバーが存在していると思われる。
(多分、それぞれの地域でIPにResolveすればわかる気がするけど、試してはいない)
最初にDNSゾーンの作成、その後レコードセットと言われるDNSのレコードを登録していきました。PowerShellの参考として考えてください。

[ゾーンの作成と確認]

New-AzureDnsZone -Name [ドメイン名] -ResourceGroupName [リソースグループ名]
Get-AzureDnsRecordSet -ZoneName [ドメイン名] -ResourceGroupName [リソースグループ名]

[レコードセットの作成 – MX]

$rsmx = New-AzureDnsRecordSet -Name "@" -RecordType "MX" -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Ttl 3600
Add-AzureDnsRecordConfig -RecordSet $rsmx -Exchange [mailホスト名].mail.protection.outlook.com -Preference 0
Set-AzureDnsRecordSet -RecordSet $rsmx

[作成済みの場合]
$rsmx = Get-AzureDnsRecordSet -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Name "@" -RecordType "MX"

[レコードセットの作成 – TXT]

$rstxt = New-AzureDnsRecordSet -Name "@" -RecordType "TXT" -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Ttl 3600
Add-AzureDnsRecordConfig -RecordSet $rstxt -Value "v=spf1 include:spf.protection.outlook.com -all"
Set-AzureDnsRecordSet -RecordSet $rstxt

[作成済みの場合]
$rstxt = Get-AzureDnsRecordSet -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Name "@" -RecordType "TXT"

[レコードセットの作成 – CNAME autodiscover]

$rscnameautodiscover = New-AzureDnsRecordSet -Name "autodiscover" -RecordType "CNAME" -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Ttl 3600
Add-AzureDnsRecordConfig -RecordSet $rscnameautodiscover -Cname "autodiscover.outlook.com"
Set-AzureDnsRecordSet -RecordSet $rscnameautodiscover 

[作成済みの場合]
$rscnameautodiscover = Get-AzureDnsRecordSet -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Name "autodiscover" -RecordType "CNAME"

[レコードセットの作成 – CNAME lyncdiscover]

$rscnamelyncdiscover = New-AzureDnsRecordSet -Name "lyncdiscover" -RecordType "CNAME" -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Ttl 3600
Add-AzureDnsRecordConfig -RecordSet $rscnamelyncdiscover -Cname "webdir.online.lync.com"
Set-AzureDnsRecordSet -RecordSet $rscnamelyncdiscover 

[作成済みの場合]
$rscnamelyncdiscover = Get-AzureDnsRecordSet -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Name "lyncdiscover" -RecordType "CNAME"

[レコードセットの作成 – CNAME msoid]

$rscnamemsoid = New-AzureDnsRecordSet -Name "msoid" -RecordType "CNAME" -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Ttl 3600
Add-AzureDnsRecordConfig -RecordSet $rscnamemsoid -Cname "clientconfig.microsoftonline-p.net"
Set-AzureDnsRecordSet -RecordSet $rscnamemsoid 

[作成済みの場合]
$rscnamemsoid = Get-AzureDnsRecordSet -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Name "msoid" -RecordType "CNAME"

[レコードセットの作成 – CNAME sip]

$rscnamesip = New-AzureDnsRecordSet -Name "sip" -RecordType "CNAME" -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Ttl 3600
Add-AzureDnsRecordConfig -RecordSet $rscnamesip -Cname "sipdir.online.lync.com"
Set-AzureDnsRecordSet -RecordSet $rscnamesip 

[作成済みの場合]
$rscnamesip = Get-AzureDnsRecordSet -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Name "sip" -RecordType "CNAME"

[レコードセットの作成 – CNAME enterpriseregistration]

$rscnameenterpriseregistration = New-AzureDnsRecordSet -Name "enterpriseregistration" -RecordType "CNAME" -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Ttl 3600
Add-AzureDnsRecordConfig -RecordSet $rscnameenterpriseregistration -Cname "enterpriseregistration.windows.net"
Set-AzureDnsRecordSet -RecordSet $rscnameenterpriseregistration 

[作成済みの場合]
$rscnameenterpriseregistration = Get-AzureDnsRecordSet -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Name "enterpriseregistration" -RecordType "CNAME"

[レコードセットの作成 – CNAME enterpriseenrollment]

$rscnameenterpriseenrollment = New-AzureDnsRecordSet -Name "enterpriseenrollment" -RecordType "CNAME" -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Ttl 3600
Add-AzureDnsRecordConfig -RecordSet $rscnameenterpriseenrollment -Cname "enterpriseenrollment.manage.microsoft.com"
Set-AzureDnsRecordSet -RecordSet $rscnameenterpriseenrollment 

[作成済みの場合]
$rscnameenterpriseenrollment = Get-AzureDnsRecordSet -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Name "enterpriseenrollment" -RecordType "CNAME"

[レコードセットの作成 – SRV _sipfederationtls._tcp]

$rssrv_sipfederationtls_tcp = New-AzureDnsRecordSet -Name "_sipfederationtls._tcp" -RecordType "SRV" -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Ttl 3600
Add-AzureDnsRecordConfig -RecordSet $rssrv_sipfederationtls_tcp –Priority 100 –Weight 1 –Port 5061 –Target "sipfed.online.lync.com"
Set-AzureDnsRecordSet -RecordSet $rssrv_sipfederationtls_tcp

[作成済みの場合]
$rssrv_sipfederationtls_tcp = Get-AzureDnsRecordSet -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Name "_sip._tls" -RecordType "SRV"

[レコードセットの作成 – SRV _sip._tls]

$rssrv_sip_tls = New-AzureDnsRecordSet -Name "_sip._tls" -RecordType "SRV" -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Ttl 3600
Add-AzureDnsRecordConfig -RecordSet $rssrv_sip_tls –Priority 100 –Weight 1 –Port 443 –Target "sipdir.online.lync.com"
Set-AzureDnsRecordSet -RecordSet $rssrv_sip_tls

[作成済みの場合]
$rssrv_sip_tls = Get-AzureDnsRecordSet -ZoneName "[ドメイン名]" -ResourceGroupName "[リソースグループ名]" -Name "_sip._tls" -RecordType "SRV"

そして、最後に確認!

Get-AzureDnsRecordSet -ZoneName [ドメイン名] -ResourceGroupName [リソースグループ名]

追記 2016/02/17

Azure No1の方がポータルでの設定をまとめていらっしゃいました

Azure DNSの管理(ポータル編)