オンプレ系インフラエンジニアがAzureを勉強する

いつか誰かの何かの役に立つと嬉しいな

Azure Web Apps×Azure Active Direstoryでブログを作る

はじめに

繰り返される組織編成によりすっかり廃れてしまった社内ブログを復活させようと思い、Azureでブログを作ってみることにしました。
社内への情報共有の手段が確立されていないと、
いくら外部の勉強会などで情報を得てきても、あまり活かせないのです…
 

要件

・指定した人しかアクセスできないようにする。
・誰でも参加がしやすいように一般的なブログの形式を選ぶ。
・いいねができる。

 

構成

Azure Web Apps(Freeプラン)(WordPress)
Azure Database for MySQL(Basicプラン)
Azure Active Directory

 

参考サイト様

Azure AD 認証を構成する | Microsoft Docs

GitHub - psignoret/aad-sso-wordpress: Single Sign-on with Azure Active Directory (for WordPress)

 

手順

以下、Azure Active Directoryで同じディレクトリの人だけがアクセスできるブログサイトの作成手順になります。

 

WordPressの新規作成

Azureで新規リソース作成をします。

WordPress」で検索、作成します。

f:id:mitsunooon:20200119134838j:plain

 

パラメータを設定します。

とりあえず一番安いものにします。

利用状況によってスケールアップしていきます。

f:id:mitsunooon:20200119135123j:plain

f:id:mitsunooon:20200119135254j:plain


ちなみに、この時点でのMySQLの見積もりはこのくらい。

f:id:mitsunooon:20200119135350j:plain

 

リソースが作成されると、App ServiceからサイトURLに飛べます。

f:id:mitsunooon:20200119144248j:plain

f:id:mitsunooon:20200119144305j:plain

 

WordPressの初期設定をします。

f:id:mitsunooon:20200119144410j:plain

f:id:mitsunooon:20200119144530j:plain

 

ひとまず、WordPressが使える状態になりました。

f:id:mitsunooon:20200119144551j:plain

 

 

Azure Active Directoryの設定

 Azure Active Directory>[アプリの登録]を開きます。

f:id:mitsunooon:20200119144856j:plain


[新規登録]をクリックし、新規アプリを追加します。

f:id:mitsunooon:20200119145402j:plain

f:id:mitsunooon:20200119145423j:plain


作成したら、[概要]にて各種IDが確認できるので、コピペして控えておきます。

この後の設定でよく使います。

f:id:mitsunooon:20200119145602j:plain


各種設定をしていきます。

まず、[ブランド]で対象のサイトURLを登録します。

f:id:mitsunooon:20200119145710j:plain


[認証]でリダイレクトURIとその他設定をします。

2種類のリダイレクトURIを登録します。

https://サイトURL/.auth/login/aad/callback
https://サイトURL/wp-login.php

f:id:mitsunooon:20200119145939j:plain

 

[暗黙の付与]で[IDトークン]にチェックを入れます。

f:id:mitsunooon:20200119145957j:plain

 

[既定のクライアントの種類]で[任意の組織ディレクトリ内のアカウント]にチェックを入れます。

[保存]します。

f:id:mitsunooon:20200119150015j:plain


[証明書とシークレット]で新しいクライアントシークレットを発行します。
発行した直後しかキーを確認できないので、忘れずにコピーしましょう。
このキーはWordPress側の設定で使います。

f:id:mitsunooon:20200119150228j:plain

f:id:mitsunooon:20200119150253j:plain

f:id:mitsunooon:20200119150309j:plain

 

[APIのアクセス許可]で[アクセス許可の追加]をします。

[Microsoft Graph]>[委任されたアクセス許可]>[Directory.Read.All]を選択します。

f:id:mitsunooon:20200119150626j:plain

f:id:mitsunooon:20200119150641j:plain

f:id:mitsunooon:20200119150654j:plain


追加したら、[既定のディレクトリに管理者の同意を与えます]をクリックします。

f:id:mitsunooon:20200119150817j:plain

 

[所有者]でサイトへのアクセスを許可するユーザーを追加します。

この所有者がアクセスできるユーザーの設定になるかと思ったのですが、そうではなさそうです。同じディレクトリのユーザーであればアクセスできるようになります。

f:id:mitsunooon:20200119150922j:plain

 

AAD認証の設定

App Service側にAAD認証設定をします。

これを設定することで、サイトURLにアクセスすると認証画面がでてくるようになります。

App Serviceの[認証承認]を開きます。

[App Service認証]を[オン]にします。

[要求が認証されない場合に実行するアクション]を[Azure Active Direstoryでのログイン]にします。

f:id:mitsunooon:20200119151106j:plain


認証プロパイダーの[Azure Active Direstory]をクリックします。

[詳細]にAADの概要で表示された各種IDを入力します。

クライアントID:アプリケーション(クライアント)ID

発行者のURL:http://login.microsoftonline.com/ディレクトリ(テナント)ID

許可されるトークン対象ユーザー:api://アプリケーション(クライアント)ID

f:id:mitsunooon:20200119151357j:plain

 

設定ができたら、サイトURLにアクセスしてみます。

アクセス直後にMSのアカウント認証画面が出てきます。

 

WordPress側のAAD設定

WordPress側にもAADの設定を入れることで、記事の投稿のときに必要になるWordPress側のサインインにSingle Sign-Onが適用されて、ログイン情報入力の手間が省けます。

 

下記サイトよりプラグインをダウンロードします。

