<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Junichi Anno's blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/junichia/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/junichia/feed.xml</link>
    <description>フィールドSEあがりの安納です</description>
    <lastBuildDate>Mon, 28 Aug 2017 10:06:18 GMT</lastBuildDate>
    <language>ja</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>PowerShell で AccessToken を使用して Azure にログインする</title>
      <link>https://docs.microsoft.com/archive/blogs/junichia/powershell-%E3%81%A7-accesstoken-%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6-azure-%E3%81%AB%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%99%E3%82%8B</link>
      <pubDate>Mon, 28 Aug 2017 19:06:18 GMT</pubDate>
      <dc:creator><![CDATA[junichia]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/junichia/?p=12485</guid>
      <description><![CDATA[]]></description>
      <content:encoded><![CDATA[]]></content:encoded>
    </item>
    <item>
      <title>【TIPS】Azure Function 内で使用する秘密の文字列をソースコードに直書きしない</title>
      <link>https://docs.microsoft.com/archive/blogs/junichia/%E3%80%90tips%E3%80%91azure-function-%E5%86%85%E3%81%A7%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E7%A7%98%E5%AF%86%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%B3%E3%83%BC</link>
      <pubDate>Mon, 30 Jan 2017 19:59:01 GMT</pubDate>
      <dc:creator><![CDATA[junichia]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/junichia/?p=12475</guid>
      <description><![CDATA[全然関係ないですけど、2 級のバッチテストにシュテムターンが入ってたんですよ。知ってました？聞いてないよ。シュテムターンで落とされました。。。全審査員が 64 でしたww（恥）内緒ですけどorz...]]></description>
      <content:encoded><![CDATA[<p><font color="#ff0000" size="2">全然関係ないですけど、2 級のバッチテストにシュテムターンが入ってたんですよ。知ってました？聞いてないよ。シュテムターンで落とされました。。。全審査員が 64 でしたww（恥）内緒ですけどorz 超ブルーです。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">以下の投稿で、Azure Functions の基本的な使い方を紹介しましたが、1 点心残りがあります。</font></p> <p><font size="3">※URLが日本語になっている。。。ほんとすみません。。。</font></p> <blockquote> <p><a title="https://blogs.technet.microsoft.com/junichia/2017/01/27/azure-functions-から定期的に-microsoft-graph-にアクセスする/" href="https://blogs.technet.microsoft.com/junichia/2017/01/27/azure-functions-から定期的に-microsoft-graph-にアクセスする/"><font size="3">https://blogs.technet.microsoft.com/junichia/2017/01/27/azure-functions-から定期的に-microsoft-graph-にアクセスする/</font></a></p></blockquote> <p><font size="3">それは以下の部分。</font></p> <blockquote> <p><font size="3">既存のコードを以下で上書きして下さい。コード内の Tenant ID、Client ID、Client Secret に先ほど控えた値を埋め込みます。Client Secret を生のまま埋め込むのはアレなので、本当はApp Service のパラメタに登録するのがよいのですが、ひとまずここでは生埋め込みでいっちゃいましょう。パラメタ登録についてはあとで説明します。</font></p></blockquote> <p><font size="3">力尽きてこの部分を解説していませんでした。ということで、TIPS として書き残しておきます。</font> <p><font size="3"></font>&nbsp; <p><font size="3">Client Secret のような、ソースコードに残したくない文字列は以下のような方法で簡易的に隠ぺいすることができます。</font> <p><font size="3"></font>&nbsp; <p><font size="3">1. Azure Funtions の設定ページを表示</font> <p><font size="3">2. 左下の「Functions App の設定」をクリック</font> <p><font size="3">　　</font><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image924.png"><font size="3"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb778.png" width="559" height="499"></font></a> <p><font size="3">3. 「App Serviceの設定に移動」をクリック</font> <p><font size="3">　　</font><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image925.png"><font size="3"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb779.png" width="568" height="568"></font></a> <p><font size="3">4. 「アプリケーションの設定」をクリック</font> <p><font size="3">　　</font><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image926.png"><font size="3"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb780.png" width="529" height="448"></font></a> <p><font size="3">5. 右ペインをスクロールダウンして「アプリ設定」を表示</font> <p><font size="3">　　</font><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image927.png"><font size="3"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb781.png" width="626" height="237"></font></a> <p><font size="3">6. キーと値を設定と保存</font> <p>　　<a href="https://msdnshared.blob.core.windows.net/media/2017/01/image928.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb782.png" width="772" height="58"></a> <p><font size="3">7. ソースコードの ClientSecret 部分を以下のように変更</font> <blockquote> <p><font size="3">string clientSecret = "ARWgqtsCVcZ/CBOYQMTAxxxxxxxxxxxxxxxxxxxxxxxx";<br>↓</font></p> <p><font size="3"><strong>string clientSecret = ConfigurationManager.AppSettings["clientSecret"]</strong></font></p></blockquote> <p><font size="3"></font>&nbsp; <p><font size="3">たったこれだけです。簡単ですね。</font> <p><font size="3">ただ、本当は Azure KeyVault を使って本格的に暗号化して隠してほしいわけです。</font> <p><font size="3">これについては次回。</font></p>]]></content:encoded>
    </item>
    <item>
      <title>Azure Functions から定期的に Microsoft Graph にアクセスする</title>
      <link>https://docs.microsoft.com/archive/blogs/junichia/azure-functions-%E3%81%8B%E3%82%89%E5%AE%9A%E6%9C%9F%E7%9A%84%E3%81%AB-microsoft-graph-%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B</link>
      <pubDate>Fri, 27 Jan 2017 17:56:16 GMT</pubDate>
      <dc:creator><![CDATA[junichia]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/junichia/?p=12095</guid>
      <description><![CDATA[Azure Functions って知ってますか ?  一言でいえば、Azure Automation の”開発屋さん版”です（って、適当すぎて怒られそうw）。 &nbsp; Azure...]]></description>
      <content:encoded><![CDATA[<p><font size="3">Azure Functions って知ってますか ? </font></p> <p><font size="3">一言でいえば、Azure Automation の”開発屋さん版”です（って、適当すぎて怒られそうw）。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Azure Automation は PowerShell スクリプトをクラウド上でジョブ化することができますが、Azure Functions は C#、F#、Node.js、Python、PHP Java などで書いたプログラムを WebJob として登録することができます。いずれも、サーバーを置くことなくジョブを実行することができる、いわゆるサーバーレスを実現するためのコンポーネントです。</font></p> <p><font size="3">PowerShell 好きの私的には Automation が好みではありますが、悔しいことに Functions のほうが高機能であることは否めません。何がいいって、入力や出力の定義が超簡単。これはAutomationにはない部分です。詳しくは以下の手順で。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3">Azure Functions の概要<br></font><a title="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-overview" href="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-overview"><font size="3">https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-overview</font></a></p></blockquote> <p>&nbsp;</p> <p><font size="3">ためしに使ってみようかってことで、ここでは、Microsoft Graph にアクセスしてユーザー一覧を取得し、これを Azure Blob に保存するジョブを作成してみることにします。</font></p> <p><font size="3">Microsoft Graph にアクセスするので Azure AD 側の設定も必要になります、そこも含めて手順を書いておきますので参考にしてください。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong><u>1.&nbsp; Azure Functions アカウントの作成</u></strong></font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Azure Portal&nbsp; の Marketplace で Function App を検索し、Function App をクリックしたら「作成」。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image741.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb640.png" width="676" height="379"></a></p><font size="3"></font> <p><font size="3"></font>&nbsp;</p> <p><font size="3">アプリ名等を入力して「作成」。アプリ名（ここでは GraphFromFunction.azurewebsites.net）は後でAzure AD にアプリ登録するときに使用します。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image766.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb664.png" width="230" height="370"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">作成した Function App に移動すると、以下のようにApp Service（Functions の本体）、ストレージ、App Service プランが作成されていることがわかります。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image767.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb665.png" width="625" height="271"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">App Service をクリックすると、Function App の簡易作成画面（クイックスタート）が表示されます。</font></p> <p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/2017/01/image768.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb666.png" width="598" height="435"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">今回は定期的に Microsoft Graph を実行するので「タイマー」を選択。言語は C#。</font></p> <p><font size="3">選択したら「この関数を作成する」をクリック。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image745.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb644.png" width="353" height="83"></a></p> <p><font size="3">初期画面が表示されたら、ためしに「実行」をクリックしてみる。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image746.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb645.png" width="831" height="535"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">ログに以下のような出力がされれば、ひとまず正常です。太字部分はコード内の <strong>log.info()</strong> によって出力された文字列です。</font></p> <p><font size="3">2017-01-26T13:45:00.009 Function started (Id=db7524a6-c10b-4d9a-9e44-b61e86898aa0) <br></font><font size="3">2017-01-26T13:45:00.009 <strong>C# Timer trigger function executed at: 1/26/2017 1:45:00 PM</strong> <br></font><font size="3">2017-01-26T13:45:00.009 Function completed (Success, Id=db7524a6-c10b-4d9a-9e44-b61e86898aa0) </font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">この関数はタイマーにバインドされているので、規定時間（5分）に1回、自動的に実行されます。</font></p> <p><font size="3">タイマーの間隔を変更するには、左側のメニューの「統合」をクリックします。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image769.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb667.png" width="682" height="236"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">右下に「スケジュール」と書かれたフィールドがありますが、これが間隔を示しています。</font></p> <p><font size="3">設定の方法は以下を参照してください。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3"><strong>0 */5 * * * *</strong></font></p></blockquote> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><a name="azure-functions-timer-trigger"></a><font size="3">Azure Functions におけるタイマー トリガー<br></font><a title="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-timer" href="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-timer"><font size="3">https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-timer</font></a></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong><u>2. Azure AD にアプリ登録する</u></strong></font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Function App からいったん離れて、今度は Auzre AD 側の設定をします。実は、AppService の認証/承認の設定からでもできるのですが、今回は何が行われているのかを理解してもらうために面倒な手順で進めてみます。</font></p> <p><font size="3">なお、Azure AD について詳しく知りたい方は以下のリンクがおすすめです。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><a name="user-content-administer-your-azure-ad-directory"></a><font size="3">Azure AD ディレクトリの管理<br></font><a title="https://github.com/Microsoft/azure-docs.ja-jp/blob/master/articles/active-directory/active-directory-administer.md" href="https://github.com/Microsoft/azure-docs.ja-jp/blob/master/articles/active-directory/active-directory-administer.md"><font size="3">https://github.com/Microsoft/azure-docs.ja-jp/blob/master/articles/active-directory/active-directory-administer.md</font></a></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Azure AD は旧ポータルで操作するのがセオリーですが（ほんとかよ）、ここはあえて新ポータルでいってみましょう。</font></p> <p><font size="3">ポータルで「Azure Active Directory」を開いてください。</font></p> <p><font size="3"></font>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image770.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb668.png" width="550" height="569"></a></p> <p>&nbsp;</p> <p><font size="3">「プロパティ」をクリックすると「ディレクトリ ID」が表示されるので、これを控えておきます。あとから、ソースコード内で「Tenant </font><font size="3">ID」として使用します。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong>TenantID = c9687145-521f-42e6-xxxx-xxxxxxxxxxxx</strong></font></p> <p>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image771.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb669.png" width="452" height="509"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">次に</font><font size="3">「アプリの登録」をクリックすると、指定したテナントに関連づけられているアプリケーションの一覧が表示されます。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image772.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb670.png" width="634" height="390"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">「追加」をクリックします。「アプリケーションの種類」は「Webアプリ/API」を選択。「サインオンURI」には、先ほど作成した Function App の URL(<a href="https://graphgromgunction.azurewebsites.net">https://graphgromgunction.azurewebsites.net</a>) を指定して「作成」をクリック。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image773.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb671.png" width="323" height="283"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">先ほどのアプリ一覧に、今作成したアプリが追加されるので、クリックして設定画面を開きます。</font></p> <p><font size="3">「プロパティ」をクリックして表示された情報から「アプリケーション ID」を控えておきます。これはあとから「Client ID」としてソースコード内で使用します。</font></p> <p><font size="3"><strong>ClientID = e67fff1a-d912-4bf4-xxxx-xxxxxxxxxxxx</strong></font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image752.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb651.png" width="832" height="497"></a></p> <p>&nbsp;</p> <p><font size="3">今度は「キー」をクリックします。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image774.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb672.png" width="616" height="152"></a></p> <p><font size="3">既定ではキーは作成されていません。</font></p> <p><font size="3">「機関」からキーの有効期限を選択し（ここでは「期限なし」）、「キーの説明」を適当に入力して「保存」をクリック。保存が完了すると「値」にキーが表示されるので、これを控えておきます。これがコード内で ClientSecret となります。キーが表示されたら、それを控えるまではページを移動しないでください。移動すると、安全のため二度と表示できなくなります。もしキーを忘れてしまったら、既存のものを消して新しくキーを作成すれば OK です。</font></p> <p><font size="3"><strong>ClientSecret = b/dmwx0WUnmljqxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</strong></font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image775.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb673.png" width="635" height="188"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">この作業で以下の3つの情報を収集することができました。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong>&lt;Tenant ID&gt; c9687145-521f-42e6-xxxx-xxxxxxxxxxxx</strong></font></p> <p><font size="3"><strong>&lt;Client ID&gt; = e67fff1a-d912-4bf4-xxxx-xxxxxxxxxxxx</strong></font></p> <p><font size="3"><strong>&lt;Client Secret&gt; = b/dmwx0WUnmljqxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</strong></font></p> <p><strong><font size="3"></font></strong>&nbsp;</p> <p><font size="3">これらの値を、この後の作業で Function App 内に埋め込みます。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Azure AD の最後の作業として、アプリケーションにディレクトリへのアクセス権を与えます。</font></p> <p><font size="3"></font>&nbsp;<font size="3">アクセス権が無いと、正しいトークンを取得しても以下のようなエラーが発生します。</font></p> <blockquote> <p><font color="#ff0000" size="3">2017-01-27T04:29:02.895 { <br>&nbsp; "error": { <br>&nbsp;&nbsp;&nbsp; "code": "Authorization_RequestDenied", <br>&nbsp;&nbsp;&nbsp; "message": "Insufficient privileges to complete the operation.", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "innerError": { "request-id": "96e44229-5f66-4057-b9ea-f864b5013097", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "date": "2017-01-27T04:29:01"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br> } </font></p></blockquote> <p>&nbsp;</p> <p><font size="3">「必要なアクセス許可」をクリックしてください。既定では以下のようになっています。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image755.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb654.png" width="765" height="343"></a></p> <h3>アクセス権について詳しく解説はしませんが、このままではアクセスすることができません。</h3> <p>&nbsp;</p> <blockquote> <h3>アクセス許可スコープ | Graph API 概念<br><a title="https://msdn.microsoft.com/ja-jp/library/azure/ad/graph/howto/azure-ad-graph-api-permission-scopes" href="https://msdn.microsoft.com/ja-jp/library/azure/ad/graph/howto/azure-ad-graph-api-permission-scopes">https://msdn.microsoft.com/ja-jp/library/azure/ad/graph/howto/azure-ad-graph-api-permission-scopes</a></h3></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">今回は、Function App がユーザーのログオンを介さずに直接 Graph API にアクセスします。そのため、アプリケーションに対して直接権限を与える必要があります。規定では「<strong>委任されたアクセス許可</strong>」なので、ユーザーがログオンしないとアクセスすることができないのです。</font></p> <p><font size="3">API 一覧にある<font size="3">「Windows Azure Active Directory」をクリックすると、以下のように権限一覧画面が表示されます。「アプリケーションのアクセス許可」の中にある「<strong>Read directory data</strong>」を選択してください。既定で与えられている「Sign in and read user profile」は必要ないので外してしまいましょう。アプリケーションには余計な権限を与えてはいけません。<font size="3">「保存」をクリックして保存しましょう。</font></font></font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image776.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb674.png" width="499" height="607"></a></p> <p>&nbsp;</p> <p><font size="3">以上で Azure AD 側の設定は完了です。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong><u>3. Function App の作成</u></strong></font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Function App の設定画面に戻ります。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image757.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb656.png" width="853" height="315"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">既存のコードを以下で上書きして下さい。コード内の Tenant ID、Client ID、Client Secret に先ほど控えた値を埋め込みます。Client Secret を生のまま埋め込むのはアレなので、本当はApp Service のパラメタに登録するのがよいのですが、ひとまずここでは生埋め込みでいっちゃいましょう。パラメタ登録についてはあとで説明します。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3">#r "Newtonsoft.Json"</font></p> <p><font size="3">using System.Net; <br>using System.Net.Http.Headers;<br>using Newtonsoft.Json;<br>using Microsoft.IdentityModel.Clients.ActiveDirectory;</font></p> <p><font size="3">public static async Task&lt;String&gt; Run(TimerInfo myTimer, TraceWriter log)</font></p> <p><font size="3">{<br>&nbsp;&nbsp;&nbsp; log.Info($"C# Timer trigger function executed at: {DateTime.Now}");&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; string resourceId = "</font><a href="https://graph.microsoft.com&quot;;"><font size="3">https://graph.microsoft.com";</font></a><br><font size="3">&nbsp;&nbsp;&nbsp; string tenantId = "&lt;<strong>Tenant ID</strong>&gt;";<br>&nbsp;&nbsp;&nbsp; string authString = "</font><a href="https://login.microsoftonline.com/&quot;"><font size="3">https://login.microsoftonline.com/"</font></a><font size="3"> + tenantId;<br>&nbsp;&nbsp;&nbsp; string clientId = "<strong>&lt;Client ID&gt;</strong>";<br>&nbsp;&nbsp;&nbsp; string clientSecret = "<strong>&lt;Client Secret&gt;</strong>";<br>&nbsp;&nbsp;&nbsp; //string clientSecret = ConfigurationManager.AppSettings["clientSecret"];</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; log.Verbose("ClientSecret=" + clientSecret);<br>&nbsp;&nbsp;&nbsp; log.Verbose("authString=" + authString);</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; var authenticationContext = new AuthenticationContext(authString, false);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //アクセストークン取得; <br>&nbsp;&nbsp;&nbsp; ClientCredential clientCred = new ClientCredential(clientId, clientSecret);<br>&nbsp;&nbsp;&nbsp; AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(resourceId,clientCred);<br>&nbsp;&nbsp;&nbsp; string token = authenticationResult.AccessToken;<br>&nbsp;&nbsp;&nbsp; log.Verbose("token=" + token);</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; var responseString = String.Empty;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; using (var client = new HttpClient())<br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string requestUrl = "</font><a href="https://graph.microsoft.com/v1.0/users&quot;;"><font size="3">https://graph.microsoft.com/v1.0/users";</font></a><br><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUrl);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.Verbose(request.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpResponseMessage response = client.SendAsync(request).Result;</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; responseString = response.Content.ReadAsStringAsync().Result;&nbsp; </font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.Verbose(responseString);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; } </font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; return responseString;</font></p> <p><font size="3">}</font></p></blockquote> <p><font color="#ff0000" size="3">※ こちらからダウンロードできます&nbsp; </font><a title="https://github.com/junichia/Functions-Graph" href="https://github.com/junichia/Functions-Graph"><font size="3">https://github.com/junichia/Functions-Graph</font></a><font color="#ff0000"></font></p> <p>&nbsp;</p> <p><font size="3">残念ながら、このままでは動作しません。</font></p> <p>&nbsp;</p> <p><font size="3">ちょっと説明が面倒なのですが、今回は Microsoft Graph にアクセスするため、必要なモジュールを追加しなければなりません。モジュールによっては、コードの先頭に以下のように書くことで、自動的に Nuget から追加されます。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3">#r "Newtonsoft.Json"</font></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">これに関する詳細が知りたい方は、以下の「外部アセンブリの参照」を参照してください。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3">Azure Functions C# developer reference (Azure Functions C# 開発者向けリファレンス)<br></font><a title="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-csharp" href="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-csharp"><font size="3">https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-csharp</font></a></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">残念ながら Microsoft Graph に必要なモジュール（Microsoft.IdentityModel.Clients.ActiveDirectory）は #r では追加することができません。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">そこで、特別なファイルを作成してアップロードしてあげる必要があります。以下の&nbsp; JSON ファイルを作成して、Project.json というファイル名で保存してください。3.13.8 は現時点での安定最新バージョンです。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <h3>Active Directory Authentication Library 3.13.8<br><a title="https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/" href="https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/"><font size="3">https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/</font></a></h3></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong>Project.json</strong></font></p> <blockquote> <p><font size="3">{<br>&nbsp; "frameworks": {<br>&nbsp;&nbsp;&nbsp; "net46":{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "dependencies": {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>"Microsoft.IdentityModel.Clients.ActiveDirectory": "3.13.8"</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br>}</font></p></blockquote> <p><font size="3">ファイルを作成して保存したら、これを Function App にアップロードします。</font></p> <p><font size="3">画面右上の「ファイルの表示」をクリックしてください。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image777.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb675.png" width="365" height="138"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">以下のように3つのファイルが存在していることがわかります。現在のコードは「run.csx」です。</font></p> <p><font size="3">「アップロード」をクリックして、先ほど作成した <strong>Project.json</strong> をアップロードしてください。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image778.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb676.png" width="366" height="579"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">アップロードが完了すると、Nuget から必要なモジュールが自動的にダウンロードされて組み込まれます。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">これで動くようになったはずです。</font></p> <p><font size="3">コード画面の「実行」ボタンをクリックしてみてください。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image760.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb659.png" width="533" height="99"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">ログに、以下の赤枠で囲んだようなJSON形式のデータが出力されていれば成功です。</font><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/2017/01/image762.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb660.png" width="1034" height="270"></a></font></p> <p><font size="3"> 今回は、Graph の URL を以下のようにユーザー一覧を取得するように設定したので、Azure AD に登録されているユーザー一覧が取得できています。</font></p> <p><font size="3"><a href="https://graph.microsoft.com/v1.0/users"><strong>https://graph.microsoft.com/v1.0/users</strong></a></font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">出力結果を JSON エディタ等で見ていただくと、以下のようなデータがユーザーの数だけ出力されています。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3">{<br>&nbsp;&nbsp;&nbsp; "id":"deb57951-92af-4bc4-xxxx-xxxxxxxxxxxx","businessPhones":["+81 9099999999"],<br>&nbsp;&nbsp;&nbsp; "displayName":"admin",<br>&nbsp;&nbsp;&nbsp; "givenName":"admin",<br>&nbsp;&nbsp;&nbsp; "jobTitle":"\u30a8\u30d0\u30f3\u30b8\u30a7\u30ea\u30b9\u30c8",<br>&nbsp;&nbsp;&nbsp; "mail":"admin@pharaojp.onmicrosoft.com",<br>&nbsp;&nbsp;&nbsp; "mobilePhone":"+81 9017xxxxxx",<br>&nbsp;&nbsp;&nbsp; "officeLocation":"???-???????",<br>&nbsp;&nbsp;&nbsp; "preferredLanguage":"ja-JP",<br>&nbsp;&nbsp;&nbsp; "surname":"user",<br>&nbsp;&nbsp;&nbsp; "userPrincipalName":<a href="mailto:admin@pharaojp.onmicrosoft.com">admin@pharaojp.onmicrosoft.com</a><br>}</font></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">以上でGraphへのアクセス部分の作成は完了です。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong><u>4. Azure Blob Storage への出力</u></strong></font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Blob ストレージへの出力は簡単です。コードを書く必要は一切ありません。</font></p> <p><font size="3">「統合」メニューをクリックしてください。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image779.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb677.png" width="751" height="241"></a></p> <p>&nbsp;</p> <p><font size="3">画面右上の「新しい出力」をクリックすると出力先一覧が表示されるので、「Azure BLOB ストレージ」を「選択」します。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image780.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb678.png" width="765" height="337"></a></p> <p>&nbsp;</p> <p><font size="3">「Blobパラメーター名」に「$Return」を指定します。これは、コードの最後に書かれた「 Return responseString; 」に関連しています。responseString 変数に格納された値が、Return されます。</font></p> <p><font size="3"></font>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image781.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb679.png" width="755" height="245"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">「ストレージアカウント接続」にはストレージアカウントを指定してください。既存のものでも新規に作成することもできます。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">パスはストレージアカウント内にファイルを保存するときのフルパスです。</font><font size="3">コンテナは事前に作成しておく必要はありません。指定したコンテナが自動的に作成されます。{rand-guid}は保存するたびにランダムなGUIDを生成することを意味しています。「.txt」を付けておくと開くときに便利です。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">以上で作業は完了です。</font></p> <p><font size="3">放っておけば5分に1回、Graph API が呼び出されてBlobストレージにその時点のユーザー一覧のスナップショットがとられます（役に立つかどうかは不明ですが。。。）</font></p>]]></content:encoded>
    </item>
    <item>
      <title>Azure Functions から定期的に Microsoft Graph にアクセスする</title>
      <link>https://docs.microsoft.com/archive/blogs/junichia/azure-functions-%E3%81%8B%E3%82%89%E5%AE%9A%E6%9C%9F%E7%9A%84%E3%81%AB-microsoft-graph-%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B</link>
      <pubDate>Fri, 27 Jan 2017 17:55:30 GMT</pubDate>
      <dc:creator><![CDATA[junichia]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/junichia/?p=12086</guid>
      <description><![CDATA[Azure Functions って知ってますか ?  一言でいえば、Azure Automation の”開発屋さん版”です（って、適当すぎて怒られそうw）。 &nbsp; Azure...]]></description>
      <content:encoded><![CDATA[<p><font size="3">Azure Functions って知ってますか ? </font></p> <p><font size="3">一言でいえば、Azure Automation の”開発屋さん版”です（って、適当すぎて怒られそうw）。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Azure Automation は PowerShell スクリプトをクラウド上でジョブ化することができますが、Azure Functions は C#、F#、Node.js、Python、PHP Java などで書いたプログラムを WebJob として登録することができます。いずれも、サーバーを置くことなくジョブを実行することができる、いわゆるサーバーレスを実現するためのコンポーネントです。</font></p> <p><font size="3">PowerShell 好きの私的には Automation が好みではありますが、悔しいことに Functions のほうが高機能であることは否めません。何がいいって、入力や出力の定義が超簡単。これはAutomationにはない部分です。詳しくは以下の手順で。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3">Azure Functions の概要<br></font><a title="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-overview" href="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-overview"><font size="3">https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-overview</font></a></p></blockquote> <p>&nbsp;</p> <p><font size="3">ためしに使ってみようかってことで、ここでは、Microsoft Graph にアクセスしてユーザー一覧を取得し、これを Azure Blob に保存するジョブを作成してみることにします。</font></p> <p><font size="3">Microsoft Graph にアクセスするので Azure AD 側の設定も必要になります、そこも含めて手順を書いておきますので参考にしてください。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong><u>1.&nbsp; Azure Functions アカウントの作成</u></strong></font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Azure Portal&nbsp; の Marketplace で Function App を検索し、Function App をクリックしたら「作成」。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image741.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb640.png" width="676" height="379"></a></p><font size="3"></font> <p><font size="3"></font>&nbsp;</p> <p><font size="3">アプリ名等を入力して「作成」。アプリ名（ここでは GraphFromFunction.azurewebsites.net）は後でAzure AD にアプリ登録するときに使用します。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image742.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb641.png" width="281" height="453"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">作成した Function App に移動すると、以下のようにApp Service（Functions の本体）、ストレージ、App Service プランが作成されていることがわかります。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image743.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb642.png" width="758" height="328"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">App Service をクリックすると、Function App の簡易作成画面（クイックスタート）が表示されます。</font></p> <p>&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/2017/01/image744.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb643.png" width="656" height="477"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">今回は定期的に Microsoft Graph を実行するので「タイマー」を選択。言語は C#。</font></p> <p><font size="3">選択したら「この関数を作成する」をクリック。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image745.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb644.png" width="353" height="83"></a></p> <p><font size="3">初期画面が表示されたら、ためしに「実行」をクリックしてみる。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image746.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb645.png" width="831" height="535"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">ログに以下のような出力がされれば、ひとまず正常です。太字部分はコード内の <strong>log.info()</strong> によって出力された文字列です。</font></p> <p><font size="3">2017-01-26T13:45:00.009 Function started (Id=db7524a6-c10b-4d9a-9e44-b61e86898aa0) <br></font><font size="3">2017-01-26T13:45:00.009 <strong>C# Timer trigger function executed at: 1/26/2017 1:45:00 PM</strong> <br></font><font size="3">2017-01-26T13:45:00.009 Function completed (Success, Id=db7524a6-c10b-4d9a-9e44-b61e86898aa0) </font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">この関数はタイマーにバインドされているので、規定時間（5分）に1回、自動的に実行されます。</font></p> <p><font size="3">タイマーの間隔を変更するには、左側のメニューの「統合」をクリックします。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image747.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb646.png" width="770" height="266"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">右下に「スケジュール」と書かれたフィールドがありますが、これが間隔を示しています。</font></p> <p><font size="3">設定の方法は以下を参照してください。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3"><strong>0 */5 * * * *</strong></font></p></blockquote> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><a name="azure-functions-timer-trigger"></a><font size="3">Azure Functions におけるタイマー トリガー<br></font><a title="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-timer" href="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-timer"><font size="3">https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-bindings-timer</font></a></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong><u>2. Azure AD にアプリ登録する</u></strong></font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Function App からいったん離れて、今度は Auzre AD 側の設定をします。実は、AppService の認証/承認の設定からでもできるのですが、今回は何が行われているのかを理解してもらうために面倒な手順で進めてみます。</font></p> <p><font size="3">なお、Azure AD について詳しく知りたい方は以下のリンクがおすすめです。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><a name="user-content-administer-your-azure-ad-directory"></a><font size="3">Azure AD ディレクトリの管理<br></font><a title="https://github.com/Microsoft/azure-docs.ja-jp/blob/master/articles/active-directory/active-directory-administer.md" href="https://github.com/Microsoft/azure-docs.ja-jp/blob/master/articles/active-directory/active-directory-administer.md"><font size="3">https://github.com/Microsoft/azure-docs.ja-jp/blob/master/articles/active-directory/active-directory-administer.md</font></a></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Azure AD は旧ポータルで操作するのがセオリーですが（ほんとかよ）、ここはあえて新ポータルでいってみましょう。</font></p> <p><font size="3">ポータルで「Azure Active Directory」を開いてください。</font></p> <p><font size="3"></font>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image748.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb647.png" width="668" height="691"></a></p> <p>&nbsp;</p> <p><font size="3">「プロパティ」をクリックすると「ディレクトリ ID」が表示されるので、これを控えておきます。あとから、ソースコード内で「Tenant </font><font size="3">ID」として使用します。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong>TenantID = c9687145-521f-42e6-xxxx-xxxxxxxxxxxx</strong></font></p> <p>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image749.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb648.png" width="551" height="620"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">次に</font><font size="3">「アプリの登録」をクリックすると、指定したテナントに関連づけられているアプリケーションの一覧が表示されます。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image750.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb649.png" width="820" height="504"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">「追加」をクリックします。「アプリケーションの種類」は「Webアプリ/API」を選択。「サインオンURI」には、先ほど作成した Function App の URL(<a href="https://graphgromgunction.azurewebsites.net">https://graphgromgunction.azurewebsites.net</a>) を指定して「作成」をクリック。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image751.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb650.png" width="405" height="355"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">先ほどのアプリ一覧に、今作成したアプリが追加されるので、クリックして設定画面を開きます。</font></p> <p><font size="3">「プロパティ」をクリックして表示された情報から「アプリケーション ID」を控えておきます。これはあとから「Client ID」としてソースコード内で使用します。</font></p> <p><font size="3"><strong>ClientID = e67fff1a-d912-4bf4-xxxx-xxxxxxxxxxxx</strong></font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image752.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb651.png" width="832" height="497"></a></p> <p>&nbsp;</p> <p><font size="3">今度は「キー」をクリックします。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image753.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb652.png" width="839" height="206"></a></p> <p><font size="3">既定ではキーは作成されていません。</font></p> <p><font size="3">「機関」からキーの有効期限を選択し（ここでは「期限なし」）、「キーの説明」を適当に入力して「保存」をクリック。保存が完了すると「値」にキーが表示されるので、これを控えておきます。これがコード内で ClientSecret となります。キーが表示されたら、それを控えるまではページを移動しないでください。移動すると、安全のため二度と表示できなくなります。もしキーを忘れてしまったら、既存のものを消して新しくキーを作成すれば OK です。</font></p> <p><font size="3"><strong>ClientSecret = b/dmwx0WUnmljqxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</strong></font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image754.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb653.png" width="841" height="248"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">この作業で以下の3つの情報を収集することができました。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong>&lt;Tenant ID&gt; c9687145-521f-42e6-xxxx-xxxxxxxxxxxx</strong></font></p> <p><font size="3"><strong>&lt;Client ID&gt; = e67fff1a-d912-4bf4-xxxx-xxxxxxxxxxxx</strong></font></p> <p><font size="3"><strong>&lt;Client Secret&gt; = b/dmwx0WUnmljqxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</strong></font></p> <p><strong><font size="3"></font></strong>&nbsp;</p> <p><font size="3">これらの値を、この後の作業で Function App 内に埋め込みます。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Azure AD の最後の作業として、アプリケーションにディレクトリへのアクセス権を与えます。</font></p> <p><font size="3"></font>&nbsp;<font size="3">アクセス権が無いと、正しいトークンを取得しても以下のようなエラーが発生します。</font></p> <blockquote> <p><font color="#ff0000" size="3">2017-01-27T04:29:02.895 { <br>&nbsp; "error": { <br>&nbsp;&nbsp;&nbsp; "code": "Authorization_RequestDenied", <br>&nbsp;&nbsp;&nbsp; "message": "Insufficient privileges to complete the operation.", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "innerError": { "request-id": "96e44229-5f66-4057-b9ea-f864b5013097", <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "date": "2017-01-27T04:29:01"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br> } </font></p></blockquote> <p>&nbsp;</p> <p><font size="3">「必要なアクセス許可」をクリックしてください。既定では以下のようになっています。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image755.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb654.png" width="765" height="343"></a></p> <h3>アクセス権について詳しく解説はしませんが、このままではアクセスすることができません。</h3> <blockquote> <h3>アクセス許可スコープ | Graph API 概念<br><a title="https://msdn.microsoft.com/ja-jp/library/azure/ad/graph/howto/azure-ad-graph-api-permission-scopes" href="https://msdn.microsoft.com/ja-jp/library/azure/ad/graph/howto/azure-ad-graph-api-permission-scopes"><font size="3">https://msdn.microsoft.com/ja-jp/library/azure/ad/graph/howto/azure-ad-graph-api-permission-scopes</font></a></h3></blockquote> <p><font size="3">今回は、Function App がユーザーのログオンを介さずに直接 Graph API にアクセスします。そのため、アプリケーションに対して直接権限を与える必要があります。規定では「<strong>委任されたアクセス許可</strong>」なので、ユーザーがログオンしないとアクセスすることができないのです。</font></p> <p><font size="3">API 一覧にある<font size="3">「Windows Azure Active Directory」をクリックすると、以下のように権限一覧画面が表示されます。「アプリケーションのアクセス許可」の中にある「<strong>Read directory data</strong>」を選択してください。既定で与えられている「Sign in and read user profile」は必要ないので外してしまいましょう。アプリケーションには余計な権限を与えてはいけません。<font size="3">「保存」をクリックして保存しましょう。</font></font></font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image756.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb655.png" width="611" height="744"></a></p> <p>&nbsp;</p> <p><font size="3">以上で Azure AD 側の設定は完了です。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong><u>3. Function App の作成</u></strong></font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Function App の設定画面に戻ります。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image757.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb656.png" width="853" height="315"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">既存のコードを以下で上書きして下さい。コード内の Tenant ID、Client ID、Client Secret に先ほど控えた値を埋め込みます。Client Secret を生のまま埋め込むのはアレなので、本当はApp Service のパラメタに登録するのがよいのですが、ひとまずここでは生埋め込みでいっちゃいましょう。パラメタ登録についてはあとで説明します。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3">#r "Newtonsoft.Json"</font></p> <p><font size="3">using System.Net; <br>using System.Net.Http.Headers;<br>using Newtonsoft.Json;<br>using Microsoft.IdentityModel.Clients.ActiveDirectory;</font></p> <p><font size="3">public static async Task&lt;String&gt; Run(TimerInfo myTimer, TraceWriter log)</font></p> <p><font size="3">{<br>&nbsp;&nbsp;&nbsp; log.Info($"C# Timer trigger function executed at: {DateTime.Now}");&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; string resourceId = "</font><a href="https://graph.microsoft.com&quot;;"><font size="3">https://graph.microsoft.com";</font></a><br><font size="3">&nbsp;&nbsp;&nbsp; string tenantId = "&lt;<strong>Tenant ID</strong>&gt;";<br>&nbsp;&nbsp;&nbsp; string authString = "</font><a href="https://login.microsoftonline.com/&quot;"><font size="3">https://login.microsoftonline.com/"</font></a><font size="3"> + tenantId;<br>&nbsp;&nbsp;&nbsp; string clientId = "<strong>&lt;Client ID&gt;</strong>";<br>&nbsp;&nbsp;&nbsp; string clientSecret = "<strong>&lt;Client Secret&gt;</strong>";<br>&nbsp;&nbsp;&nbsp; //string clientSecret = ConfigurationManager.AppSettings["clientSecret"];</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; log.Verbose("ClientSecret=" + clientSecret);<br>&nbsp;&nbsp;&nbsp; log.Verbose("authString=" + authString);</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; var authenticationContext = new AuthenticationContext(authString, false);<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; //アクセストークン取得; <br>&nbsp;&nbsp;&nbsp; ClientCredential clientCred = new ClientCredential(clientId, clientSecret);<br>&nbsp;&nbsp;&nbsp; AuthenticationResult authenticationResult = await authenticationContext.AcquireTokenAsync(resourceId,clientCred);<br>&nbsp;&nbsp;&nbsp; string token = authenticationResult.AccessToken;<br>&nbsp;&nbsp;&nbsp; log.Verbose("token=" + token);</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; var responseString = String.Empty;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; using (var client = new HttpClient())<br>&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; string requestUrl = "</font><a href="https://graph.microsoft.com/v1.0/users&quot;;"><font size="3">https://graph.microsoft.com/v1.0/users";</font></a><br><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUrl);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.Verbose(request.ToString());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpResponseMessage response = client.SendAsync(request).Result;</font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; responseString = response.Content.ReadAsStringAsync().Result;&nbsp; </font></p> <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.Verbose(responseString);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; } </font></p> <p><font size="3">&nbsp;&nbsp;&nbsp; return responseString;</font></p> <p><font size="3">}</font></p></blockquote> <p>&nbsp;</p> <p><font size="3">残念ながら、このままでは動作しません。</font></p> <p>&nbsp;</p> <p><font size="3">ちょっと説明が面倒なのですが、今回は Microsoft Graph にアクセスするため、必要なモジュールを追加しなければなりません。モジュールによっては、コードの先頭に以下のように書くことで、自動的に Nuget から追加されます。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3">#r "Newtonsoft.Json"</font></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">これに関する詳細が知りたい方は、以下の「外部アセンブリの参照」を参照してください。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3">Azure Functions C# developer reference (Azure Functions C# 開発者向けリファレンス)<br></font><a title="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-csharp" href="https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-csharp"><font size="3">https://docs.microsoft.com/ja-jp/azure/azure-functions/functions-reference-csharp</font></a></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">残念ながら Microsoft Graph に必要なモジュール（Microsoft.IdentityModel.Clients.ActiveDirectory）は #r では追加することができません。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">そこで、特別なファイルを作成してアップロードしてあげる必要があります。以下の&nbsp; JSON ファイルを作成して、Project.json というファイル名で保存してください。3.13.8 は現時点での安定最新バージョンです。</font></p> <blockquote> <h3>Active Directory Authentication Library 3.13.8<br><a title="https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/" href="https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/"><font size="3">https://www.nuget.org/packages/Microsoft.IdentityModel.Clients.ActiveDirectory/</font></a></h3></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong>Project.json</strong></font></p> <blockquote> <p><font size="3">{<br>&nbsp; "frameworks": {<br>&nbsp;&nbsp;&nbsp; "net46":{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "dependencies": {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>"Microsoft.IdentityModel.Clients.ActiveDirectory": "3.13.8"</strong><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp; }<br>}</font></p></blockquote> <p><font size="3">ファイルを作成して保存したら、これを Function App にアップロードします。</font></p> <p><font size="3">画面右上の「ファイルの表示」をクリックしてください。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image758.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb657.png" width="497" height="187"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">以下のように3つのファイルが存在していることがわかります。現在のコードは「run.csx」です。</font></p> <p><font size="3">「アップロード」をクリックして、先ほど作成した <strong>Project.json</strong> をアップロードしてください。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image759.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb658.png" width="479" height="759"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">アップロードが完了すると、Nuget から必要なモジュールが自動的にダウンロードされて組み込まれます。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">これで動くようになったはずです。</font></p> <p><font size="3">コード画面の「実行」ボタンをクリックしてみてください。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image760.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb659.png" width="533" height="99"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">ログに、以下の赤枠で囲んだようなJSON形式のデータが出力されていれば成功です。</font><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;<a href="https://msdnshared.blob.core.windows.net/media/2017/01/image762.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb660.png" width="1034" height="270"></a></font></p> <p><font size="3"> 今回は、Graph の URL を以下のようにユーザー一覧を取得するように設定したので、Azure AD に登録されているユーザー一覧が取得できています。</font></p> <p><font size="3"><a href="https://graph.microsoft.com/v1.0/users"><strong>https://graph.microsoft.com/v1.0/users</strong></a></font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">出力結果を JSON エディタ等で見ていただくと、以下のようなデータがユーザーの数だけ出力されています。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3">{<br>&nbsp;&nbsp;&nbsp; "id":"deb57951-92af-4bc4-xxxx-xxxxxxxxxxxx","businessPhones":["+81 9099999999"],<br>&nbsp;&nbsp;&nbsp; "displayName":"admin",<br>&nbsp;&nbsp;&nbsp; "givenName":"admin",<br>&nbsp;&nbsp;&nbsp; "jobTitle":"\u30a8\u30d0\u30f3\u30b8\u30a7\u30ea\u30b9\u30c8",<br>&nbsp;&nbsp;&nbsp; "mail":"admin@pharaojp.onmicrosoft.com",<br>&nbsp;&nbsp;&nbsp; "mobilePhone":"+81 9017xxxxxx",<br>&nbsp;&nbsp;&nbsp; "officeLocation":"???-???????",<br>&nbsp;&nbsp;&nbsp; "preferredLanguage":"ja-JP",<br>&nbsp;&nbsp;&nbsp; "surname":"user",<br>&nbsp;&nbsp;&nbsp; "userPrincipalName":<a href="mailto:admin@pharaojp.onmicrosoft.com">admin@pharaojp.onmicrosoft.com</a><br>}</font></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">以上でGraphへのアクセス部分の作成は完了です。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3"><strong><u>4. Azure Blob Storage への出力</u></strong></font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Blob ストレージへの出力は簡単です。コードを書く必要は一切ありません。</font></p> <p><font size="3">「統合」メニューをクリックしてください。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image763.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb661.png" width="947" height="303"></a></p> <p>&nbsp;</p> <p><font size="3">画面右上の「新しい出力」をクリックすると出力先一覧が表示されるので、「Azure BLOB ストレージ」を「選択」します。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image764.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb662.png" width="989" height="435"></a></p> <p>&nbsp;</p> <p><font size="3">「Blobパラメーター名」に「$Return」を指定します。これは、コードの最後に書かれた「 Return responseString; 」に関連しています。responseString 変数に格納された値が、Return されます。</font></p> <p><font size="3"></font>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/2017/01/image765.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2017/01/image_thumb663.png" width="989" height="320"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">「ストレージアカウント接続」にはストレージアカウントを指定してください。既存のものでも新規に作成することもできます。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">パスはストレージアカウント内にファイルを保存するときのフルパスです。</font><font size="3">コンテナは事前に作成しておく必要はありません。指定したコンテナが自動的に作成されます。{rand-guid}は保存するたびにランダムなGUIDを生成することを意味しています。「.txt」を付けておくと開くときに便利です。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">以上で作業は完了です。</font></p> <p><font size="3">放っておけば5分に1回、Graph API が呼び出されてBlobストレージにその時点のユーザー一覧のスナップショットがとられます（役に立つかどうかは不明ですが。。。）</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;</font></p> <p><font size="3">&nbsp;</font></p> <p><font size="3"></font></p> <p><font size="3"></font></p> <p><font size="3"></font></p> <p><font size="3"></font></p> <p><font size="3"></font></p> <p><font size="3"></font></p> <p><font size="3"></font></p> <p><font size="3"></font></p> <p><font size="3"></font></p> <p><font size="3"></font></p>]]></content:encoded>
    </item>
    <item>
      <title>Azure リソースの RBAC でカスタムロールを作成する</title>
      <link>https://docs.microsoft.com/archive/blogs/junichia/azure-%E3%83%AA%E3%82%BD%E3%83%BC%E3%82%B9%E3%81%AE-rbac-%E3%81%A7%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%AD%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B</link>
      <pubDate>Tue, 13 Dec 2016 20:58:28 GMT</pubDate>
      <dc:creator><![CDATA[junichia]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/junichia/?p=11655</guid>
      <description><![CDATA[※ この投稿は PowerShell Advent Calendar 2016 に参加しています &nbsp; Azure 上の全てのリソースは Azure AD...]]></description>
      <content:encoded><![CDATA[<p><font color="#ff0000" size="3"><strong>※ この投稿は PowerShell Advent Calendar 2016 に参加しています</strong></font></p> <p><strong><font color="#ff0000" size="3"></font></strong>&nbsp;</p> <p><font color="#000000" size="3">Azure 上の全てのリソースは Azure AD に登録されたユーザーやグループを使用してアクセス制御が行えます。この時に使用するアクセス制御の方法を RBAC（Role Based Access Control）と言います。</font></p> <p><font color="#000000" size="3"></font>&nbsp;</p> <p><font color="#000000" size="3">Azure ポータル（<a href="https://portal.azure.com/">https://portal.azure.com/</a>）で何らかのリソース（いかの場合は仮想マシン）を選択すると、必ずメニューの中に「アクセス制御（IAM）」が表示され、ここを起点としてRBACを設定することができます。</font></p> <p><font color="#000000" size="3"></font>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/12/image374.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/12/image_thumb333.png" width="524" height="364"></a></p> <p>&nbsp;</p> <p><font size="3">RBAC の概念を簡単に図にすると、以下のようになります。リソースに直接アクセス権を設定するのではなく、ROLE を介してアクセス権を得ることになります。ROLE には「アクション」が定義されており、これ<font color="#000000">が Azure のリソースに対して行える</font></font><a href="https://msdnshared.blob.core.windows.net/media/2016/12/image375.png"><font color="#000000" size="3">権限を表しています。</font></a></p> <p><font color="#000000" size="3"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/12/image_thumb334.png" width="809" height="246"></font></p> <p><font color="#000000" size="3"></font>&nbsp;</p> <p><font color="#000000" size="3">ここでは「仮想マシン作成協力者」というロールのアクションを見てみましょう。以下が仮想マシン作成協力者に定義されているアクション（アクセス許可）の一覧です。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/12/image376.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/12/image_thumb335.png" width="542" height="452"></a></p> <p><font size="3">見ていただくとわかりますが、リソースプロバイダーに対してアクセス権が設定されていることがわかります。リソースプロバイダーについてはここでは解説しませんが、リソースの種類だと思ってください。Microsoft Compute は仮想マシンに関連したリソースを意味しています。ここには仮想マシンや仮想マシンノスケールセットなどが含まれています。Microsoft Network はネットワークに関連したリソースを意味しており、仮想ネットワーク、ネットワークインターフェースなどのリソースが含まれています。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Microsoft Computeをクリックして表示した画面が以下です。Virtual Machine に対してフルコントロールが与えられているのがなんとなくわかりますか？Availability Sets には「読み取り」「書き込み」「削除」の権限が与えられています。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/12/image377.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/12/image_thumb336.png" width="1134" height="682"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">さて、ここからがいよいよ PowerShell の出番です。これらを PowerShell から確認してみましょう。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">まずは、以下の PowerShell コマンドレットで Azure AD にログオンします。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">Add-AzureRMAccount</font></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">次に、以下のコマンドを実行してみてください。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">Get-AzureRmRoleDefinition "Virtual Machine Contributor" | `<br>&nbsp;&nbsp;&nbsp; Select Actions | foreach {echo $_.actions}</font></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">実行結果は以下の通りです。Microsoft.Compute（太字）と上の画面ショットを比べてみてください。一致していることがわかると思います。以下のアクションで「*」はワイルドカードです。Microsoft.Compute/virtualMachines/* であれば、Microsoft.Compute/virtualMachines/ 配下のアクションのすべてにアクセスが可能であることを意味しています。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">Microsoft.Authorization/*/read<br><strong>Microsoft.Compute/availabilitySets/*<br>Microsoft.Compute/locations/*<br>Microsoft.Compute/virtualMachines/*<br>Microsoft.Compute/virtualMachineScaleSets/*</strong><br>Microsoft.Insights/alertRules/*<br>Microsoft.Network/applicationGateways/backendAddressPools/join/action<br>Microsoft.Network/loadBalancers/backendAddressPools/join/action<br>Microsoft.Network/loadBalancers/inboundNatPools/join/action<br>Microsoft.Network/loadBalancers/inboundNatRules/join/action<br>Microsoft.Network/loadBalancers/read<br>Microsoft.Network/locations/*<br>Microsoft.Network/networkInterfaces/*<br>Microsoft.Network/networkSecurityGroups/join/action<br>Microsoft.Network/networkSecurityGroups/read<br>Microsoft.Network/publicIPAddresses/join/action<br>Microsoft.Network/publicIPAddresses/read<br>Microsoft.Network/virtualNetworks/read<br>Microsoft.Network/virtualNetworks/subnets/join/action<br>Microsoft.RecoveryServices/locations/*<br>Microsoft.RecoveryServices/Vaults/backupFabrics/protectionContainers/protectedItems/*/read<br>Microsoft.RecoveryServices/Vaults/backupFabrics/protectionContainers/protectedItems/read<br>Microsoft.RecoveryServices/Vaults/backupFabrics/protectionContainers/protectedItems/write<br>Microsoft.RecoveryServices/Vaults/backupPolicies/read<br>Microsoft.RecoveryServices/Vaults/backupPolicies/write<br>Microsoft.RecoveryServices/Vaults/read<br>Microsoft.RecoveryServices/Vaults/usages/read<br>Microsoft.RecoveryServices/Vaults/write<br>Microsoft.ResourceHealth/availabilityStatuses/read<br>Microsoft.Resources/deployments/*<br>Microsoft.Resources/subscriptions/resourceGroups/read<br>Microsoft.Storage/storageAccounts/listKeys/action<br>Microsoft.Storage/storageAccounts/read<br>Microsoft.Support/*<br></font></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">既定で用意されている「組み込みロール」は以下のページを参照してください。「仮想マシン作成協力者」 も組み込みロールの1つです。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="3">RBAC: 組み込みのロール</font></p> <p><a title="https://docs.microsoft.com/ja-jp/azure/active-directory/role-based-access-built-in-roles" href="https://docs.microsoft.com/ja-jp/azure/active-directory/role-based-access-built-in-roles"><font size="4">https://docs.microsoft.com/ja-jp/azure/active-directory/role-based-access-built-in-roles</font></a></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">では、例えば「仮想マシンを起動/停止するだけ」の権限を持ったロールを定義することはできるのでしょうか？</font></p> <p><font size="3">もちろんできます。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">まずは「仮想マシンの起動、停止」アクションを調べるために、Azure 上で用意されている全アクションの一覧を出力してみましょう。以下のコマンドを使用すると、すべてのリソースのすべてのアクションをグリッドビューに一覧表示することができます。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">Get-AzureRMProviderOperation * | Out-GridView</font></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Microsoft.Compute に関するアクションだけに絞り込むときは以下のように入力します。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">Get-AzureRMProviderOperation -OperationSearchString Microsoft.Compute/* | Out-GridView</font></p></blockquote> <p>&nbsp;</p> <p><font size="3">出力された結果の中で、仮想マシンの起動と停止、再起動に関するアクションは以下の通りです。</font></p> <p><font size="3"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">Microsoft.Compute/VirtualMachines/start/action</font></p> <p><font size="4" face="Segoe UI Light">Microsoft.Compute/VirtualMachines/powerOff/action</font></p> <p><font size="4" face="Segoe UI Light">Microsoft.Compute/VirtualMachines/restart/action</font></p></blockquote> <p><font size="4" face="Segoe UI Light"></font>&nbsp;</p> <p><font size="4" face="Segoe UI Light">あと、当然仮想マシンの一覧を読み込めないと意味がないので、以下も必要です。read には /action を付加する必要はありません。</font></p> <p><font size="4" face="Segoe UI Light"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">Microsoft.Compute/VirtualMachines/read</font></p></blockquote> <p><font size="4" face="Segoe UI Light"></font>&nbsp;</p> <p><font size="4" face="Segoe UI Light">これだけでは足りません。PowerOff するには、ディスクを接続解除（deallocate）する権限も必要です。</font></p> <p><font size="4" face="Segoe UI Light"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">Microsoft.Compute/VirtualMachines/deallocate/action</font></p></blockquote> <p><font size="3"></font>&nbsp;</p> <p><font size="3">それでは、これらのアクションだけを持つロールを定義してみましょう。</font></p> <p><font size="3">はじめに新しいロールの枠組み枠を作成します。新規に作成する際は、既存のロールをコピーして再利用します。これは現在の標準手順ですので、そういうもんだと思ってください。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">まずは $Role 変数に「仮想マシンの共同作成者」ロールの中身をコピーします。</font></p> <blockquote> <p><font size="4" face="Segoe UI Light">$role = Get-AzureRmRoleDefinition "Virtual Machine Contributor"</font></p></blockquote> <p><font color="#000000" size="4"></font></p> <p><font size="4"></font>&nbsp;</p> <p><font size="4">忘れないうちに、Role の識別子である Id を Null にしておきます。Id は新規ロールを作成する際に、新しく割り振られます。</font></p> <p><font size="4"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">$Role.Id = $Null</font></p></blockquote> <p><font size="4"></font>&nbsp;</p> <p><font size="4">次にロールの名前と説明文を指定しましょう。日本語でも英語でも大丈夫です。</font></p> <p><font size="4"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">$Role.Name = "仮想マシンの起動と停止"</font></p> <p><font size="4" face="Segoe UI Light">$Role.Description = "仮想マシンの起動と停止、再起動ができます"</font></p></blockquote> <p><font size="4"></font>&nbsp;</p> <p><font size="4">今度は $role に定義されたアクションをクリアします。</font></p> <p><font size="4"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">$Role.Actions.Clear()</font></p></blockquote> <p><font size="4"></font>&nbsp;</p> <p><font size="4">ここまでできたら、$Role だけ入力して現在の設定値を確認しましょう。</font></p> <p><font size="4"></font>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/12/image378.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/12/image_thumb337.png" width="762" height="301"></a></p> <p><font size="4"></font>&nbsp;</p> <p><font size="4">ここに必要なアクションを埋め込みます。</font></p> <p><font size="4"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">$role.Actions.Add("Microsoft.Compute/VirtualMachines/start/action")<br>$role.Actions.Add("Microsoft.Compute/VirtualMachines/stop/action")<br>$role.Actions.Add("Microsoft.Compute/VirtualMachines/restart/action")<br>$role.Actions.Add("Microsoft.Compute/VirtualMachines/read")<br></font><font size="4" face="Segoe UI Light">$role.Actions.Add("Microsoft.Compute/VirtualMachines/deallocate/action")</font></p></blockquote> <p><font size="4"></font>&nbsp;</p> <p><font size="4">最後に、このロールを使用するサブスクリプションを定義します。</font></p> <p><font size="4">サブスクリプションを定義するにはサブスクリプションのIDが必要なので、まずは以下のコマンドで SubscriptionId を取得しましょう。</font></p> <p><font size="4"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">Get-AzureRmSubscription</font></p></blockquote> <p><font size="4"></font>&nbsp;</p> <p><font size="4">SubsctionId が取得できたら、この値を使用して以下のコマンドを実行します。</font></p> <p><font size="4"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">$role.AssignableScopes.Clear()<br>$role.AssignableScopes.Add("/subscriptions/9cb9d877-xxxx-xxxx-xxxx-xxxxxxxxxxxx")</font></p></blockquote> <p><font size="4"></font>&nbsp;</p> <p><font size="4">最後に $Role に格納された情報を使用して新しくロールを作成するコマンドを実行します。</font></p> <p><font size="4"></font>&nbsp;</p> <blockquote> <p><font size="4" face="Segoe UI Light">New-AzureRmRoleDefinition -Role $role</font></p></blockquote> <p><font size="4"></font>&nbsp;</p> <p><font size="4">これで新規カスタムロールの作成は完了です。</font></p> <p><font size="4">さっそく、このロールをリソースグループに割り当ててみましょう。リソースグループに割り当てると、その中のすべてのリソースにアクセス権が継承されます。</font></p> <p><font size="4">Azure Portal でリソースグループを選択し、IAM を選択します。</font></p> <p><font size="4"></font>&nbsp;</p> <p><font size="4">次に、「追加」をクリックしてください。</font></p> <p><font size="4"></font>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/12/image379.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;margin: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/12/image_thumb338.png" width="230" height="98"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">「役割の選択」をクリックすると、</font><font size="3">今作成した「仮想マシンの起動と停止」という役割が表示されているはずです。新規に作成したカスタムロールは、オレンジ色のしるしがついています。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/12/image380.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/12/image_thumb339.png" width="534" height="596"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">「仮想マシンの起動と停止」を選択したら、次にこのロールに割り当てるユーザーを指定して保存すれば完了です。</font></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">Azure Portal に割り当てたユーザーでログオンしなおしてみてください。</font></p> <p><font size="3">Virtual Machine 画面を開くと、アクセス権を割り当てたリソースグループの仮想マシンだけが表示されます。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/12/image381.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/12/image_thumb340.png" width="465" height="283"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">そして、特定のを開くと以下のようになるはずです。「開始」「再起動」「停止」の操作が許可されていることがわかります。管理者の場合、ここに「削除」が表示されるはずですが、このユーザーには表示されていません。</font></p> <p><font size="3"></font>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/12/image382.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/12/image_thumb341.png" width="852" height="523"></a></p> <p>&nbsp;</p> <p><font size="3">「接続」が表示されていますが、現在のRBACでは接続ボタンを無効化することはできないようです。接続を許可したくない場合には、グループポリシー等を使用して、仮想マシンの内部でアクセス制御してください。</font></p> <p><font size="3">今回、このユーザーにはリソースグループの参照権限を与えていません。そのため、リソースグループ画面を開くと、以下のようになります。リソースグループへの権限を与えないと、その配下に一切のリソースを新規に作成することができません。</font></p> <p><font size="3"></font>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/12/image383.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/12/image_thumb342.png" width="446" height="332"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">また、試しに特定の Virtual Machine から「ネットワーク インターフェース」を選択して情報を参照しようとしても、以下のようにアクセスが拒否されます。</font></p> <p><font size="3"></font>&nbsp;</p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/12/image384.png"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/12/image_thumb343.png" width="801" height="436"></a></p> <p><font size="3"></font></p>]]></content:encoded>
    </item>
    <item>
      <title>&lt;秋の夜長は Ignite&gt; 9/26 Microsoft Ignite 2016 Keynote を日本語解説付きで中継します！</title>
      <link>https://docs.microsoft.com/archive/blogs/junichia/%E7%A7%8B%E3%81%AE%E5%A4%9C%E9%95%B7%E3%81%AF-ignite-926-microsoft-ignite-2016-keynote-%E8%A7%A3%E8%AA%AC%E4%BB%98%E3%81%8D%E4%B8%AD%E7%B6%99%E3%81%97%E3%81%BE%E3%81%99%EF%BC%81</link>
      <pubDate>Fri, 23 Sep 2016 20:21:49 GMT</pubDate>
      <dc:creator><![CDATA[junichia]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/junichia/?p=11435</guid>
      <description><![CDATA[すっかり秋ですね。朝シャワーが徐々につらくなる季節になりました。 さて、秋から冬にかけては大きなイベントが 2 つ開催されます。 1 つ目は アトランタで開催される...]]></description>
      <content:encoded><![CDATA[<p><font size="3">すっかり秋ですね。</font><font size="3">朝シャワーが徐々につらくなる季節になりました。</font></p> <p><font size="3">さて、秋から冬にかけては大きなイベントが 2 つ開催されます。</font></p> <p><font size="3">1 つ目は アトランタで開催される <strong>Ignite（イグナイト）2016</strong>。</font><font size="3">もともと春に開催予定でしたが、諸事情（ご想像通りです）により秋にずれ込みました。</font></p> <p><font size="3">そして、Ignite 2016 を受けて 11/1-2 にお台場で開催される <strong>Japan Tech Summit 2016</strong> です。</font></p> <p><a href="http://microsoft-events.jp/mstechsummit/"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/09/image625.png" width="559" height="228"></a></p> <p><font size="3">国内でも、Tech Summit の準備であわただしくなってきました。</font></p> <p><font size="3">が、まずは Ignite でどのような発表があるのか見ておかなければいかん！キーノートは夜だけど真夜中ってほどじゃないし、せっかくなのでライブ中継しちゃおう～ ってことで、以下のオンラインイベントを開催します。</font></p> <p><a href="http://microsoft-events.jp/mstechsummit/"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/09/image629.png" width="563" height="169"></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">キーノートの内容をやさしく解説してくれるのは、以下の素敵な Geeks です。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/09/image627.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/09/image_thumb518.png" width="858" height="214"></a></p> <p><font size="3">左から、順にご紹介します。</font></p> <ul> <li><font size="3"><strong>Drew Robbins</strong> <br>日本マイクロソフト株式会社 デベロッパー エバンジェリズム統括本部 テクニカル エバンジェリズム マネージャー</font></li> <li><font size="3"><strong>井上 章</strong><br>日本マイクロソフト株式会社 デベロッパー エバンジェリズム統括本部 テクニカル エバンジェリスト</font></li> <li><font size="3"><strong>蔵本雄一</strong> <br>日本マイクロソフト株式会社 マイクロソフトテクノロジーセンター セキュリティアーキテクト</font></li> <li><font size="3"><strong>小塚大介</strong><br> Microsoft Corporation Developer Experience and Evangelism&nbsp; Technical Evangelist</font></li></ul> <p><font size="3">そして、Geeks 達を技術的にサポートしてくださる Microsoft MVP の方々がこちらです。「比較的高級なお弁当をご提供します」とのオファーに二つ返事で引き受けていただきました。ほんとすんまそん。。。Drew-san may treat you to a gorgeous dinner later.</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/09/image628.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/09/image_thumb519.png" width="910" height="272"></a></p> <p><font size="3">左からご紹介します。</font></p> <ul> <li><font size="3"><strong>宮川 麻里</strong> さん<br>MVP for Office Servers and Services であって、Active Directory や Windows Server にも強いオールマイティなエキスパートです。</font></li> <li><font size="3"><strong>安東 沙織</strong> さん<br>MVP for Microsoft Azure<br>NTTデータ ビジネスソリューション事業本部 データセンタ&amp;クラウドサービス事業部<br>確かココって AWS にむちゃくちゃ強い部門だったはずですが、それでいて Azure にも強いというハイブリッドに鍛え上げられたエンジニアです。</font></li> <li><font size="3"><strong>奥田 理恵</strong> さん<br>MVP for Office Servers and Services<br>株式会社イルミネート・ジャパン<br>Office 365 の世界では知らない人はいない超有名トレーナーです。彼女の関西弁で味付けされた Office 365 開発セッションにハマる方多し。</font></li></ul> <p><font size="3">そして、現地からは会場の雰囲気が伝わる写真を、<a href="https://www.facebook.com/osamu.takazoe?ref=ts&amp;fref=ts" target="_blank">高添さん</a>や<a href="https://www.facebook.com/mihochannel?fref=ts" target="_blank">山本美穂</a>さん、そして MVP の皆さんがが投稿してくれるはずです！</font></p> <p><font size="3">Twitter のハッシュタグは、以下の通り。</font></p> <p><strong><font size="4">#MSIgnite</font></strong> <p><strong><font size="4">#mstechsummit16</font></strong> <p><font size="3">みなさんのご視聴、お待ちしております！</font> <p><font size="3"></font>&nbsp; <p><font size="3">あ、忘れてた。最後に。。。。。</font> <p><font size="3">中継をサポートしてくれるのは、decode での Channel 9 中継でも同じみ、以下の media&nbsp; streaming guys です。</font> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/09/image630.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/09/image_thumb520.png" width="628" height="355"></a>]]></content:encoded>
    </item>
    <item>
      <title>初の日本語版 Azure Active Directory 専門書～脱オンプレミス! クラウド時代の認証基盤 Azure Active Directory 完全解説</title>
      <link>https://docs.microsoft.com/archive/blogs/junichia/%E5%88%9D%E3%81%AE%E6%97%A5%E6%9C%AC%E8%AA%9E%E7%89%88-azure-active-directory-%E5%B0%82%E9%96%80%E6%9B%B8%EF%BD%9E%E8%84%B1%E3%82%AA%E3%83%B3%E3%83%97%E3%83%AC%E3%83%9F%E3%82%B9-%E3%82%AF%E3%83%A9</link>
      <pubDate>Wed, 08 Jun 2016 20:32:27 GMT</pubDate>
      <dc:creator><![CDATA[junichia]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/junichia/?p=11255</guid>
      <description><![CDATA[Gartner 社から発表された Magic Quadrant（マジック クアドラント） によれば、Azure AD Premium が IDaaS（Identity and Access...]]></description>
      <content:encoded><![CDATA[<p><font size="3">Gartner 社から発表された Magic Quadrant（マジック クアドラント） によれば、Azure AD Premium が IDaaS（Identity and Access Management as a Service）部門で Leader 枠に位置づけられています。</font></p> <p><a href="https://blogs.technet.microsoft.com/enterprisemobility/2016/06/07/azuread-a-leader-in-the-2016-gartner-idaas-mq/" target="_blank"><font size="3"><img src="https://msdnshared.blob.core.windows.net/media/2016/06/Gartner-MQ-20161.png" width="395" height="395"></font></a></p> <p><font size="3">Gartner からリリースされている</font><a href="https://info.microsoft.com/EMS-IDaaS-MQ-2016.html" target="_blank"><font size="3">レポート</font></a><font size="3">（無償で読めます）によれば、IAM 分野における IDaaS の採用率は 2020 年までに 40% に上るとみられており、今後ますますクラウド上での IAM に注目が集まりそうです。</font></p> <p><font size="3">Gartner による分析では、IAM を大きな 3 つの機能の集合体であるととらえており、これらの機能が B2B や B2C を問わずさまざまなシナリオで動作することが前提となっています。</font></p> <ul> <li><font size="3">IGA（Identity and Governance Management）</font>  <ul> <li><font size="3">少なくとも顧客の持つIdentity ストアとの同期が行え、管理用のインターフェースが提供されていて IDaaS から顧客のディレクトリを管理できる</font>  <li><font size="3">ユーザー自身でパスワードをリセット</font>  <li><font size="3">Identityのライフサイクル管理機能</font>  <li><font size="3">さまざまなシステムへの自動プロビジョニング</font>  <li><font size="3">アクセスのリクエスト（セルフサービス含む）</font>  <li><font size="3">ポリシーの適用により重要なシステムへのアクセスに対するガバナンス</font></li></ul> <li><font size="3">Access</font>  <ul> <li><font size="3">少なくとも、Web プロキシやフェデレーションを使用したアプリへの SSO</font>  <li><font size="3">フェデレーションがサポートされていない場合には、事前に格納してあるパスワードを使用した SSO の代行</font>  <li><font size="3">その他、各種認証プロトコルのサポート</font></li></ul> <li><font size="3">Identity log monitoring and reporting</font>  <ul> <li><font size="3">少なくともIGAやAccessに関する各種イベントのロギングと、顧客がログを自身で分析できること、レポーティング機能（誰がどのシステムにいつアクセスを許可されたのか？誰がどのシステムにいつアクセスしたのか？）</font></li></ul></li></ul> <p><font size="3">Azure AD Premium は、上記のいずれにおいてもカバレッジ率が高いと判断された証です。</font></p> <p><font size="3">最近では、</font><a href="https://azure.microsoft.com/ja-jp/documentation/articles/active-directory-identityprotection/" target="_blank"><font size="3">Azure AD Identity Protection</font></a><font size="3"> というリスクベース認証機能がサポートされ、ますます安全性と柔軟性の高い認証基盤の設計が可能になりました。</font></p> <p><font size="3">そんな Azure AD ですが、まだあまり深く知らないという方もいらっしゃるはずです。</font></p> <p><font size="3">そんな方向けに Azure AD の日本語版最新刊をご紹介します。</font></p> <p><font size="3">日経BP社から刊行されたばかりの「Azure Active Directory 完全解説」です。</font></p> <p><a href="http://www.amazon.co.jp/%E8%84%B1%E3%82%AA%E3%83%B3%E3%83%97%E3%83%AC%E3%83%9F%E3%82%B9-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E6%99%82%E4%BB%A3%E3%81%AE%E8%AA%8D%E8%A8%BC%E5%9F%BA%E7%9B%A4-Active-Directory-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%BD%E3%83%95%E3%83%88%E5%85%AC%E5%BC%8F%E8%A7%A3%E8%AA%AC%E6%9B%B8/dp/4822298701/ref=sr_1_1?ie=UTF8&amp;qid=1465384681&amp;sr=8-1&amp;keywords=azure+active+directory" target="_blank"><font size="3"><img src="http://ecx.images-amazon.com/images/I/51UOJr30IkL._SX387_BO1,204,203,200_.jpg" width="302" height="387"></font></a><br><font size="3">※ Amazon にリンクされてます</font></p> <p><font size="3">Azure AD の各種機能や設定のためのオペレーションを説明したものではありません。それらについては、もう少しすると素晴らしい書籍が出てくるはずです。</font></p> <p><font size="3">こちらは、Azure AD を使いこなすためのアーキテクチャーについて詳しく解説されたものです。特にプロトコル面、IdP の設計面で深く理解したい方にはおすすめです。文字でびっしりの書籍です。</font></p> <p><font size="3">アーキテクチャを具体的に実装するためのコードも、Visual Studio の使い方とともに書かれています。</font></p> <p><font size="3">著者は Azure AD 開発チームの <a href="http://www.cloudidentity.com/blog/" target="_blank">Vittorio</a> で、それを MVP の <a href="http://idmlab.eidentity.jp/" target="_blank">Naohiro Fujie</a> さんとともに監訳しました。</font></p> <p><font size="3">結構日本向けに手を入れています。</font></p> <p><font size="3">おすすめです！</font></p> <p><font size="3"></font></p>]]></content:encoded>
    </item>
    <item>
      <title>Azure AD のごみ箱（recycle bin）</title>
      <link>https://docs.microsoft.com/archive/blogs/junichia/azure-ad-%E3%81%AE%E3%81%94%E3%81%BF%E7%AE%B1%EF%BC%88recycle-bin%EF%BC%89</link>
      <pubDate>Thu, 14 Apr 2016 01:00:01 GMT</pubDate>
      <dc:creator><![CDATA[junichia]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/junichia/?p=11243</guid>
      <description><![CDATA[ちょっと小ネタを。 Active Directory にゴミ箱機能が実装されたのは Windows Server 2008 R2 からでした。覚えてます？ 実は、Azure Active...]]></description>
      <content:encoded><![CDATA[<p><font size="3">ちょっと小ネタを。</font></p> <p><font size="3">Active Directory にゴミ箱機能が実装されたのは Windows Server 2008 R2 からでした。覚えてます？</font></p> <p><font size="3">実は、Azure Active Directory にもゴミ箱があります。</font></p> <p><font size="3">ちょっと以下の画面ショットをご覧ください。これは、Office 365 に用意されている「削除済みのユーザー」というメニューです。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image600.png"><font size="3"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image_thumb474.png" width="664" height="180"></font></a></p> <p><font size="3">Office 365 上で削除されたユーザーは、いったんここ（ゴミ箱）に移動されます。移動されたユーザーは、30日後に完全に削除されます。逆に言えば、30日未満であればもとのアクティブなユーザーとして復活することが可能です。</font></p> <p><font size="3">ここであることに気づきますよね。</font></p> <p><font size="3">そうです。Office 365 のユーザー管理簿は Azure Active Directory ですから、そもそも Azure Active Directory 自身にゴミ箱機能があるんじゃないか？</font></p> <p><font size="3">まさにその通りです。</font></p> <p><font size="3">現在の旧ポータルで提供されている Azure Active Directory の管理画面では、念ながらゴミ箱を参照することはできませんが、PowerShell を使用すれば確認することができます。</font></p> <p><font size="3">まずは、Connect-MSOLService コマンドレットで Azure AD のテナントにログオンしましょう。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image602.png"><font size="3"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image_thumb475.png" width="398" height="367"></font></a></p> <p><font size="3">次に、Get-MSOLUser&nbsp; -RetuenDeletedUsers コマンドを入力してみてください。ごみ箱に入っているユーザーを確認することができます。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image603.png"><font size="3"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image_thumb476.png" width="509" height="130"></font></a></p> <p><font size="3">削除されているユーザーが、「いつ」削除されたかを確認するには SoftDeleteionTimestamp プロパティを参照します。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image604.png"><font size="3"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image_thumb477.png" width="747" height="125"></font></a><font size="3">&nbsp;</font></p> <p><font size="3">このユーザーは 30 日後に削除されるわけですが、それがいつなのか？を確認するには SoftDeleteionTimestamp に 30 日を加えれば明確になります。以下のようなスクリプトを実行してみましょう。</font></p> <table cellspacing="1" cellpadding="2" width="929" border="1"> <tbody> <tr> <td valign="top" width="925"> <p><font size="3">(Get-Msoluser -ReturnDeletedUsers).Foreach{<br>&nbsp;&nbsp;&nbsp; $SoftDeletionTimeStamp = $_.SoftDeletionTimeStamp<br>&nbsp;&nbsp;&nbsp; $HardDeletionTimeStamp = $_.SoftDeletionTimeStamp.addDays(30);<br>&nbsp;&nbsp;&nbsp; $SignInName = $_.SignInName;<br>&nbsp;&nbsp;&nbsp; $SigninName + "," + $SoftDeletionTimeStamp + "." + $HardDeletionTimeStamp }</font></p></td></tr></tbody></table> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image605.png"><font size="3"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image_thumb479.png" width="940" height="258"></font></a></p> <p><font size="3">削除されたユーザーを復活させるには Restore-MSOLUser コマンドレットを使用します。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image606.png"><font size="3"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image_thumb480.png" width="806" height="154"></font></a></p> <p><font size="3">Office 365 から見ても、復活していることがわかります。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image607.png"><font size="3"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image_thumb481.png" width="757" height="227"></font></a></p> <p><font size="3">さて、Active Directory の場合はソフト削除とハード削除の間隔を調整することができました。Azure AD はどうなのでしょう？</font></p> <p><font size="3">残念ながら、現在は 30 日のソフト削除期間を変更することはできません。</font></p> <p><font size="3">オンプレミスの AD で間隔の調整が行える大きな理由は、削除したはずのオブジェクトが残り続けることによるデータベースの肥大化を回避するためです。Azure AD のフリー版を使用している場合、オブジェクト数の最大数は 50 万です。オブジェクト数を抑えるために削除しても、実際には 30 日後に削除されるのだとすると、削除されるまでの間に 50 万の上限が問題になる可能性があります。是非ともソフト削除からハード削除への移行間隔を調整できるようにしていただきたいものです。</font></p>]]></content:encoded>
    </item>
    <item>
      <title>Azure Automation の Webhook 機能が超便利。OMS からの Webhook 呼び出しもサポート。KeyVault と連携すれば面倒な URL 管理も楽々！</title>
      <link>https://docs.microsoft.com/archive/blogs/junichia/azure-automation-%E3%81%AE-webhook-%E6%A9%9F%E8%83%BD%E3%81%8C%E8%B6%85%E4%BE%BF%E5%88%A9%E3%80%82oms-%E3%81%8B%E3%82%89%E3%81%AE-webhook-%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%97%E3%82%82%E3%82%B5</link>
      <pubDate>Tue, 12 Apr 2016 17:31:27 GMT</pubDate>
      <dc:creator><![CDATA[junichia]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/junichia/?p=10791</guid>
      <description><![CDATA[Azure Automation はご存知ですか？ 数ある Azure の機能の中でも、私が一番好きなものです。Automation を使用すると、Windows PowerShell スクリプトを...]]></description>
      <content:encoded><![CDATA[<p><font size="3">Azure Automation はご存知ですか？</font></p> <p><font size="3">数ある Azure の機能の中でも、私が一番好きなものです。Automation を使用すると、Windows PowerShell スクリプトを Azure 上で実行することができます。</font></p> <p><font size="3">Azure 上で実行すると何がうれしいかというと、スクリプトを実行する環境を用意しておく必要が無いのです。</font></p> <p><font size="3">普段あまり意識しませんが、スクリプトを実行するためにはいくつかの条件を満たす必要があります。</font></p> <ul> <li><font size="3">スクリプトを実行するサーバー、またはクライアントが生きている</font>  <li><font size="3">スクリプトによって処理されるターゲットが生きている</font>  <li><font size="3">ネットワークが生きている</font>  <li><font size="3">スクリプト実行に必要なモジュールがインストールされている</font></li></ul> <p><font size="3">など。</font></p> <p><font size="3">こうした面倒な環境をすべてクラウドに任せてしまえるのが Azure Automation です。</font></p> <p><font size="3">Azure Automation の概要は以下の動画でどうぞ。</font></p> <p><iframe height="540" src="https://channel9.msdn.com/Blogs/Mastering-Windows-PowerShell-for-Japanese/01-Azure-Automation-overview/player" frameborder="0" width="960" allowfullscreen></iframe></p> <p><font size="3">で、Azure Automation には Webhook 機能も実装されています。Webhook とは何かといえば、WEB の API だと思ってください。</font></p> <p><font size="3">普通スクリプトを実行するには、以下のようにスクリプトファイルを PowerShell のコンソールから入力して実行します。</font></p> <p><font size="3">PS C:&gt; ./hogehoge.ps1</font></p> <p><font size="3">Azure Automation だと、スクリプト（正確には Runbook：ランブック と言います）を選択して「実行ボタン」をクリックすれば実行できます。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image480.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image507.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image_thumb408.png" width="589" height="633"></a></font></a></p> <p><font size="3">Azure Automation 上の Runbook は、「スケジュール」機能を使用してスケジューリングすることもできます。その他、Windows Server の機能を使用してスクリプトをタスクマネージャーに登録しておいて、時間が来たり何らかのイベントが発生したら実行する、なんてこともできますよね。</font></p> <p><font size="3">で、注目していただきたいのは以下の Webhook&nbsp; です。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image481.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image4100.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image4_thumb.png" width="634" height="127"></a></font></a></p> <p><font size="3">登録した Runbook に Webhook を設定することができます。</font></p> <p><font size="3">以下の画面を見てください。Webhook をクリックすると以下のような画面が開き、画面右下にあるような URL が発行されます。</font></p> <p><font size="3">これが Webhook です。</font></p> <p><font size="3">この URL を、なんらかの方法で Post してあげると、ここで作成した Runbook が実行できるんです。超便利じゃないですか？</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image482.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image813.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image8_thumb1.png" width="741" height="388"></a></font></a></p> <p><font size="3">ただし注意も必要です。</font></p> <p><font size="3">URL は以下のような形式です。以下のURLの token= 以降が、Webhook を識別するトークンになっており、これが外部にばれるとエライことになります。</font></p> <p><font size="3">https://s1events.azure-automation.net/webhooks?token=<strong>ypOAJiNYTwT%2fPlenxHHedJGdyB7DPkdwdkAHP6wwSNM%3d</strong></font></p> <p><font size="3">なぜエライことになるかというと、誰でも実行できてしまうからです。</font></p> <p><font size="3">上記 URL を Post するのに便利なのは、Chrome の Advanced REST Client です。Edge の拡張機能にも REST Client があるとよいのですが、まだ提供されていないようで。。。誰か作ってください。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image483.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image3210.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image32_thumb.png" width="768" height="224"></a></font></a></p> <p><font size="3">以下のように、「POST」を選択して URL を入力したら Send すれば URL を POST することができます。その結果、Webhook に関連付けられた Runbook が実行できます。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image484.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image3710.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image37_thumb.png" width="763" height="288"></a></font></a></p> <p><font size="3"></font>&nbsp;</p> <p><font size="3">ではここで、Webhook 発行までの簡単な手順を。</font></p> <ol> <li><font size="3">Azure Portal </font><a href="http://portal.azure.com/"><font size="3">http://portal.azure.com/</font></a><font size="3"> の左側のメニューから「参照」をクリック</font>  <li><font size="3">Azure Automation アカウントをクリック<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image485.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image1910.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image19_thumb.png" width="359" height="443"></a></font></a>  <li><font size="3">「追加」をクリックして Automation アカウントを新規に作成<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image486.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image486.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image2310.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image23_thumb.png" width="285" height="706"></a></font></a></font></a>  <li><font size="3">作成された Automation アカウントをクリック<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image487.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image2810.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image28_thumb.png" width="531" height="94"></a></font></a>  <li><font size="3">Runbook をクリック<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image488.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image4110.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image41_thumb.png" width="537" height="513"></a></font></a>  <li><font size="3">「Runbook の追加」をクリック<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image489.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image4510.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image45_thumb.png" width="460" height="190"></a></font></a>  <li><font size="3">「新しい Runbook を作成します」をクリック<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image490.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image4910.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image49_thumb.png" width="460" height="215"></a></font></a>  <li><font size="3">Runbook の名前を入力し、Runbookのタイプを選択。タイプはワークフローがお勧めではあるのですが、ひとまず Webhook には関係ないのでここでは普通の PowerShell を選択しました。最後に「作成」をクリックしてください。<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image491.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image531.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image53_thumb.png" width="311" height="350"></a></font></a>  <li><font size="3">作成すると以下のように編集画面が表示されます。今回は簡単に、Get-Date で日付を取得する Runbook にしましょう。<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image492.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image601.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image60_thumb.png" width="476" height="232"></a></font></a><br><font size="3">ちなみに、Ger-Date をローカルで実行すると以下のような出力結果が得られます。<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image493.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image571.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image57_thumb.png" width="395" height="121"></a></font></a>  <li><font size="3">「保存」して「発行」します<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image494.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image661.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image66_thumb.png" width="411" height="131"></a></font></a>  <li><font size="3">発行が完了したら「Webhool」をクリック<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image495.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image741.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image74_thumb.png" width="501" height="120"></a></font></a>  <li><font size="3">「新しいWebhookの作成」をクリックして、Webhook の名前を指定します。有効期限は規定では1年が設定されています。必要最小限の期限にしましょう。<br><strong><font color="#ff0000">ここで、必ずURLをコピーしておきます！これを忘れると、このURLは二度と取得することができません!!! ま、その場合は再作成すればよいだけの話なのですが。</font></strong><br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image496.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image781.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image78_thumb.png" width="569" height="447"></a></font></a>  <li><font size="3">URL をコピーしたら 「OK」<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image497.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image821.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image82_thumb.png" width="139" height="56"></a></font></a>  <li><font size="3">最後に「作成」<br></font><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image498.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image851.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image85_thumb.png" width="138" height="55"></a></font></a><br></li></ol> <p><font size="3">以上で Webhook の作成完了です。</font></p> <p><font size="3">URL を Chrome の Advanced REST Client にペーストして実行してみましょう。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image499.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image881.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image88_thumb.png" width="652" height="236"></a></font></a></p> <p><font size="3">以下のように「Accepted」が戻されたら成功です。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image500.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image921.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image92_thumb.png" width="683" height="417"></a></font></a></p> <p><font size="3">Runbook の「ジョブ」をクリックして、実行結果を確認してみましょう。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image501.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image961.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image96_thumb.png" width="472" height="495"></a></font></a></p> <p><font size="3">ジョブはすでに完了しているようです。タイミングによっては、ジョブの実行準備中の場合もあります。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image502.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image1001.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image100_thumb.png" width="482" height="189"></a></font></a></p> <p><font size="3">完了したジョブをクリックしてみると、以下のように正常に終了したことがわかります。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image503.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image1041.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image104_thumb.png" width="475" height="537"></a></font></a></p> <p><font size="3">「出力」をクリックすれば、以下のようにGet-Date の結果として日付が出力されたことがわかります。</font></p> <p><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image505.png"><font size="3"><a href="https://msdnshared.blob.core.windows.net/media/2016/04/image1081.png"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image108_thumb.png" width="533" height="211"></a></font></a></p> <p><font size="3">どうでしょう？結構面白そうな機能ですよね。</font></p> <p><font size="3">例えばある開発案件があって、開発者が Windows Azure 特有の機能の作りこみが苦手だったとしたら、Webhook の出番です。</font></p> <p><font size="3">あなたが PowerShell で Runbook を作り、Azure Automation に載せて Webhook を準備するだけです。開発者は、用意された Runbook をPostすれば、目的の処理の出来上がり！ってわけです。</font></p> <p><font size="3">で、つい最近 OMS から Webhook の呼び出しがサポートされました。</font></p> <blockquote> <p><font size="3">Introducing WebHook support for OMS Alerts<br></font><a title="https://blogs.technet.microsoft.com/msoms/2016/03/30/introducing-webhook-support-for-oms-alerts/" href="https://blogs.technet.microsoft.com/msoms/2016/03/30/introducing-webhook-support-for-oms-alerts/"><font size="3">https://blogs.technet.microsoft.com/msoms/2016/03/30/introducing-webhook-support-for-oms-alerts/</font></a></p></blockquote> <p><font size="3">OMS とは Operations Management Suite のことです。</font></p> <p><font size="3">OMS を使用すると、Azure や AWS などの IaaS 上の仮想マシン、さらにはオンプレミスの Hyper-V や VNWare 上の仮想マシンを監視することができます。簡易的な System Center 的な位置づけの製品で、今後どんどん機能が拡張されて System Center Operations Manager を凌駕する可能性もあります（現時点では全然追いついていませんけどね）。</font></p> <p><font size="3">上記の Blog でも紹介されていますが、OMS で Webhook がサポートされると「監視」と「アクション」を簡単に結び付けることができるようになります。</font></p> <p><font size="3">例えば、AWS 上の仮想マシン上で特定のイベントIDを持つエラーログが発生したら、Azure Automation に登録した PowerShell スクリプトを実行してリカバリーするとか。。。</font><font size="3">アイデアは無限大！</font></p> <p><font size="3">クラウドを介するので連携性もばっちりです。</font></p> <p><font size="3">ただ、Webhook の URL の管理だけはきちんと行ってください。</font></p> <p><font size="3">お勧めは Azure KeyVault です。</font></p> <p><font size="3">KeyVault が気になる方は、以下のPPTをご覧ください。</font></p> <blockquote> <p><a href="https://doc.co/GSQpAE"><img title="image" style="border-top: 0px;border-right: 0px;border-bottom: 0px;padding-top: 0px;padding-left: 0px;border-left: 0px;padding-right: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image1121.png" width="472" height="384"></a></p></blockquote>]]></content:encoded>
    </item>
    <item>
      <title>IT 業界私的英雄"外"伝 ー 嘘のような未来の始まりです！</title>
      <link>https://docs.microsoft.com/archive/blogs/junichia/%E5%98%98%E3%81%AE%E3%82%88%E3%81%86%E3%81%AA%E6%9C%AA%E6%9D%A5%E3%81%AE%E5%A7%8B%E3%81%BE%E3%82%8A%E3%81%A7%E3%81%99%EF%BC%81</link>
      <pubDate>Fri, 01 Apr 2016 17:55:41 GMT</pubDate>
      <dc:creator><![CDATA[junichia]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/junichia/?p=10443</guid>
      <description><![CDATA[2007 年 4 月 21 日に日本のマイクロソフトに入社してからまもなく丸 9 年が経過し、10 年目に突入します。 入社して2か月後、大胆にも System Center...]]></description>
      <content:encoded><![CDATA[<p><font size="3">2007 年 4 月 21 日に日本のマイクロソフトに入社してからまもなく丸 9 年が経過し、10 年目に突入します。</font></p> <p><font size="3">入社して2か月後、大胆にも System Center の発表イベントに登壇し、System Center Essentials という懐かしい製品を担当しました。</font></p> <p><font size="3">あまりの緊張に自己紹介を忘れ、セッション途中でふと思い出し「あ、こんにちは安納です」と東京ダイナマイト張りの自己紹介を行ったことは、いまでは懐かしい思い出です。ホールの後方で見ていた当時直属の上司 長坂さん、奥主さん、田辺さん（今はなぜか V 社に）がずっこけいてる様子がよく見え、「あー、こんな広い会場でも一番後ろの人の顔まで見えるのか」と感動したものです。</font></p> <p><font size="3">ちなみにこのイベントは、現在は会長の樋口さんの登壇デビューでもあり、そういう意味では樋口会長と私は同期であると言えなくもないです（こ、こえぇぇこと言ってる。。。。気がする。。。）。</font></p> <p><font size="3">はじめてのセミナーは、確か Active Directory でした。あの頃はまだ Windows Server 2003 R2 を使っていたはずです。このセミナーは、高添さん骨折によるピンチヒッターでした。まだ新宿のサザンタワーにオフィスがあった時代です。なつかしいですね。Zoomit の使い方に慣れておらず、注目してほしいところに丸をつけるつもりが塗りつぶしてしまうという Zoomit アルアルもよい思い出かと。</font></p> <p><font size="3">初めての出張も、確か高添さんとじゃなかったかな。この辺の記憶が定かではありませんが、場所は仙台でした。</font></p> <p><font size="3">私は前職の影響で「資料のようなスライド」を作る癖がありました。文字がビッチリ書いてあるような。”読めばわかる”資料です。</font></p> <p><font size="3">一方で、高添さんの資料はシンプルなんです。当時の超馬鹿な私から見れば、「え？それでいいんすか？オヤビン？」って感じです。</font></p> <p><font size="3">で、セミナーが始まり高添さんが話し始めて驚きました。</font></p> <p><font size="3">さっきまで「文字が無くてスカスカですけど？」なスライドに明確な意味が出てくるんですよ。スライドとスライドが物語のようにつながってくるんですよ！</font></p> <p><font size="3">なんですかこれ！？この感覚、高添さんのセッションに出たことがある方はわかると思うんですが、「この素材にはこの調味料！」的な組み合わせなんです。</font></p> <p><font size="3">「このスライドにはこの説明しかない！」。逆も真です。「この説明にはこのスライドしかない！」んです。スライドと説明が互いに欲しあっているという（いやらしい言い方だな）。高添さんは物語を語るようにテクノロジーを語ります。まるで一流の紙芝居（ってのがあるのかどうかわかりませんが）を見ているような感覚です。</font></p> <p><font size="3">それまで私はスライドで語ろうとしていました。言葉はスライドの補足だと思っていたんですね。だからビッチリと文字を書きこまざるを得なくなるんです。しかし高添さんは全く逆だったんです。伝えるのはスライドじゃなくて高添自身さんであり、主体はエバンジェリストである高添さん自身であると。聖書に語り部たるエバンジェリストがいるように、これこそが テクニカル エバンジェリストに求められている役割なのであると理解したのです。</font></p> <p><font size="3">今でも、忙しいとついついスライドを主体にしてしまいたくなるのです。何でもかんでも書き込むと楽なんですよねぇ～。読めるからww。でも、スライドを極限までシンプルにすると、ストーリーを組み立てて覚える必要があるので時間もかかるし大変なんです。でも、そのほうが聴き手には響くんです。間違いなく。</font></p> <p><font size="3">これを知れたのは、これから始まる私のエバンジェリスト人生にとって非常に大きな収穫でした。</font></p> <p><font size="3">ちょっと話が変わりますが、入社前は Windows Server Management という分野の MVP でした。今は亡き、柳原さんの推薦によるものです。</font></p> <p><font size="3">今だから言いますが、「オレ、ケッコウ、クワシイ、ナカナカ、イケテル、トミタヤスコ、スキ」と思っていましたヨ。</font></p> <p><font size="3">ほんと恥ずかしい（赤面）。</font></p> <p><font size="3">で、こんなオイラなら MS に入社しても十分やってけるだろう！とうかつに考えていたのですが、いざ入社してみると。。。。orz</font></p> <p><font size="3">そりゃー Windows の会社ですから、Windows に詳しい人間なんて捨てるほどいるわけですよ。</font></p> <p><font size="3">しかも、エバンジェリズムグループに入社したわけですから。ここはその道のプロ集団です。誤解を恐れずに言えば、ずーーーーーーーーーーーーーっと Windows とかを触っていられる部署なんです。</font></p> <p><font size="3">提案書とか、お金の計算とか、上司と一緒に3時間客先で謝り続けるとか、夜中にスイッチのセットアップをしたりとか（小塚さんはしてるなww）、そんな必要は基本的に無い部署だったんです。9年の間に会社の変化とともに状況は変わりましたけどね。そんな環境にいる人たちに、そもそも敵うはずないじゃないですか。</font></p> <p><font size="3">いままで「MVPさん！」とか言って持ち上げられてきましたけど、社員になった瞬間に誰も尊敬してくれなくなるしwww扱いは雑になるわで、もう。。。 </font></p> <p><font size="3">入社1か月で、かなりへこみました。ありゃー、これは想定外だったなと。こんなんでやっていけるんかいなって。</font></p> <p><font size="3">しかも彼らは情報収集が早いんですよ。いや、「収集」じゃないな。</font></p> <p><font size="3">正確には「把握」かな。情報を正しく「把握」するスピードが速いんです。</font></p> <p><font size="3">極端な例ですが、こんなことがありました。</font></p> <p><font size="3">アメリカ本社の人事で、どこかの製品開発本部の VP が変わったとき、当時同僚だった奥主（おくぬし）さんが何と言ったかというと。</font></p> <p><font size="3">「あぁ、あのテクノロジーはVPが始めたプロジェクトだからディスコンに向かうな。次に来るのが○○だから、こういう風に変わるよ」</font></p> <p><font size="3">ええええええ？？？？？？？なにそれ～～？？？？？</font></p> <p><font size="3">意味わからない～ww で、結果、その通りになるんですwwww 怖いです。外資怖いです。</font></p> <p><font size="3">でも、そういうことなんですよね。情報を正しく「把握」しておかないと、市場に向けるメッセージがブレますし、早めの把握は間違いを犯さないための防御にもなりえます。</font></p> <p><font size="3">「田辺の壁」って言葉が私の中にあります。「田辺」とは、今は V 社の田辺さんのことです。</font></p> <p><font size="3">私の入社が決まったあと、人事にお願いして事前ミーティングを開いていただきました。入社前に部門の様子とか求められることを聞いておきたかったんです。</font></p> <p><font size="3">そのとき、これから部長になる長坂さん（現 </font><a href="https://www.facebook.com/empathyjp/?ref=br_rs"><font size="3">Empathy Co., Ltd.</font></a><font size="3"> 経営戦略室長）がふともらしたのは「一人まだ変態が来ていないけど、始めましょうか」。「変態？どんな？」と思ったところにやってきたのが田辺さん。いたって普通の人でした。見た目は。</font></p> <p><font size="3">でも、後にその真意がわかりました。田辺さんは RFC の策定状況とかを見ながら数年後のテクノロジーや実装を予測する人でした。今 Windows にこの機能が実装されているのはこの RFC によるもので、その追加仕様が委員会を通過するから将来はこういう方向に進んでいくよ～なんてことを平気で言える人でした。「あの部署に、以前どこどこ会社にいたカレがやって来たから、今後この製品はこういう風に強化されるはず」とか。</font></p> <p><font size="3">「これは確かに変態だ。でも素敵だ！この壁を登りたい！」そう思ったものです。いまだに壁は登りきれていませんorz</font></p> <p><font size="3">そんな変態な方々に囲まれつつ、エバンジェリストとして少しだけ成長し、部門編成も大きく変わり、上司がアメリカ人になり、なんとか 10 年目を迎えようとしているいま、会社自身も大きく変わろうとしています。</font></p> <p><font size="3">マイクロソフトの本社社長 Satya Nadera は以下の 3 つがマイクロソフトのミッションであると唱えています。</font></p> <ul> <li><strong><font size="4">Reinvent productivity and business processes </font></strong> <li><strong><font size="4">Build the intelligent cloud platform </font></strong> <li><strong><font size="4">Create more personal computing</font></strong></li></ul> <p><font size="3">上記それぞれに「Openness」というエッセンスを加えると、マイクロソフトの動きがより明確に見えてくると思います。マイクロソフトのテクノロジーをより広いプラットフォームで利用できるよう、そして逆に、オープンソースなテクノロジーもマイクロソフトのプラットフォーム上で違和感なく使用できるようにすること。それは Interop とか相互互換性などというレベルではありません。すべてのエンジニアがプラットフォームの壁を越えて、違和感なく創造性を発揮できる環境を整えようとしています。</font></p> <p><font size="3">日本でも、そうした環境をがっつり訴求できるチーム作りを続けています。これはかなりマジです。どれくらいマジなのかを図るには直近の人事を見るのがいいです。なぜならば人事はお金がかかるからです。お金をかけていれば、それは間違いなく本気の証です。マイクロソフトの場合は。</font></p> <p><font size="3">エバンジェリズムチームには、新たに 元V社で Azure エバの山本さん、</font><font size="3">DevOps エバの牛尾さん、元 Oracle で Java エバの寺田さん、漫画家で Xamarin エバの千代田まどかさんが加わりました。他にも XBox エバの鵜木さん、DirectX エバの千葉さんとかがいたりするんです。ちょっと向こうのテーブルでは太田寛さんがガジェットの店を広げてハンダ付けとかしてるんです。日本のエバンジェリズムチームも、そうした動きを支え推進できる組織編制になったと、心から思います。</font></p> <p><font size="3">現在、Build 2016 というイベントがアメリカで開催中です。1日目のKeynoteをご覧になられた方は少ないと思いますが、もし</font><font size="3">お時間があれば是非ご覧ください。</font></p> <p><iframe height="315" src="https://channel9.msdn.com/Events/Build/2016/KEY01/player" frameborder="0" width="560" allowfullscreen></iframe></p> <p><a title="https://channel9.msdn.com/Events/Build/2016/KEY01" href="https://channel9.msdn.com/Events/Build/2016/KEY01"><font size="3">https://channel9.msdn.com/Events/Build/2016/KEY01</font></a></p> <p><font size="3">メインテーマは More Personal Computing で、素敵なニューテクノロジーが次々と紹介され、さぁ最後にどこに終着するのかと思ったら！</font></p> <p><font size="3">私、ニコ生本番中にちょっと涙ぐんじゃいましたww。そっか、そういうことなのかと。それが、我々が目指す More Personal Computing なのかと思うとすごく勇気が出てきました。テクノロジーをもてあそびたいわけではないのです。</font></p> <p><font size="3">そんな我々は、５月２４-２５日に東京のプリンスパークタワーで有償のイベントを開催します。</font></p> <p><font size="3">いま私たちが感じている「変革する IT」を皆さんとともに共有できたら幸いです。有償ですけど。なんとかして稟議を通してお越しください！</font></p> <p><font size="3">早期割引は 4月28日までです！お待ちしております。Build 2016 のような、素敵な Keynote を現在検討中です。</font></p> <p><a href="https://aka.ms/decode16ja"><font size="3"><img title="image" style="border-left-width: 0px;border-right-width: 0px;border-bottom-width: 0px;padding-top: 0px;padding-left: 0px;padding-right: 0px;border-top-width: 0px" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/2016/04/image34.png" width="673" height="202"></font></a></p> <p><font size="3">今年のマイクロソフトは面白いですよ～!!</font></p> <p><font size="3">最後になりましたが、せっかくのエイプリールフールなので嘘をかましときますね。</font></p> <ul> <li><strong><font size="4">Linux 上で SQL Server が動くようになります！</font></strong>  <li><strong><font size="4">Windows 10 では Bash が使えるようになります！</font></strong>  <li><strong><font size="4">.NET は .NET Core という名前で Linux と Mac 向けにオープンソース化されました！</font></strong>  <li><strong><font size="4">Xamarin はマイクロソフトに買収され、今後無償化し、全ての Visual Studio ユーザーが利用できます！</font></strong>  <li><strong><font size="4">Xamarin は Visual Studio Community でも使えます！ Xamarin Studio Community も無償です！</font></strong>  <li><strong><font size="4">Visual Studio では iPhone のエミュレーターが使えるようになります！</font></strong>  <li><strong><font size="4">Visual Studio では Android のエミュレーターが既に使えてます！</font></strong> </li></ul> <p><font size="3">やばい。嘘がつけない。。。</font></p>]]></content:encoded>
    </item>
  </channel>
</rss>