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

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

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で表現できるようにしたいと思います。

 

【レポ】PowerAppsでローコーディングなハッカソンに参加してきました

PowerAppsのハッカソンに参加したレポート記事になります。
 

概要

「アプリは誰でも作れる日がきた」をスローガンにPowerAppsのハンズオンとハッカソンが同時開催された勉強会です。
なおかつ、東京と福岡の2拠点同時開催というお得感満載でした。
 
 

セッション&ワークショップ

スピーカー:吉田 大貴さん(@TaikiYoshidaJP)
テーマ:「アイデアをデジタル変革させるには」
 
イデアをどうやってPowerAppsにするかがテーマのセッションでした。
そもそもPowerAppsは単純なものから複雑なものまで網羅できるサービスとして、使い方次第で実現できることの幅が広いものだそうです。
PowerAppsを効果的に使える場面としては下記になります。
・情報の収集
・情報の共有(部門をまたぐ業務など
・情報のデジタル化(紙の申請書など
 
PowerAppsを利用した事例がYouTubeで見れます。
今回はHeathrow空港の例を拝見しました。
他にも事例がたくさんあるようです。

 

youtu.be

 

また、PowerAppsでのアプリ開発は従来の開発方法とは異なります。
イメージとしてはアジャイルをさらにスーパーアジャイルにしたもので、一週間で1サイクルの目安。
 【計画→設計→作成→テスト→改善】
ローコーディングなので、極端な話だとお客さんの目の前で動かしながら認識のすり合わせをすることもできるようです。

 

セッションの合間に下記のようなワークショップがありました。
午後のハッカソンの下地になるものでした。
 
1.今困っている業務フローを書き出す。
2.アプリを使う人のペルソナを書き出す。
3.ペルソナに基づいてOKR(目的と結果)を書き出す。
4.業務フローとペルソナをもとにタスクを洗い出す。
5.アプリの画面スケッチを書き出す。
6.アプリの機能に優先順位をつける。

個人でアプリを作る際にもこのワークショップの流れを意識して作れば
目的を見失わずに丁寧なものが作れる気がしました!
(作ることに夢中になり目的を見失いがちなので...
 

ハッカソン

午後からいよいよハッカソンです。

テーマ:ボランティア、介護、教育、子育て
チーム:HappyBirthday王者(東京)、NPOハック四(東京)、QBSLab(福岡)(1チーム当たり4~5人)
制限時間:約2時間

アカウント:PowerApps用に1人1つMSアカウントを割り振っていただきました。

 

私のチーム(HappyBirthday王者)は災害ボランティアの支援アプリを作ることにしました。
目的:被災地の状況を素早く把握し、的確にボランティアを派遣できるようにすること。
ユーザー:被災地の役所の人、ボランティア参加の人
概要:
  役所の人が被災地の写真をメインに被災状況の情報を集める
  →集めた情報をもとに役所の管理者が支援の優先順位を決める
  →ボランティア参加の人の情報を集め、適正によって仕事を割り振る
ポイント:
  被災現場で使うものなので、極力自由入力の少ないものにする。
  幅広い年齢層が使えるようにUIを簡潔なものにする。
  災害ごとに使えるように汎用性の高いものにする。
  オフラインでも使えるものにする。

 

以下、私のチームでの制作の流れになります。
まず、アプリに必要なデータをTeamsに書き出し共有します。

f:id:mitsunooon:20190929204808j:plain

書き出したデータをもとにエンティティを登録していきます。

f:id:mitsunooon:20190929204847j:plain

f:id:mitsunooon:20190929204857j:plain


データモデルが出そろったら、アプリを作ります。
[データから開始]という機能を使うとエンティティのデータをもとにアプリの大枠を作ってくれます。
もとになるデータも選べ、今回はCommon Data Serviceを使います。

f:id:mitsunooon:20190929204933j:plain

f:id:mitsunooon:20190929205239j:plain

 
一覧表示、項目の詳細、書き込み画面の3種類が自動で作られます。
後は、午前中に書いた画面スケッチに沿って必要な項目を追加していきます。

f:id:mitsunooon:20190929205323j:plain

 
画像の表示もパラメータを1行いじることで可能でした。

f:id:mitsunooon:20190929205404j:plain

 
2時間でユーザーごとに合わせた3つのアプリができました。
・被災状況収集アプリ
・管理者操作アプリ
・ボランティア情報アプリ
 
また、完全な連携までは至りませんでしたが、
PowerBIで被災地が地図上ですぐに確認できる機能も作成しました。
 

コンポーネントの使い方

複数人で開発する環境で、ヘッダーなどアプリ内で統一したいものはコンポーネントを使用すると便利ということで、まだプレビュー機能ですがレクチャーいただきました。
メモとして簡単に記載しますので、詳細は吉田さんの記事をご覧いただくのが良いです。

PowerAppsのアプリが10倍速く作れるキャンバスコンポーネントとは? - Taiki's Memorandum

 

アプリ作成開始後、
[アプリの設定]>[詳細設定]>[コンポーネント]オンにする。

f:id:mitsunooon:20190929213219j:plain

 

 アプリ編集画面に戻り、
[挿入]>[カスタム]>[+新しいコンポーネント]
にて必要なコンポーネントを作成します。

f:id:mitsunooon:20190929213252j:plain

 

f:id:mitsunooon:20190929213407j:plain


アプリ画面にて
[挿入]>[カスタム]で先ほど作ったコンポーネントが表示されて使えるようになります。

f:id:mitsunooon:20190929213432j:plain

 

アプリの紹介と結果発表

審査方法は、参加者と審査員の皆さんで各チームへの評価を専用フォームに投票し、そのポイントが一番高かったチームが優勝となります。
 
<HappyBirthday王者チーム>
テーマ:災害ボランティア支援アプリ
審査員評価:ボランティア情報の登録にて、大量の人がPowerAppsを利用するにはライセンス問題に懸念がある。
 
NPOハック四チーム>
テーマ:災害ボランティア支援アプリ
概要:災害支援の依頼電話を受けたNPOのボランティアの人向けのアプリ。
アピールポイント:NPOの人の拠点が散在していることで、情報の受け渡しに問題があることを解消したい。
審査員評価:受電だけで依頼を回す場合、捌ききるにはそれなりの人のリソースが必要なため、ライセンスの運用に問題はないか。
 
<QBSLabチーム>
テーマ:実績登録システム
概要:社内の工数や実績などをリアルタイムで入力できるアプリ。
アピールポイント:実際の業務で困っていることを取り上げた。題名のUIにこだわった。
審査員評価:工数や実績の入力項目が自由記入のため、手間と感じ記入しない人が出るのではないか。

<結果>
優勝:NPOハック四チーム!!!
おめでとうございます!
個人的にNPOハック四チームのアプリでいいなと思ったところはUIのきれいさでした!
短時間でも色味やボタンなどにもこだわって作られていているところが素敵でした。
 
また、審査員の方からのお話であった、PowerAppsを使うこととハッカソンで意識することのポイントが刺さりました。
・競合の既存製品にどう勝てるか
・PowerAppsじゃないとできないことを見せる(誰が何をだれのために)
 
PowerAppsは本来Dynamics365がメインということで
そちらの知識や背景、前提なども知っているとより良いとのことでしたので
ちゃんと勉強していこうと思います。
 

感想

完全に趣味で触り始めて興味を持ったPowerAppsで、人生初めてのハッカソンに参加しました。どきどきでした。
案の定、スキル的には全く追い付かずでしたが、PowerAppsの使い方を学べたとてもいい機会でした!
今後も何かしらのハッカソンに参加したいと思っているので、貢献できるようなスキルや立ち居振る舞いを身に着けます。
全体としては、コミュニティ運営の方々の仲の良さが際立っていて、居心地のいい雰囲気のアットホームな会でした。初めてのハッカソンが今回のような優しい雰囲気のもので心底よかったです。
また、福岡とのTeamsを使ったリモートなやり取りも新鮮でした。
今回の学びを踏まえて、自分用に作っているアプリを改良してまた改めて記事に書きます。
運営の皆様、チームの皆様、ありがとうございました。

【レポ】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も使えるようになってると嬉しいです。

 

【レポ】Java & k8s on Azure まつり@女子部に参加してきました

てらだよしおさん(@yoshioterada)の
Japan Tour in Summer: Java & k8s on Azure まつり@女子部に運営として参加したレポート記事になります。

今回はJava女子部さん(@java_women)との共催で、
コンテナ、Docker、Kubernetesについての
座学とハンズオン(モブプロ)というプログラムでした。

本記事では女子部のイベントがどんな雰囲気だったかを中心に書いていきます。
ハンズオンの詳細な内容はちゃんと復習してから別途書きたいと思います。

 

午前の部 座学

コンテナの基礎についての座学でした。
1人で参加されている方が多く、初めは皆さん緊張している様子でした。
それでも参加者の方から質問も出ていたので、質問はしやすい雰囲気だったのかと思います。

 

座学の内容については
イベントページに資料がありますのでご覧ください。

Japan Tour in Summer: Java & k8s on Azure まつり@女子部 - connpass

 

前回のJazug女子部の勉強会もコンテナ編でしたので
こちらの資料もあわせてご覧いただくと
よりコンテナについてのイメージがしやすいと思います。
この時はMicrosoftの真壁さんがお話ししてくださいました。
こちらの資料も初学者向けでとてもわかりやすいので是非!

JAZUG女子部 第14回勉強会 - connpass

 

当日、参加者の方から出た質問で個人的に印象に残ったものを記載します。

 

Q.Dockerのセキュリティ周り(脆弱性対策など)はどうしたらいいですか?
A.極力オフィシャルのイメージを使ってください。
最近はセキュリティチェックツール(Aqua SecurityやTwistlockなど)もあるのでそれを活用するのも一つの手です。

 

Q.コンテナの下側のマシンについては意識したほうがいいですか?
A.意識することは大事です。
コンテナは基盤になるマシンのリソースを借りて動いているので、
コンテナの設計は基盤のマシンのリソースを使い切らないように設計しないといけません。

 

Q.コンテナの利用シーンとは?
A.いろんなところで使われています。
特に開発やテスト等、統一された環境を用意する必要がある場面で有効です。
また、スケールアウトのものはコンテナ向きですが
スケールアップのもの(DB等)はあまりコンテナ向きではないです。

 

午後の部 ハンズオン

1チーム6人ほどに分かれてモブプロ形式のハンズオンをしました。
私のチームはJava女子部の方が多く、女子部の勉強会に参加されるのが初めての方も何人かいらっしゃいました。
皆さんLinuxコマンドなどの基礎知識をお持ちで、比較的スムーズに進められました。

他のチームも和気あいあいとした様子で、
時には拍手も起こるような盛り上がりでした笑

Microsoftさんのご厚意でお菓子もあったので、
おやつを食べながらできたのもよかったです。
(女子部イベントではおやつがある率が高い気がします笑

 

ハンズオン全体の流れ

<事前準備>
  • チーム内の共有メールアドレスを一つ作成
  • 共有のAzureアカウント作成

  • 情報共有のためのツール設定

  (私のチームはTeamsを使いました。初めてTeamsの画面共有など使いましたが、使い勝手もなかなか良かったです。

 

<Docker&Kubernetesハンズオン内容>

持ち回りでオペレーターを交代しながらやりました。
自分のオペレーションをみんなに見られるというのは緊張しましたが、
わからないところなどをみんなで相談しながらできたので心強かったです。
また、手順で詰まった時もすぐに寺田さんが丁寧に説明してくださるので
ストレスフリーなハンズオンでした。

モブプロは激しい意見のぶつかり合いをする怖いものだと思っていたので
かなり印象が改善されました笑

 

その他感想

運営側で丸一日イベントに参加するのは初めてだったので、前日からずっとドキドキしてました…
運営として参加した反省としては、もっと会場の様子を写真に撮っておけば良かったと思いました。

女子部のイベントの様子がわかることで来てみようと思える人がきっといると思ってるので、今後はイベントの様子がわかるような写真を撮ります!
(私は初めてJazug女子部のイベントに参加したときは、どんな感じか知りたくて事前にめちゃくちゃ調べたタイプなので笑

 

今後のイベント情報

てらださんのJapan Tour in Summerはまだまだこれからですので
各会場でご都合会う方はぜひ!
会場ごとにプログラムも異なるようなのでできることなら全通したいくらいです笑

 

JAZUG (Japan Azure User Group) - connpass

 

ツイッターハッシュタグ【#てらだよしおまつり】で検索いただくと
参加者の方の生の声や現地の様子がよりわかると思います。

 

おわり

朝から夕方までという長丁場でしたが、

暑い中ご参加いただいたみなさま、共催いただいたJava女子部のみなさま、本当にありがとうございました。

また女子部のイベントでお会いできると嬉しいです。

【レポ】Red Hat Certified Professional Day 2019に参加してきました

Red Hat Certified Professional Day 2019に参加してきたレポート記事になります。

 

Red Hat Certified Professional Day 2019とは

Red Hat認定資格者向け特別企画です。
私もいくつか資格を持っていたので今回ご招待いただきました。
今回のテーマは「学び」ということでラーニング周りの話を中心に
8名のRed Hat社員の方々から日々の学習方法についてお話を伺いました。

Red Hat Certified Professional Day 2019


密度の濃い時間でしたので、印象に残っているところをかいつまんで書いていきます。

 

セッション1:「エンジニアの価値を上げるためのLinux+1」

スピーカー:平さん(KVMやAnsibleについての書籍を出されています。 

 

  • エンジニアの付加価値について
ベースになる技術に+1をしてエンジニアとしての価値を高めようというお話でした。
例えば、今回はベース技術をLinuxとして
クラウドビッグデータ、ネットワーク、DB、ビジネスのような技術のいずれかを+1として
習得することでLinuxエンジニアとしての価値が高まるという形です。

意外にもビジネスの分野を兼ね備えているエンジニアというのはなかなかいないそうです。

 

  • 情報ソースについて

 様々な情報ソースがありますが、それぞれの特性を理解して活用する必要があるそうです。

メーカーの公式ドキュメント、技術書、ブログ、セミナー、社内外の勉強会…
セミナーはその時売りたいものなどによって情報の内容に偏りが出るので

純粋な情報収集としてはあまり向かないというのが印象に残ってます。

 

 セッション2:「Global Learning Service プレゼンターセッション」

 スピーカー:Vikramさん(シンガポールからいらした。日本人に配慮した聞き取りやすい英語でした。

 

IBMRed Hatを買収したことは最近もニュースになっていましたね。
それについては、買収されたとしてもRed HatRed Hatとしてブランドのスタンスは変わらないとのことでした。

IBMの市場の強さを味方にして、より強い企業になるとの意気込みで安心しました。

 

Red Hatには数々のトレーニングプランがあります。
多くの企業がトレーニングに伸び悩んでいる中、
Red Hatのトレーニングは受講者による評判も良いらしいです。

私もRHCSAのための講座でLinuxの基礎を学んでものすごく役に立ちました。

 

  • ラーニングコミュニティ
1年前に立ち上げたというラーニングコミュニティについてもご紹介されてました。

Home - Red Hat Learning Community

 

スピーカー:Arunさん(デリバリのマネージャー。Linuxに長く携わっている模様。

 

  • Linuxの歴史について
Linuxは15年ほど前はただの周辺機器のOS(サーバ)という認識で小馬鹿にされていたらしいです。あまり業務向きではない、と。
その状態から今の立ち位置まで築き上げられたのは、
IT業界の変化に敏感に対応していたからだと思います。
仮想化の波にもやクラウドの波にも遅れることなく。

それもやっぱりOSSにかかわる人たちの頑張りがあってのことなのかなぁとも思います。

 

  • RHCEの認定が始まったのはいつ?
Red Hatの創業は1993年。なんと私と同学年くらい!!
RHCEの認定は今年で20周年らしいです。
当時から試験内容は選択式ではない実技試験で、確かな技術力を示すものだったそう。

なんと今回は2000年にRHCE試験に合格したレジェンドもいらっしゃてました!すごい!

 

  • RHEL8に対応したRHCEについて
世の中の流れもRed Hat自動化に注目しているということで、Ansibleが必須カリキュラムに!

RHCE取得後のAnsible関連の試験はこちら↓
RHEL8

Advanced Automation: Ansible Best Practices (DO447)
RHEL7

Automation with Ansible I(DO407)

 

ちなみに、資格の最高峰はRHCAレベル21という鬼のように強い資格になるそうです。
RHCE+5つの試験を受けるとRHCAレベル1になるので、
Red Hatが出しているほぼすべての試験に受かるようなものですね笑

 

これからクラウドやコンテナも意識した試験がどんどん広がるので
RHCEだけで満足しちゃだめだな…と本当に思いました。

 

セッション3:「エンジニアとして学び続けることの意義」

スピーカー:鈴木さん(Twitter:@tomoya_su)

 

  • 今日の目標

みなさんの学ぶ時間が1分以上増えること!

 

  • なぜ我々は学ぶのか?
自然界で生き残れるのは変化に適応できるものだけだ!
IT業界も同じだ!
そのために学ぶのだ!

学ぶ習慣。大事。

 

  • どうやって学びを続くようにするか?
ハードルは低く:1冊やる⇒1ページやる、土日に8時間⇒毎日5分、のようにできる範囲の省エネにする。
振り返りをする:復習する。学ぶ時間を見直してみる。アウトプットをして自分がやったことを振り返る。

厳密にやりすぎない:何度失敗してもよい。完璧にやろうとすると続かない。

 

  • 鈴木さんの学習法
ポモドーロテクニック:こまめな時間配分で勉強をする。

成果の用意:やりたい会社に転職できるなど。

 

全体的に身近でわかりやすいお話しでした。
私は最近資格勉強に疲れた?飽きた?感があるので、
手を動かす構築とアウトプットに注力してます。

 

 セッション4:「自分戦略 ー効果的な学習アプローチについて考えるー」

スピーカー:荒木さん(おしゃれなRed Hatポロシャツをお召しになっていました。

 

  • おすすめの学習方法
Web、セミナー、書籍

検証、勉強会、トレーニング…

それぞれのメリットデメリットも教えてくださいました。
先にセミナーは情報に偏りがあると書きましたが、
直接質問ができるというメリットがあるようです。

 

  • 目標設定が大切
実力からみた目標設定。その目標には必然性がついてくると。
習熟度の客観視として認定資格がありますが、
認定資格はペーパードライバーになる面もあるので気を付けましょう。

私は完全にこのタイプです。。。

 

  • DX時代を生き抜くために
ビジネスマンもエンジニアも時代に合わせて変わっていかないといけません。

「LeanとDevOpsの科学」という書籍がおすすめだそうです。

 

  • ワークショップについて
OpenShiftのワークショップがあるそうです。

まったくの初耳でした!これは嬉しい!

Red Hat OpenShift 4 Hands-on Workshop 基礎編 Basic-2

 

セッション5:「テックブログのすすめ」

スピーカー:森さん(Twitter:@mosuke5)

 

  • 学習するということについて
昨今のエンジニア業界では一人一人に求められる技術の範囲が拡大している!

→どうやって効率化して身につけていくか?

 

SECIモデル(せきもでる) - ITmedia エンタープライズ

要約すると、暗黙知形式知を繰り返すことで人も会社も強くなるということで
その方法のひとつとしてテックブログをおすすめされていました。
テックブログのメリット:知識の理解度も向上する。やったことを思い出しやすくなる。

 

  • テックブログを書くコツ
ネタはでもいい:既出のネタなら、自分の知りたいことを+αしてみる
頻度:マイペースで。ただし、すぐ書くのが良い。

楽しみを見つける:PV数の変遷だったり広告収入だったり。ブログ運用自体が楽しいこともある。

 

弊社でもテックブログを開設したいと思っているのですが、
企業として社外に向けてやるのはいろいろな面で大変だそうです…
まずは社内向けのテックブログあたりから始めてみようかと思います。

 

セッション6:「趣味だから継続できる学習」

スピーカー:杉村さん(Ansibleのサポートエンジニアの方。サポートの方のお話を聞ける機会は滅多にないそう!

 

  • これまでの取得資格について
本当に何十年も毎年のように何かしらの資格を取得されてました!
LPICOracleCisco等…

大抵のエンジニアがまずほしいと思う資格ばかりでした。

 

  • 勉強方法について
課題としては「忘れる」「思い出せそう」とどう戦うか。
→自然と出てくるまで繰り返し繰り返しやる!
実際に手を動かしているとよくわかりますが、身についてるコマンドは自然に出てきますよね。
インプット:反復、問題集とか

アウトプット:人に説明する。構築してみる。評価されるのはこれ。

 

  • 視野を広げる
近い関連のあるものばかりでなく、少し離れたものの勉強も意外なところでつながって助けになることも!
そういった意味で視野を広げることは大切です。
杉村さんはIT関係の資格だけじゃなく、

囲碁や将棋を極めたり、弁理士の勉強にも力を入れていたそう。

 

  • 続けるコツ
1日10分勉強!
少しずつでもコツコツ続けることが大事なんだそう。

継続は力ですね…!

 

セッション7:「新米Red Hatterの振り返り」

スピーカー:長嶺さん(前職ではサーバー構築やNW運用をされていたそうな

 

  • お仕事での失敗からの教訓
手順書をきちんと用意せずワンオペでミス!
→手順書を用意することで段取りの理解になる
 
要件にないことを要求され、切り捨てたらお客様の逆鱗に触れてしまった
→相手のことを考えられてない。
(でもこれは時と場合に寄りますよね…
 
単体の構築としては間違ってないが、お客様のやりたいことが実現できなかった…
→構築したものをお客様がどう使うのか目的がわかってなかった

私も目先のことでいっぱいになってしまって大本の目的を知らないまま進めてしまうことがよくあります…反省。

 

  • 資格は何のためにあるのか
資格試験といってもその目的は様々です。
会社の方針、インセンティブ、自分磨き(腕試し、初学のため)etc…

私は頭でっかちのタイプなので初学のために資格を取る派です。

 

  • 資格を取った後、そこで得たものをどう活かすか?
いつもの手順書を見直してみる!

いつもの慣れた作業でも知識が増えた状態で見るとちぐはぐな手順があったりするかも


自己の体験に基づく具体的なお話が多くて面白かったです。

 

JTPさんのお話

各種トレーニングについてのご紹介。
2019年下期にはRHEL7とRHEL8の差分を学ぶためのトレーニングもあるらしい!受けたい!
私もRHCSAとRHCEはJTPさんのところでお世話になりました。

 

懇親会

大変豪華な立食パーティでした!
1人参加だったのでお話できるかドキドキしていましたが、
皆様フランクにお話しくださって大変楽しい時間を過ごせました。
アワードがあると伺っていましたが、まったく関係ないだろうと思っていたところ
保有資格数が最も多い人ということでRed Hat印のリュックをいただきました!
予想もしていなかったのでびっくりしました。ありがとうございます。

f:id:mitsunooon:20190718004301j:plain

その他感想

・何人ものRed Hat社員さんのお話を伺いましたが、皆さんそれぞれ色々な経歴をお持ちでした。そしてポテンシャルが高い…!

私がひーひー苦労して取ったRHCEも、みなさん入社後2,3か月程で取得されていてさすがとしか言いようがありませんでした笑
・勉強に対する意欲が刺激されたので頑張ろうと思えました。
私一人だけじゃなくて社内の人を巻き込んで、勉強会なりテックブログなりやります!目標!
・通訳さんがかっこよかったです。
・本当にすごく有意義な会で、頑張ってRHCE取ってよかったなぁとしみじみ思いました。RHCEで満足してはいけないな、とも…

今年の12月にもイベントを予定されているそうなので絶対参加します!

 

おまけ(ノベルティについて)

ずっと憧れてたRed Hat印のグッズをたくさんいただきました!
リュック、帽子、水、スピーカー、升…
Red Hatファンとしてはむせび泣くほどうれしいです;;この夏はRed Hat帽子で出かけます笑

f:id:mitsunooon:20190718004241j:plain

 

世界一簡単なFAQチャットボットの作り方

はじめに

MicrosoftのCognitive Servicesというサービスが手軽にできるAIで面白そうということで軽く触ってみようと思います。

 

Cognitive Servicesとは

Microsoftが提供するAIの人工知能パーツ群です。
画像認識や自然言語処理、音声処理などのサービスが用意されています。
今回はその中で言語の分野の「QnA Maker」というサービスを使って
Teamsのチャットボットを作ります。

azure.microsoft.com

 

今回つくるもの

Azureのサポートについて回答してくれるTeamsのチャットボットを作成します。
もちろん日本語対応です。

 

参考サイト様

QnA ボット - Azure Bot Service - QnA Maker - Azure Cognitive Services | Microsoft Docs

「QnAMaker」とは?Microsoftの自動チャットボット会話生成サービスを試してみた | Ledge.ai

 

準備するもの

  • Azureアカウント
  • チャットボットにするFAQサイト

 

作り方

KBの作成

QnA Makerにアクセスします。
[GET STARTED]をクリックし、Azureのアカウントでログインします。

新規でナレッジベースを作るので[Create a knowledge base]をクリックします。

f:id:mitsunooon:20190707191913j:plain

 

STEP1

AzureポータルにQnA Makerのリソースを作ります。
[Create a QnA service]をクリックすると、Azureポータルに飛びます。

f:id:mitsunooon:20190707191416j:plain

  

必要事項を入力します。
価格レベルは今回は最安にします。

f:id:mitsunooon:20190707192047j:plain

f:id:mitsunooon:20190707192021j:plain

 

STEP2

作成ができたらQnA Makerの方に戻ります。
先ほど作った情報を選択します。

f:id:mitsunooon:20190707192150j:plain

 

STEP3

KBの名前を設定します。
QnA MakerサイトのマイページにKBの一覧が表示されますが、その時の表示名になります。

f:id:mitsunooon:20190707192250j:plain

 

 

STEP4

参考にするFAQサイトのURLを入力します。
今回はAzureのサポートに関するFAQのサイトにします。

Microsoft Azure サポートに関する FAQ

f:id:mitsunooon:20190707192421j:plain

 

補足

[Chit-chat]という欄ではチャットボットの性格が指定できますが、
最低限の会話テンプレート(挨拶等)が登録されるだけで
特に口調が変わるとかではないようです。

f:id:mitsunooon:20190707192518j:plain

 

STEP5

[Create your KB]をクリックします。
しばらく待つとKBが作成され、FAQサイトの質問と回答が登録されているのが確認できます。
もちろんここで質問と回答をカスタマイズすることもできます。

f:id:mitsunooon:20190707192617j:plain

 

f:id:mitsunooon:20190707192634j:plain

 

 

Botの作成

作成したKBをbotとして出力します。
[PUBLISH>Publish]をクリックします。

f:id:mitsunooon:20190707192745j:plain

 

[Create Bot]をクリックするとAzureポータルのWeb アプリ ボット作成のページに飛びます。

f:id:mitsunooon:20190707192830j:plain

 

必要項目を入力します。
ここでも価格レベルは最安にします。

f:id:mitsunooon:20190707192904j:plain

 

作成が完了したらテストします。

f:id:mitsunooon:20190707192936j:plain

 

Teamsに接続する

作成したbotをTeamsで使えるようにします。

Webアプリボットの[チャンネル]をクリックします。

f:id:mitsunooon:20190707193053j:plain

 

チャンネルの追加でTeamsを選択します。
[保存]をクリックします。
特に設定は不要です。

f:id:mitsunooon:20190707195551j:plain

 

チェックボックスにチェックを入れ、[Agree]をクリックします。

f:id:mitsunooon:20190707195616j:plain

 

保存が完了したら、
[チャンネルに接続]のページからTeamsに接続します。

f:id:mitsunooon:20190707195713j:plain

f:id:mitsunooon:20190707195752j:plain

 

Microsoft App IDをTeamsで検索して表示させることもできます。

f:id:mitsunooon:20190707195825j:plain

 

チャットボットができています!やったー

f:id:mitsunooon:20190707195734j:plain

 

おまけ

アイコンと表示名を設定してチャットボットらしくします。

Webアプリボットのページで[設定]をクリックします。

アイコンを設定します。pngの画像をアップロード。

表示名もボットらしくします。

f:id:mitsunooon:20190707195953j:plain

 

Teamsで確認します。

名前とアイコンが変わって、チャットボットらしくなりました。

f:id:mitsunooon:20190708173057j:plain



 

 

おわり

こんなに簡単にチャットボットが作れると思ってなかったのでびっくりしました。

仕事中に癒してくれるようなチャットボットとかも作りたいですね…

他のCognitive Servicesも触ってみたいと思います。