GitHub - psignoret/aad-sso-wordpress: Single Sign-on with Azure Active Directory (for WordPress)

 

管理者アカウントで作成したサイトにアクセスします。

[ダッシュボード]>[プラグイン]>[新規追加] >[プラグインのアップロード]にて上記でダウンロードしたzipファイルをアップロードします。

f:id:mitsunooon:20200120115245j:plain

 

アップロードおよびインストールが完了したら、

プラグインを有効化します。

f:id:mitsunooon:20200120115312j:plain

 

[設定]>[Azure AD]にてAADの設定を入れていきます。

入力する必要があるのは下記です。

クライアントID

クライアントシークレット

オブジェクトID

 

チェックボックスの項目は必要に応じて有効にします。

f:id:mitsunooon:20200120115351j:plain

f:id:mitsunooon:20200120115400j:plain


以上の設定が完了すると、サイトのサインインにシングルサインオンが適用されます。

 

おわりに

以上の手順で「指定した人しかアクセスできないようにする。」という要件を満たすための設定ができました。

他の要件を満たす、あったらいいなの機能をもう少し追加しているのですが、AzureではなくWordPressのお話なのでおまけ程度に別記事で書きます。
運用開始ができたら、コストについてもちゃんとまとめたいです。

 

 ※2020/02/01追記

Office365アカウントでの認証ができれば、一回のサインイン入力でさえも省けるようなのでもう少し試行錯誤してみる余地がでました。

Translator TextのWPFアプリ作成チュートリアルを触ってみた

QiitaのAzure AI Advent Calendar 2019 15日目の記事です。

 

動機

チーム内に外国籍の方が数名おり、日本語のみでのコミュニケーションに限界があるときがあります。

そこで、Cognitive ServicesのTranslator Textを使って少しでもコミュニケーションに役立つものが作れたらいいなと思い、まずはチュートリアルを触ってみました。

 

触ったもの

docs.microsoft.com

 

GitHubにもサンプルコードがあります。

GitHub - MicrosoftTranslator/Text-Translation-API-V3-C-Sharp-Tutorial

 

触ってみた

下記サイトを参考にAzureポータルでCognitive Servicesリソースを作ります。
マルチサービスリソースにします。

リージョンは米国西部がおすすめらしいので米国西部です。
コードの変更箇所も減ります。

f:id:mitsunooon:20191214171912j:plain

 

リソースができたらキーを取得します。

f:id:mitsunooon:20191214171928j:plain

 

Githubからとってきたコードの[COGNITIVE_SERVICES_KEY]の部分に上記のキーを入れます。

f:id:mitsunooon:20191214172135j:plain


実行します。
できました!

f:id:mitsunooon:20191214173911j:plain

f:id:mitsunooon:20191214173928j:plain

つまづいたところ

最初、Azureで作るリソースを間違えました。
マルチサービスリソースではなく、Translator Textの単一サービスリソースにしていました。

f:id:mitsunooon:20191214172407j:plain

 
これで作るとJSONのデシリアライズでエラーが出ます。

f:id:mitsunooon:20191214172724j:plain

f:id:mitsunooon:20191214172430j:plain

 

おわり

Cognitive Servicesには翻訳系や音声系のサービスがいくつかあるので
うまく組み合わせて、言語の壁を越えてコミュニケーションが取りやすくなるといいなぁと思います。

【レポ】Microsoft Ignite The Tour Tokyo Day2に参加してきました

Microsoft Ignite The Tour Tokyo Day2に参加したレポート記事になります。

 

概要

2019年12月5,6日でMicrosoft Ignite The Tour Tokyoというテクニカルカンファレンスが開催されました。
今回はIgniteの最新情報というよりも入門編が多めの印象でした。

www.microsoft.com

 

目的

コンテナについての情報を得る。
 
今回の参加にあたり、魅力的なセッションが多すぎたため目的を定めました。
現在業務でAzure Container Instancesを利用しています。
その利用方法を見直す必要が生じたため、コンテナについての情報を収集し社内に展開するというのが私の今回の目標のひとつでした。
ということで、参加セッションはコンテナ周りが中心となっています。
 

 参加セッション

1つ目のセッション

「Azure でのコンテナーとオーケストレーションを調べる」
 
ACIやAKSについての概要説明とデモのセッションでした。
 
コンテナについて
 アプリ開発者がコードに専念するためのもの。
 隔離された環境で同じように使うことができる。→生産性の向上につながる。
 特徴として動作が軽い。
 
デモ①
 Dockerfileのデプロイ。
 細かいコマンドとオプションの説明もありました。
 
Azure Container Instancesについて
 シングルコマンドでコンテナ実行ができるお手軽さ。
 一秒単位での課金となり、実行中のみ換算される。
 仮想マシンの管理はAzureがする。
 
どういうとき使うのか?
 バッチ的な処理が向いている。
 LogicAppsを使うようなアプリに向いている。
 AKSの追加リソースとして使える。
 
Azure Container Repositoryについて
 プライベートなレジストリ
 全てのタイプのコンテナイメージの管理ができる。
 地理冗長もできる。
 
デモ②
 ACRの作成。
 Web App for Containersについて
 コンテナ化されたアプリの実行が簡単。
 
Azure Kubernetes Serviceについて
 デモがよかったです。
 実際に動いているAPIとかが確認できました。
 
全体的に入門という感じで分かりやすかったです。
見よう見まねでやっていたことが間違いでなかったことが確認できて安心しました。
ただし、ACIを常時利用の構成にしていたのでこれは見直さなければいけないとわかりました!

 

2つ目のセッション

「Azure Kubernetes Service を活用したマイクロサービス開発」
前日にJazugでもお世話になった原さんのセッションでした。
AKSについて、基礎的なお話から活用方法までのお話でした。
 
AKSを利用するにあたって、本当に必要な現場なのかを考えることが重要とのこと。
本当に今の構成にAKSは必要なのか?
頻繁にアップデートされるサービスか?
どんどん更新を追加していくものか?
⇒上記がYesならばAKS向きだそう。
 
コンテナは揮発性であり、中身は永続化されない。
永続化したいデータは別DBにちゃんと保管しておいて、クラスタ自体はすぐに捨てられるようにしておく。
k8sは流行っていてよく聞くワードではあるが、
難しいのも事実なので、最初はシンプルな構成から挑戦するのがいい。
 
上記以外にも、用語の説明や構成の説明、デモ等が盛りだくさんかつ分かりやすいセッションでした。
資料が公開されると嬉しいです。

会場にはスピーカーQ&Aというブースが設けてあり、
セッションを終えたスピーカーの方々と直接お話ができました。
今の業務の構成について、原さんに直接ご相談させていただき、解決策をご指南いただきました。
今回の参加で最も有益な機会でした。

 

3つ目セッション

「【アイデア次第!】 Microsoft Teams +α をノーコード・ローコードでカンタンに一層便利に利活用!」
Power Platform界隈でお世話になっている太一さんのセッションでした。
TeamsとPower Platformで業務を効率化するお話でした。
 
Teamsについて
 ただのビジネスチャットじゃない。
 ハブとして使ったときに真価が発揮される。
 Teamsだけでも業務が完結するくらいになってきている。
 このTeamsと相性がいいのがPowerPlatform!
 例)
  データ入力:Power Apps
  繋げる:Power Automate
  可視化:Power BI
  bot:Power Virtual Automate

Teams×Power Platformでの業務効率化の一例として
訪問販売のシミュレーションのお話をされていました。
効果を数字で表されると本当に圧倒的でした。
 
弊社でもTeamsはどんどん活用されているので
Power Platformと組み合わせてさらに効果的に使えたらいいなと思いました。
すべてはアイデア次第…

 

4つ目のセッション

失敗させない! Microsoft Teams 利活用促進への道!」
こちらも太一さんのセッションです。
本当は別のセッションを聞きに行く予定だったのですが、
前のセッションがあまりに面白かったので連続で参加することにしました。
 
Teamsを利活用するために必要なのは何か?
 ・Teamsへの愛
 ・ユーザー仲間への愛
 ・会社への愛
 愛のある人が使い倒して、説得することで響くものがある。
 
Teamsの導入とは?
 ・今までの働き方や考え方を変える必要がある。
 (メールの置き換えやコミュニケーションツールの追加ではない
 ・会社を変えるレベルの話
 ・経営層、力のある人を巻き込む必要がある
 ・好きな会社だから変えようという本気の人たちじゃないと成し遂げられない
 
Teamsの活性化に効果的な方法のひとつとしてチャンピオンプログラム(アンバサダー制度)があげられる。
個人のやる気を会社がどれだけ活かしてあげられるかが肝である。

全体的にマーケティング寄りのお話でした。
何かに愛を持って活動されている人は輝いているなと常々思っていたので
愛を持って行動することの重要性を再認識しました。
私もそれくらい愛を持てるものが早く見つかるといいなぁ

 

感想

今回は知りたいことの目標を定めてセッション選びをしたのでかなり満足度の高い参加ができました。
ちゃんと社内に情報共有します。
セッションそのものも有益ですが、スピーカーQ&Aやエキスパートブースがかなり重要だったと思います。
普段ならばなかなか聞くことができない技術的な悩みをその道のエキスパートさんたちに直接伺えるというのは最高に贅沢でした。
大阪にもあるかと思いますので、参加される方は是非ご活用ください。

Azure FunctionsのDialogflow v2 API対応

はじめに

Google Homeで遊ぶときに利用しているDialogflowのv1 APIが2020年3月に完全シャットダウンしてしまいます。
(元々は2019年10月まででしたが延長されてました。

Release Notes  |  Dialogflow Documentation  |  Google Cloud

 
以前の記事で
Dialogflow+Azure Functionsで
Google Homeの設定をしていたので
こちらのv2対応版を書いていきます。

流れ

  • Azure Functionsの設定

  • Dialogflowの設定
 


Azure Functionsの設定

ちょっと変える程度かと思いきや、がらりと変わりました。
v1の時より汎用性のあるすっきりしたコードにできたので個人的には満足度が高いです。
コード自体はGitHubに記載してます。
 

Dialogflowの設定

設定から[API VERSION]の[V2 API]を有効にします。
[SAVE]します。

f:id:mitsunooon:20191120151855j:plain

f:id:mitsunooon:20191120151913j:plain

FulfillmentのURLを新しいものに書き換えます。

f:id:mitsunooon:20191120151933j:plain

以上で設定は終わりです。
 

動作確認

ちゃんと動きました。やったー。
 

f:id:mitsunooon:20191120155324j:plain

 

つまづいたところ

・WindowsAzure.Storageのバージョン

パッケージのバージョンをすべて最新安定版にしていたら以下のエラーが出てきました。

f:id:mitsunooon:20191120152148j:plain

Microsoft.Azure.WebJobs.Extensions.Storage:Can't bind Table to type 'Microsoft.WindowsAzure.Storage.Table.CloudTable'
 
調べたところ、WindowsAzure.Storageのバージョンが影響しているとのことでした。
9.3.3から9.3.1にダウングレードしたところ無事に動きました。

f:id:mitsunooon:20191120152207j:plain

 

・Table Storageの型

今回の例ではすべてstring型なので影響はないですが、
会社の備品管理を同様の構成でしようとしたところ、備品番号がFunctionsで認識できなくてハマりました。
原因としては、備品番号がTable Storage上ではint型で登録されているのに、Functions上ではstring型にしていたというだけの話でした。
Table Storageのほうを変更しました。
 
 

参考サイト様

 

QnAMaker×PowerAppsで作るチャットボット

過去記事でQnAMakerを使った世界一簡単なチャットボットの作り方を書きました。
その時はTeamsのチャットボットでしたが、今回はPowerAppsを使って独立したアプリの形にします。

 

参考サイト様

PowerAppsとCognitive Serviceでチャットボットを作ろう - 吉田の備忘録

QnAMaker × Azure Bot Service でノンコーディング AI Chatbot 作成 (2019年4月版) - Qiita

 

必要なもの

・Azureアカウント(QnA Maker用)
・PowerAppsが使えるMSアカウント

 

構成イメージ

f:id:mitsunooon:20191015222314j:plain

 

QnAMakerの設定

こちらの過去記事を参照ください。

世界一簡単なFAQチャットボットの作り方 - オンプレ系インフラエンジニアがAzureを勉強する

 

PowerAppsの設定

カスタムコネクタの設定

PowerAppsにサインインします。

カスタム ビジネス アプリケーションの構築 | Microsoft PowerApps

 

[データ]>[カスタムコネクタ]>[+カスタムコネクタの新規作成]をクリックします。

[OpenAPIファイルをインポートします]をクリックします。

f:id:mitsunooon:20191015222716j:plain

 

コネクタ名とインポートするOpenAPIファイルを設定します。

f:id:mitsunooon:20191015222830j:plain

 

OpenAPIファイルはQnAMakerのPublish情報をもとに下記の内容のJSONファイルを用意します。

 "host"と"paths"の部分をQnAMakerのPublish情報のものに書き換えます。

f:id:mitsunooon:20191015223057j:plain

 

{
  "info": {
    "version": "1.0.0",
    "title": "PowerApps",
    "description": "PowerApps"
  },
  "host": "chatbot1015.azurewebsites.net
",
  "basePath": "/",
  "schemes": [
    "https"
  ],
  "consumes": ,
  "produces": [
    "application/json"
  ],
  "paths": {
    "QnAMakerのPOST情報
": {
      "post": {
        "summary": "QnAMaker",
        "description": "QnAMaker",
        "operationId": "QnAMaker",
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": false,
            "type": "string",
            "default": "application/json",
            "description": "Content-Type",
            "x-ms-summary": "Content-Type"
          },
          {
            "name": "body",
            "in": "body",
            "schema": {
              "type": "object",
              "properties": {
                "question": {
                  "type": "string",
                  "description": "question",
                  "x-ms-summary": "question"
                }
              },
              "default": {
                "question": "hi"
              }
            },
            "required": true
          }
        ],
        "responses": {
          "default": {
            "description": "default",
            "schema": {
              "type": "object",
              "properties": {
                "answers": {
                  "type": "array",
                  "items": {
                    "type": "object",
                    "properties": {
                      "answer": {
                        "type": "string",
                        "description": "answer",
                        "x-ms-summary": "answer"
                      },
                      "questions": {
                        "type": "array",
                        "items": {
                          "type": "string"
                        },
                        "description": "questions",
                        "x-ms-summary": "questions"
                      },
                      "score": {
                        "type": "integer",
                        "format": "int32",
                        "description": "score",
                        "x-ms-summary": "score"
                      }
                    }
                  },
                  "description": "answers",
                  "x-ms-summary": "answers"
                }
              }
            }
          }
        }
      }
    }
  },
  "definitions": {},
  "parameters": {},
  "responses": {},
  "securityDefinitions": {
    "api_key": {
      "type": "apiKey",
      "in": "header",
      "name": "Authorization"
    }
  },
  "security":
,
  "tags": []
}
 

 

[1.全般][2.セキュリティ][3.定義]の各項目は特に設定はせずに進めます。

f:id:mitsunooon:20191015223302j:plain

f:id:mitsunooon:20191015223314j:plain

f:id:mitsunooon:20191015223328j:plain

 

[4.テスト]まで来たら、[コネクタの作成]をクリックします。

f:id:mitsunooon:20191015223401j:plain

 

[接続]の項目が出てきます。

f:id:mitsunooon:20191015223445j:plain

 

[+新しい接続]をクリックし、APIキーを入力します。
このAPIキーはQnAMakerのPublish情報の「Authorization」の項目の値を入れます。
EndpointKeyから入れます。

f:id:mitsunooon:20191015223511j:plain

 

[作成]をクリックすると画面が戻ってしまいますので、
また[データ]>[カスタムコネクタ]をクリックします。
先ほど作ったカスタムコネクタをクリックします。

f:id:mitsunooon:20191015223601j:plain

f:id:mitsunooon:20191015223612j:plain

 

[4.テスト]で質問を入力してテストします。

200が返ってくれば問題なく動いてます。
これでカスタムコネクタの作成が完了です。

f:id:mitsunooon:20191015223644j:plain

 

画面の設定

 次に画面の部分を作ります。
PowerAppsで[アプリ]>[+アプリの作成]をクリックします。

f:id:mitsunooon:20191015223824j:plain

 

[キャンバスアプリを一から作成]をクリックします。

f:id:mitsunooon:20191015223853j:plain

 

アプリ名を設定し、
今回はスマフォアプリにする予定なので[電話]を選択します。

f:id:mitsunooon:20191015223915j:plain

 

編集画面が表示されます。

まず最初にアプリを開いたときに表示される文言を設定します。
[Fill]の部分をプルダウンで[OnVisible]にします。
右側の欄の関数を下記にします。
ClearCollect(chat,{name:"答える君",text:"ようこそ。何でも聞いてください"})

f:id:mitsunooon:20191015223955j:plain

 

チャットボットの表示部分を追加します。
[ギャラリー]>[高さ(伸縮可能)]をクリックします。

f:id:mitsunooon:20191015224230j:plain

 

[データソースの選択]>[コネクタ]で先ほど作ったカスタムコネクタをクリックします。

f:id:mitsunooon:20191015224259j:plain

f:id:mitsunooon:20191015224315j:plain

f:id:mitsunooon:20191015224328j:plain

 

文章の長さによって枠の高さを自動調整してほしいのでレイアウトを変更します。
[Gallery]>[レイアウト]>[ニュースフィード]を選択します。

f:id:mitsunooon:20191015224345j:plain

 

[Item]の部分を「chat」に変更します。

f:id:mitsunooon:20191015224437j:plain

 

[Title]の関数を「ThisItem.name」にします。

f:id:mitsunooon:20191015224504j:plain

 

[Body]の関数を「ThisItem.text」にします。

f:id:mitsunooon:20191015224528j:plain

 

チャットボットのアイコンになる画像を設定します。
[ファイル]>[メディア]>[参照]からアイコンにする画像を選択します。

f:id:mitsunooon:20191015224548j:plain

 
編集画面に戻ります。
[Image]の関数を下記にします。
If(name="答える君",'アップした画像の名前',User().Image)
 
アイコンの位置も変わるように設定します。
[X]の関数を下記にします。
If(name="答える君",16,570)

f:id:mitsunooon:20191015224615j:plain

 
会話の入力部分を作ります。
[挿入]>[テキスト]>[テキスト入力]をクリックします。

f:id:mitsunooon:20191015224727j:plain

 
[ボタン]をクリックします。
[Text]部分を「送信」にします。

f:id:mitsunooon:20191015224751j:plain

 
ボタンの[OnSelect]を下記の関数にします。
Collect(chat,{name:"あなた",text:TextInput1.Text});
Collect(chat,{name:"答える君",text:First(PowerApps.QnAMaker({question:TextInput1.Text}).answers).answer});
Reset(TextInput1)

f:id:mitsunooon:20191015224818j:plain

 
これで大体の設定ができました。
右上の再生ボタンで試してみます。

f:id:mitsunooon:20191015224904j:plain

それっぽく動きました!
ちゃんと文章に合わせて高さも変わりますね。

これに追加でラベルやボタンの色などを変えて見た目を整えます。

f:id:mitsunooon:20191015224922j:plain

よりチャットボットらしくなりましたね!
 

用途

チャットボットはカスタマーなどのお客様対応に使われる印象が強いですが、情報共有としても有用だと思います。

私は今回作ったチャットボットを個人用のKBチャットボットとして使っています。
アカウント情報や作業手順などの情報が整理できて重宝してます。
少し応用して、社内の情報共有アプリにできたらいいなと思っています。

 

おわり

PowerAppsの好きなところは、表現の幅が広くて凝ろうと思えばいくらでも凝ったUIにできるところです。

また、iPhoneでもAndroidでも使えるアプリが簡単に形にできるのは本当にストレスフリーです。

今回触れていないですが、QnAMakerのmulti-turnという機能もとても便利で好きなので、その機能もPowerAppsで表現できるようにしたいと思います。

 

【レポ】Japan Azure User Group 9周年イベントに参加してきました

JAZUG9周年イベントに参加したレポート記事になります。

 

JAZUGとは?

Microsoft Azureを学び、楽しみ、活かす、日本のユーザーグループです。
月に1度、定期的な勉強会を開催しています。
今回は9周年イベントということで特別なプログラムのイベントを開催しました。
また、7月から開催されていたてらだよしおさんの「Japan Tour in Summer: Java & k8s on Azure まつり」もここでファイナルを迎えられました!すごい!

 

jazug.connpass.com

 

セッション

今回はRoom C+DとRoom Bで同時に別々のセッションが開催されました。
ここではRoom C+Dで行われていた9周年イベントの方のセッションについて書いていきます。
Room Bで開催されていた「てらだよしおまつりファイナル」については
女子部の時のレポート記事が参考になればと思います。

【レポ】Java & k8s on Azure まつり@女子部に参加してきました - オンプレ系インフラエンジニアがAzureを勉強する

 

私は受付をしていたため、1つ目のセッションは聞けなかったので、2つ目以降のセッションからになります。

 

「Azure DevOps × スクラム で実現するプロダクト開発のポイント」

スピーカー:関 満徳さん(@fullvirtue)
資料:

Azure DevOps × スクラム で実現するプロダクト開発のポイント #dotnetlab #jazug

 

AzureDevOpsで開発したときに誰が何をどの粒度で書けばよいかわからない
というよくある疑問についてのお話でした。

Azure DevOps、スクラム、プロダクト開発についての説明から始まり、
それぞれの歴史についてもお話があり大変興味深かったです!
個人的には歴史と同じくらい具体的に少し未来の話もあったのが面白かったです。

題になっているAzure DevOps × スクラムで実現するプロダクト開発については
具体的な参考事例をお話しくださったので、ポイントがわかりやすかったです。
エピック、フィーチャー、ユーザーストーリー、タスクを対応表に示すのが良さそうです。

 

「AzureでIoTって実際どうなの?皆さまに知っていただきたい 東京エレクトロンデバイスによるAzure IoT関連事例とその裏側」

今回のイベントのスポンサーである東京エレクトロンデバイスさんのセッションです。


スピーカー:茂出木さん

Windows EmbeddedとIoTへの愛があふれているお話でした。

現在の形のAzure IoT Plug and Playまでの道のりは長いものだったそうです。
昔のAzure IoTはPaaSとの組み合わせで、デバイス側とクラウド側両方の技術が必要であったり、シナリオを利用してもカスタムが大変だったりと一筋縄ではいかなかったそう…

現在はユーザーの希望に合わせて進化しているため、どんどんシンプルに、誰でも使えるようになっています。
現在のAzure IoT Plug and Playではデバイスのほうにすでに必要なものが埋め込まれていて
jsonファイルをダウンロードしてIot Hubに入れればすぐに動かせるらしいです!
これはぜひやってみたいです!

ちなみに、茂出木さんはお掃除ロボにラズパイを載せて自由に操縦したりするほど組み込みもお好きなようでした笑
デモ動画がおもしろかったです。

 

スピーカー:野崎さん

東京エレクトロンデバイスさんについて軽快な話口でご説明くださいました。
IoT,PoCは爆発的に伸びる可能性のある市場であること、
具体的にはコインランドリーなどで有効活用されていることなど興味深いお話が聞けました。

また、IoTだけでなくAzure関連も手広く携わられているようで、Azure×Veeamもされているとか!あらゆるバックアップをAzureに移行できますって!

東京エレクトロンデバイスさんでは、IoTビジネス共創ラボという勉強会も開催されています。

IoTビジネス共創ラボ - connpass

 

「Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について」

スピーカー:山口 真也さん(@izuru_yamarara)
資料:

Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について

togetter:

JAZUG 9 周年 イベント 「Azure AD とアプリケーションを SAML 連携する際に陥る事例と対処方法について」登壇時のまとめ。 - Togetter

 

AzureADとSSO、SAMLについてのお話で、図解を交えた大変わかりやすいお話でした。
いつ調べてもいまいちピンとこなかったAzureADとSSOについて今までで一番わかったような気がします。

とにかく図がわかりやすいので、是非togetterと合わせて資料を見てください!!!


山口さんはサポート担当の方ということで、実際にあった問い合わせへの回答等をご紹介くださいました。
エラーを再現して解消するまでのデモが本当にスムーズで見ていて気持ちがよかったです。

SSO関連のエラーはエラー画面がすべてを物語っているそうなのでエラーはちゃんと読みましょうね…

 

LT大会

セッションの後はLT大会でした。
おひとり5分という短さかつ様々なジャンルのお話ということで密度の高い時間でした。
アジェンダのご紹介と簡単な感想になります。
アジェンダはほぼconnpassから引用してきたので実際の題名と異なっていると思います。すみません。

 

1.「Azure Sentinel でどこまでログを集められるのか(仮)」

スピーカー:Shinsuke Saitoさん
実際にお家で稼働させているAzure Sentinelがどんな感じを見せてくださいました。
1人分の稼働でも結構なログがたまっていて、お金もそれなりにかかるというのが印象的でした。

 

2.「航空機事故から学ぶアーキテクチャとモニタリング」

スピーカー:しばやんさん
飛行機事故の事例から学べるアーキテクチャが多くてびっくりしました。
ベースは飛行機事故のお話でしたが、ITの現場でも同様の事故が起きるのが容易に想像できる内容でした…
人はミスするものなので、そもそも操縦ミスや整備ミスのせいにしないような仕組みづくりをするというのが心に刺さりました。

 

3.「今日から始めるARMテンプレート」

スピーカー:dz_さん
資料:

今日から始めるARMテンプレート

Azureリソース管理はどうする?→Azure Resource Managerテンプレートを使おう!
というお話でした。
5分という短い中でも華麗にテストデモまで披露してくださいました。
dz_さんはこの日「DevRel/Japan Conference 2019」のイベントで登壇した後にこちらでも登壇というハードスケジュールでした!(私もDevRelも行きたかった…泣

 

4.「IntuneとWSUSを使ってWindows Updateやってみた。」

スピーカー:ShotaYmmrさん
IntuneとWSUSを使ったWindows Updateが題材ということで
ヘイシャとも親和性が高い内容でびっくりしました。

ITエンジニアになった最初のころに実際に検証された内容ということで真に迫るものがありました。

 

5.「Micronaut on Azure試してみた」

スピーカー:ひらりんさん
資料:

Micronaut on Azure 試してみた

題名の通りMicronaut on Azureを試してみたお話で、簡単なコードでWebAPIが作れていました。
現段階では厳しいようなところも言及されていて勉強になりました。

 

6.「Microsoft Learnにコンテンツはどこまでマージされたか?(仮)」

スピーカー:akiyoshiさん
Microsoft Learnには現在676のモジュールがあるそうです!
私もお世話になっています。
コンテンツの統廃合などが激しいようで、リダイレクトされたコンテンツの紹介時のakiyoshiさんがあまりに寂しそうだったのが印象的でした。
常に進化しているMS Learnですので新鮮なうちに触っておきましょう!

 

7.「社内でnon azure勢から脱却をした話」

スピーカー:morihayaさん
AWS/IDCFからAzureに移行している中で感じたことのお話でした。
今回のJAZUGイベントがとても楽しかったようです!

 

8.「新しいAzure資格の体系と内容」

スピーカー:d-takadaさん
MS Learnの話に続き、Azure周りの資格も変化が激しいようです。
私もAzureの資格を取ろうかと思っているのですが、
変化があまりに怒涛過ぎて、勉強しているときや取った直後に廃止とかだと少し悲しいなと思って二の足を踏んでしまいます…ちゃんと更新すればいいんですけどね笑

 

懇親会

スポンサーの東京エレクトロン デバイスさんよりたくさんの食べ物飲み物をご提供いただきました!
ありがとうございます!

懇親会の最中もLT大会が開催され、飛び入りで何名かの方がお話しくださいました。

LTを聞きながらの懇親会は話が弾むのでとても好きです。

 

ノベルティ

今回もノベルティがたくさん用意されてました!
ステッカー、飴、Tシャツ、etc…

なんといっても目玉は東京エレクトロン デバイスさん提供の
イベントオリジナルサーモボトル!!!
素敵デザインはMS MVPの松本典子さんのものです!

Japan Azure User Group 9周年イベントのノベルティデザイン制作を担当しました。 | nrjlog

 

f:id:mitsunooon:20190908222539j:plain

f:id:mitsunooon:20190908222612j:plain

感想

初めてコアメンバーとしてJAZUGに参加させていただき、もうずっとドキドキでした。
朝の集合の時には誰に声をかけてご挨拶したらいいのか全くわからず途方に暮れてたら、足利さんが見慣れない人一人一人にお声をかけていて、そこで救われました。
また、受付の準備や懇親会の準備、撤収作業でもコアメンバーの方々、参加者の方々にお世話になりました。
皆様本当にありがとうございました。

今回のイベントもとても楽しく、学びが多かったので、
今後もJAZUGイベントを盛り上げるお手伝いをしていきたいと思います!

 

Azure Container Instancesで複数WebAPIを扱う

はじめに

Azure Container Instancesを使って
複数のWebAPIをコンテナグループで管理しようとしたときに
ポートを分ける方法でつまずいたので書いておきます。


目的

複数のWebAPI(コンテナ)をコンテナグループでまとめて、
IPアドレスやDNSnameは一つで、ポートを分けて各WebAPIにアクセスできるようにすることです。

<参考>

Azure Container Instances のコンテナー グループ | Microsoft Docs


使う環境

  • Azureアカウント
  • VisualStudio2019(WebAPI用)
  • Docker for Windows(version 19.03.1)

 

全体の流れ

Container Registryの作成(Azureポータル)


Dockerfileの作成(ローカル)


Dockerイメージのpush(ローカル)


Container Instancesの作成(Azureポータル)


手順

Container Registryの作成

Container Registryを作成します。
APIのDcokerイメージを置いておくところになります。

<詳細>

Azure Container Registry のドキュメント - チュートリアル | Microsoft Docs

 

Azureポータルにログインします。
新規リソース作成から[コンテナー]>[ContainerRegistry]をクリックします。

f:id:mitsunooon:20190825095208j:plain


簡単にパラメータを設定します。

f:id:mitsunooon:20190825095232j:plain


完成したら、アクセスキーを確認します。
後ほどDockerイメージをpushするのに使います。

f:id:mitsunooon:20190825000322j:plain

 

Dockerfileの作成

今回WebAPIはVisualStudio2019で用意しました。
ローカルで起動させるとこんな感じです。
それぞれ別のポートでアクセスします。
詳しいコードのついては省略します。

f:id:mitsunooon:20190825000502j:plain

f:id:mitsunooon:20190825000520j:plain


このAPIそれぞれにDockerfileを作成します。
VSにてプロジェクトを右クリックし、[追加]>[Docker サポート...]をクリックします。

f:id:mitsunooon:20190825000546j:plain


ターゲットOSは[Linux]で[OK]をクリックします。

f:id:mitsunooon:20190825000603j:plain


Dockerfileが作成されます。
この中の「EXPOSE 80」の部分を今回使いたいポートに変更します。
今回はDeleteApiを5000、GetApiを5001にします。
これはローカルで実行したときとは異なるポートですが、問題ありません。

f:id:mitsunooon:20190825000635j:plain


Dockerイメージをビルドします。
作成したDockerfileを右クリックし、[Dockerイメージのビルド]をクリックします。
これでDockerのイメージが作られます。

f:id:mitsunooon:20190825000828j:plain


コマンドプロンプトで確認します。
ちゃんと作られてますね。

>docker images

f:id:mitsunooon:20190825000932j:plain


Dockerイメージをレジストリにpushする

作成したイメージにタグをつけます。
Azure上のレジストリ内でバージョン管理するための認識です。
APIを編集更新するたびにDockerイメージをビルドしなおして
レジストリにあげる必要があるので、
タグを分けておくと、古いバージョンに戻すのも楽だと思います。

>docker tag <対象イメージのIMAGE ID> <接続先レジストリサーバー名>/<対象イメージ名>:tag

f:id:mitsunooon:20190825095402j:plain

レジストリにpush

Azure上で作成したレジストリにpushします。

まずAzure上のレジストリにログインします。

>docker login <レジストリサーバー名> -u <ユーザ名> -p <パスワード>

f:id:mitsunooon:20190825001440j:plain

 

その後にpushします。

>docker push <レジストリサーバー名>/<イメージ名>:tag

f:id:mitsunooon:20190825095434j:plain


Azureポータル上で確認します。
ちゃんとpushされてますね。

同様にもう一つのAPIレジストリにpushします。

f:id:mitsunooon:20190825001545j:plain


Container Instancesの作成

いよいよ本題のContainer Instancesを作成します。

今回は複数のサービスがあるコンテナグループになりますので
下記手順を参考にしています。

チュートリアル - Azure Container Instances に複数コンテナー グループをデプロイする - テンプレート | Microsoft Docs


テンプレートの作成

Container Instances用のテンプレートを用意します。
参考サイトをもとにazuredeploy.jsonを作ります。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "containerGroups_ContainerInstancesTest_name": {
            "defaultValue": "ContainerInstancesTest",
            "type": "String"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.ContainerInstance/containerGroups",
            "apiVersion": "2018-04-01",
            "name": "[parameters('containerGroupsName')]",
            "location": "japaneast",
            "properties": {
                "containers": [
                    {
                        "name": "deleteapi",
                        "properties": {
                            "image": "containerregistry0824.azurecr.io/deleteapi:1.0.0",
                            "ports": [
                                {
                                    "protocol": "TCP",
                                    "port": 5000
                                }
                            ],
"resources": { "requests": { "memoryInGB": 0.5, "cpu": 0.25 } } } }, { "name": "getapi", "properties": { "image": "containerregistry0824.azurecr.io/getapi:1.0.0", "ports": [ { "protocol": "TCP", "port": 5001 } ], "resources": { "requests": { "memoryInGB": 0.5, "cpu": 0.25 } } } } ], "imageRegistryCredentials": [ { "server": "レジストリサーバー名", "username": "レジストリユーザー名", "password": "パスワード" } ], "restartPolicy": "Always", "ipAddress": { "ports": [ { "protocol": "TCP", "port": 5000 }, { "protocol": "TCP", "port": 5001 }, ], "type": "Public", "dnsNameLabel": "ContainerInstancesTest" }, "osType": "Linux" } } ] }


編集する箇所としては各種名前、image、port、imageRegistryCredentials、各コンテナの設定あたりでしょうか。
各種名前:defaultValueがContainer Instancesの名前。dnsNameLabelがURLになるホスト名。nameが各コンテナの名前。
image:コンテナグループに入れるサービスのイメージ。
レジストリからコピーしてくると間違いないです。
port:VSで作成したDockerfileに記載したportを指定します。
imageRegistryCredentials:レジストリのアクセスキーの情報。

(補足)
リージョンによってCPU等の使用に制限があります。
最小値は1ではないので、動作に影響さえなければ0.5とかでも動きます。

Azure Container Instances リソースの可用性 | Microsoft Docs


テンプレートのデプロイ

AzureのCloudShellに接続し、作成したテンプレートをアップロードします。

アップロードしたファイルをコマンドでデプロイします。

>az group deployment create --resource-group <リソースグループ> --template-file <テンプレートファイル>

f:id:mitsunooon:20190825101337j:plain

 

テンプレートに間違いがあればエラーが表示されます。
問題なく実行されればしばらく待った後にContainer Instancesの情報が表示されます。

デプロイが終わったらポータル上で確認します。
コンテナが二つできてますね。(でも一つ動いてない…?

f:id:mitsunooon:20190825002332j:plain


接続してみます。
つながらない…なぜ…

f:id:mitsunooon:20190825002348j:plain


よくよく設定を見てみます。
プロパティではちゃんとポートが指定されてます。

f:id:mitsunooon:20190825002403j:plain


ログを見ると…むむむ。
なぜかポート80の表記が。

f:id:mitsunooon:20190825101418j:plain


これはデフォルトが変わってないのでは?
と思い調べるとやはり環境変数を変える必要がありました。

asp.net - Why does aspnet core start on port 80 from within Docker? - Stack Overflow


ということで、テンプレートの"containers"配下に以下の部分を追記します。

"environmentVariables": [
{
"name": "ASPNETCORE_URLS",
"value": "http://+:5000"
}
],


もし一つのコンテナに複数のポートを割り当てたい場合は;で仕切ります。

"environmentVariables": [
{
"name": "ASPNETCORE_URLS",
"value": "http://+:5000;http://+:5002"
}
],


Container Instancesを再デプロイします。

確認します。
うんうん、ちゃんとポートが割り当たってますね。

f:id:mitsunooon:20190825002653j:plain


接続します。
ちゃんと各ポートで接続されますね。めでたし。

f:id:mitsunooon:20190825002719j:plain

f:id:mitsunooon:20190825002736j:plain


おわりに

初めはDockerComposeを使いたかったのですが、
DockerOSがLinuxの場合、APIは一つまでしか対応していないようで断念…
API一つとDB等を組み合わせるには良いようです。
Preview版でなくなったときは複数APIも使えるようになってると嬉しいです。