読者です 読者をやめる 読者になる 読者になる

pikesaku’s blog

個人的なプログラム勉強メモです。記載内容について一切の責任は持ちません。

VMwaer NSXのハンズオンラボメモ(HOL-1703-SDC-1- JA NSX Edge サービスゲートウェイ)

メモ

・外部NWとの境界につなげて各種機能を提供。
・外部NWのRouterとルーティング情報を交換する。
 仮想化内ネットワーク情報を外部NWのRouterに伝播され、外部NWからルーティング可能になる。
・論理スイッチのアップリンクになるのがメインユース(?)

VMwaer NSXのハンズオンラボメモ(HOL-1703-SDC-1- JA 論理ルーティング)

メモ

・論理ルーティングはEast-West通信を最適化する機能
・ヘアピン問題を解消。
 同一ホスト上の異なるNWに接続されたVMが通信をする際、ルーター(ESG)動作中のホスト経由の通信になる。(いってもどる=ヘアピン)
・この目的のためにNWを増やして複雑な構成にする。大規模だとマストかもしれないが、個人的に魅力感じず。検証は保留。

VMwaer NSXのハンズオンラボメモ(HOL-1703-SDC-1- JA 論理スイッチ)

メモ

 
・ホストサーバで論理スイッチ(以後LS)構成済みでも、分散仮想スイッチ(以後vDS)のポートグループに仮想マシン(以後VM)を接続しただけなら、NSXなし環境と同じ動き。
 vDSアップリンク経由で外部ホストと通信可能。
・LSに接続されたVMが外部ホストへ通信する時は、VTEPトンネルを経由し外部との境界に接続されたホストサーバ経由で外部ホストと通信する。
・LS作成の設定項目は以下の通り。
 
f:id:pikesaku:20170514201654p:plain
 
f:id:pikesaku:20170514202022p:plain
 
f:id:pikesaku:20170514202032p:plain
 
・LS毎にL2セグメントが分かれる(セグメントID=VNI)
レプリケーションモードは3つあり。
・"IP検出有効化"が有効な場合、ARP通信が最適化される。
 VMARP要求に対しホストサーバが既知の情報から応答
VMをLSに接続する設定項目は以下の通り
この時点でLS名が付与されたポートグループがvDS上に作成される。
 vSphere Client画面では確認できず。更新が遅い?Webクライアントで確認できる。
 
f:id:pikesaku:20170514204946p:plain
 
f:id:pikesaku:20170514205015p:plain
 
f:id:pikesaku:20170514205059p:plain
 
f:id:pikesaku:20170514205118p:plain
 
・この時点でweb1,2間の通信可能。動作しているホストサーバが異なる為、通信はVTEPトンネル経由で行われる。
・作成したLSにはアップリンクがない為、外部ホストとは通信できない。
VMが接続されるポートグループは、自動的に変更される。
アップリンク接続の設定項目は以下の通り。
 
f:id:pikesaku:20170514223128p:plain
 
f:id:pikesaku:20170514223215p:plain
 
f:id:pikesaku:20170514223728p:plain
 
f:id:pikesaku:20170514224011p:plain
 
f:id:pikesaku:20170514224023p:plain
 
・論理スイッチのアップリンクを既作成済みのEdge Service Gateway(以後ESG)に接続。
 ※Perimeter-Gateway-01
・この時点でweb1,2に以下変更をすれば外部NWと接続可能。
 IPアドレスを172.16.155.0/24
 DGWを172.16.155.1
・NATはされない。
・ESGは外部NWのRouterとルーティング情報を交換している。
・今回新たに作成したESGダウンリンクNW(172.16.155.0/24)も外部NWのRouterに経路情報が伝播され通信が可能になる。
・既存のESGの接続は以下の通り。
 
f:id:pikesaku:20170514225132p:plain
 
・”Uplink-RegionA01-vDS-MGMT”は分散仮想スイッチのアップリンクポートグループ

VMwaer NSXのハンズオンラボメモ(HOL-1703-SDC-1- JA NSX Manager インストールと設定)

メモ

事前に分散仮想スイッチ環境が必要
NSXマネージャー、コントローラは管理NWに接続
NSXコントローラは3台以上の奇数構成が推奨(冗長化の仕組み的に)
論理スイッチを作成する=VXLANを利用
論理スイッチは従来の仮想スイッチとは別物
論理スイッチ利用する為の設定画面は以下画像の通り
※マネージャ、コントローラセットアップ後の手順
 
f:id:pikesaku:20170514173946p:plain
 
f:id:pikesaku:20170514174022p:plain
 
f:id:pikesaku:20170514174038p:plain
 
f:id:pikesaku:20170514174049p:plain
 
f:id:pikesaku:20170514174056p:plain
 
f:id:pikesaku:20170514174103p:plain
 
f:id:pikesaku:20170514174109p:plain
 
f:id:pikesaku:20170514174116p:plain
 
f:id:pikesaku:20170514174135p:plain
 
f:id:pikesaku:20170514174250p:plain
 
f:id:pikesaku:20170514174332p:plain
 
f:id:pikesaku:20170514174358p:plain
 
f:id:pikesaku:20170514174458p:plain
 
f:id:pikesaku:20170514174518p:plain
 
f:id:pikesaku:20170514174754p:plain
 
f:id:pikesaku:20170514175034p:plain
 
 

考察

 
・VTEP NWではVXLANヘッダ分パケットのサイズが大きくなるのでMTUは1600Byteに設定
・VTEP用IPを設定するVMkernelポートグループは自動的に作成された。(ウィザードでは分散仮想スイッチを指定)
・セグメントID=VNI(vxlanのID識別子)
・トランスポートゾーン=VXLAN通信範囲
 

Amazon Lexをやってみた

Amazon Lexとは?

 
Amazon Deep Learning技術による自然言語解析、音声認識機能
 音声認識サービスであるAlexaのベース技術
 
Webサービスとして利用可能
 開発者は実装が大変な自然言語解析、音声認識部分はLexに任せればOK
 会話の目的を実現するビジネスロジックを実装すれば、会話を入出力にするアプリを作れる。
 
 

機能概要

 
・目的のある会話から目的を実現する機能
 
 以下が基本動作
 ①会話から発言者の目的を認識
 ②目的実現に必要な情報が不足してる場合は、発言者から聞き出す。
 ③収集した情報を元に目的を実現
 
 目的のない会話ができるMicrosoftりんなのような機能ではない。
 基本的には人工無脳的なもの。会話認識にAI技術を活用。
 
AWS Lambdaサービスとの連携
 
 会話で得た情報を利用し事前作成済みプログラム(Lambda関数)を実行できる。
 連携機能がビルトインされており容易に実装可能
 
 ①他システム連携によりダイナミックな会話が可能。
 ②目的実現まで自動化が可能
 
・メッセージングアプリFaceBook Messenger、Slack、Twilioとの連携
 
 ChatBotとしての利用可能。
 Botに実現したい目的を伝えれば、必要な情報をヒヤリングし目的を実現してくれる。
 連携機能がビルトインされており容易に実装可能
 

メッセージングアプリと連携したChatBot技術の重要性について

 
 ChatBot技術は情報発信、マーケティング手段として注目されてる。
  
 ASCII.jp:AIをビジネスの味方にする「Microsoft Bot Framework」とは
  
 【理由】
 スマホアプリはあまり利用されてない。
 LINEなどのメッセージングアプリの利用者は伸びてる。
 →ChatBotはメッセージングアプリ経由で情報発信・マーケティングが可能な為、注目されている。
 
 

実現可能な会話の例

 
 例1)
 質問者: 明日の天気は?
 回答者: 何県何市の天気ですか?
 →「天気を知る」を目的と認識し、実現に必要な情報を聞き出す。
 
 質問者: 〜県〜市です。
 回答者: 雨です。
 →回答前に、天気予報サービスから情報を得て回答
 
 例2)
 ※歯科医院の予約の会話
 患者: ホワイトニングの予約をしたい
 受付: 何日が希望ですか?
 
 患者: 明日
 受付: 明日はNGです。明後日の10時からはいかがでしょうか?30分かかります。
 →予約管理システムと連携して、予約可能な時間を提案
 
 患者: OKです。
 受付: では明後日10時から30分で予約しますが、よろしいでしょうか?
 →確認
 
 患者: OKです。
 受付: 予約しました。
 →予約管理システムに登録し目的実現
 
 

類似技術

 
MicroSoft Bot Framework(LUIS)
IBM Watson
Google Assistant
Apple Siri
FaceBook Wit.ai
  
 などなど。違いはよく調べきれてません。考察としては、、、、
 
 Lexは2017/5/3時点で日本語未対応
 上記技術は基本的にAPI公開されており、プロバイダが異なってもサービス間連携は可能。
 例) FaceBook Bot機能が、Amazon Lambda機能と連携する等
 →LexのLambda連携はAmazon独自の強みでない。連携がビルトインの為、実装が容易である点は強み。
 
 AWS、Alexaを強化するボットフレームワーク「Amazon Lex」をローンチ - THE BRIDGE(ザ・ブリッジ)
 →Amazonが今後、最大のクラウドプロバイダである点を生かしシステム間連携(コネクタ)で差別化を測るかも。
 
 

利用料金

 
 料金 - Amazon Lex | AWS
 利用料金説明。最初の一年間は無料利用枠あり。
 
 

前置きが長くなったが、まずはやってみる!

 

メモ

 
 ビルトインで以下のサンプル設定があり、これを使うと簡易動作検証は容易
 ・BookTrip 旅行予約の会話
 ・OrderFlowers 花購入の会話
 ・ScheduleAppointment 歯医者治療予約の会話
 実用するにはlambda連携は必須。
 AWSコンソールにチャットインターフェースがあり、動作試験が可能。
 しかしAWSコンソールは未対応機能あり(レスポンスカード等)。
 未対応機能はFaceBook Messenger等で動作確認する必要あり。
 
 

歯医者治療予約Botの作成・動作確認(lambda連携なし)

 

Bot作成

f:id:pikesaku:20170504171045p:plain
 

Bot設定

f:id:pikesaku:20170504175140p:plain
 

Bot動作確認(AWSコンソール)

f:id:pikesaku:20170504180204p:plain
 
・会話例
 右矢印: ユーザー発言
 左矢印: Bot発言
 
例1)

> I would like to book an appointment
< What type of appointment would you like to schedule?
> Cleaning
< When should I schedule your Cleaning?
> Tommorow
< At what time on 2017-05-05?
> 11:00 a.m
< 11:00 is available, should I go ahead and book your appointment?
> Yes
< ReadyForFulfillment AppointmentType:Cleaning Time:11:00 Date:2017-05-05

 
例2)

> Book a Cleaning
< When should I schedule your Cleaning?
> Tommorow
< At what time on 2017-05-05?
> 11:00 a.m
< 11:00 is available, should I go ahead and book your appointment?
> Yes
< ReadyForFulfillment AppointmentType:Cleaning Time:11:00 Date:2017-05-05

 
例3)

> Book an appointment
< What type of appointment would you like to schedule?
> HogeHoge
< When should I schedule your HogeHoge?
> After 1 day
< When should I schedule your HogeHoge?
> 1 day later
< At what time do you want to schedule the HogeHoge?
> am 11:00
< At what time on 2017-05-05?
> 11:00 a.m
< 11:00 is available, should I go ahead and book your appointment?
> Yes
< ReadyForFulfillment AppointmentType:HogeHoge Time:11:00 Date:2017-05-05

 
例4)

> Hello
< I didn't understand you, what would you like me to do?
> appointment
< I didn't understand you, what would you like me to do?
> an appointment
< What type of appointment would you like to schedule?

 
例5)

I am appointment
I didn't understand you, what would you like me to do?
I am an appointment
What type of appointment would you like to schedule?

 
例6)

> Hello
< I didn't understand you, what would you like me to do?
> I want you to understand me
< I didn't understand you, what would you like me to do?
> I am sad
< Sorry, I'm not able to assist at this time

 
わかったこと
・デフォルトは一般会話に完全未対応
・目的認識までの会話でAIが活用されてるかは微妙?完全無脳な感じ。 
・lambda連携無効な為、実用的ではなし。
 
 

歯医者治療予約Botの作成・動作確認(lambra・Slack連携あり)

 参考URL
 Using Lambda Functions - Amazon Lex
 Example Bot: ScheduleAppointment - Amazon Lex
 

Bot作成

f:id:pikesaku:20170504201513p:plain
 

lambda設定

以下URLから設定
https://console.aws.amazon.com/lambda/
 
f:id:pikesaku:20170504202509p:plain
 
f:id:pikesaku:20170504202909p:plain
 
f:id:pikesaku:20170504203330p:plain
 
f:id:pikesaku:20170504203611p:plain
 
f:id:pikesaku:20170504203835p:plain
 
f:id:pikesaku:20170504204434p:plain
 

lambda連携用Bot設定

 
f:id:pikesaku:20170504211236p:plain
f:id:pikesaku:20170504211243p:plain
 
f:id:pikesaku:20170504224317p:plain 
 

Bot動作確認(AWSコンソール)

f:id:pikesaku:20170504212117p:plain
 

Slack設定

以下URLに従い設定
Integrating an Amazon Lex Bot with Slack - Amazon Lex
 
Step1,2は画面省略する。Step3以降の画面は以下の通り。
 
Slack App作成
f:id:pikesaku:20170504215436p:plain
 
Slack Botユーザー設定
f:id:pikesaku:20170504221944p:plain
 
f:id:pikesaku:20170504222218p:plain
 
f:id:pikesaku:20170504222726p:plain
 
f:id:pikesaku:20170504221642p:plain
 
f:id:pikesaku:20170504224744p:plain
 

Slack連携用Bot設定

以下URLに従い設定
Step 4: Integrate the Slack Application with the Amazon Lex Bot - Amazon Lex
 
f:id:pikesaku:20170504225908p:plain
 
f:id:pikesaku:20170504230100p:plain
 

Slack設定

以下URLに従い設定
Step 5: Complete Slack Integration - Amazon Lex
 
f:id:pikesaku:20170504231109p:plain
 
f:id:pikesaku:20170504232007p:plain
 
f:id:pikesaku:20170504232837p:plain
 
f:id:pikesaku:20170504233957p:plain
 
f:id:pikesaku:20170504235206p:plain
 
f:id:pikesaku:20170504235506p:plain
 

動作確認(Slack)

f:id:pikesaku:20170505002158p:plain
 
レスポンスカードがうまく動かない。。。。。。
f:id:pikesaku:20170505002712p:plain
 
もう疲れたので、手入力で会話動作の確認をする。
 
・会話例
 右矢印: ユーザー発言
 左矢印: Bot発言
 
例1)

> Book an appoint
< What type of appointment would you like to schedule?
> hogehoge
< I did not recognize that, can I book you a root canal, cleaning, or whitening?
> cleaning
< When would you like to schedule your cleaning?
< 5-5 (Fri)  
< 5-8 (Mon)
< 5-9 (Tue)
< 5-10 (Wed)
< 5-11 (Thu)
> 5-7
< Our office is not open on the weekends, can you provide a work day?
< 5-5 (Fri)  
< 5-8 (Mon)
< 5-9 (Tue)
< 5-10 (Wed)
< 5-11 (Thu)
> 5/8
< What time on 2017-05-08 works for you? We have availabilities at 11:30 a.m., 1:00 p.m. and 4:30 p.m.
< What time works best for you?
< 11:30 a.m.
< 1:00 p.m.
< 4:30 p.m.
> 12:00 a.m
< Our business hours are ten a.m. to five p.m.  What time works best for you?
< What time works best for you?
< 11:30 a.m.
< 1:00 p.m.
< 4:30 p.m.
> 1:00 p.m
< 1:00 p.m. is available, should I go ahead and book your cleaning?
> No
< Okay, I will not schedule an appointment.

 
lambda関数が入力チェックしており、動作が柔軟になっている。
 
 

最後に

 
lanbda連携動作の仕組みの把握が必要。
今度、以下URLの内容把握に取り組む。
Details of Information Flow - Amazon Lex
サンプル用lambda関数プログラムの中身も確認する。
目的を2つ以上組み合わせると、実用的になりそう。
SlackBotとの会話から簡易なAWSインフラの管理作業(インスタンスデプロイや各種情報取得等)を実行できそう。
API・Web操作を知らなくても、Botに目的伝えれば目的実現をアシストしてくれるのはいいかも。
 

Pythonの関数デコレータについて

関数デコレータとは?

関数に機能を追加する機能

ポイント

Pythonの以下性質を利用
・関数もオブジェクト
・関数自体を引数や戻り値として利用可能

利用イメージは以下の通り
・関数Aに引数として、関数Bを指定
・戻り値として、関数Bの機能に関数Aの機能を追加した関数を返す

コードのイメージ
関数base_funcに機能を追加する場合、以下の記述が可能

base_func = add_func(base_func)


このシンタックスシュガーが関数デコレータ。以下記述が可能。

@add_func
def base_func():
    処理


サンプルコード

関数デコレータなしで記述した場合


コード

def add_func(f):
    def func():
        f()
        print("add func called")
    return func


def base_func():
    print("base func called")


print("# 機能追加前")
base_func()

print("# 機能追加後")
base_func = add_func(base_func)
base_func()


実行結果

# 機能追加前
base func called
# 機能追加後
base func called
add func called


関数デコレータで記述した場合


コード

## デコレータありの場合

def add_func(f):
    def func():
        f()
        print("add func called")
    return func


@add_func
def base_func():
    print("base func called")


base_func()


実行結果

base func called
add func called


サンプルコードの問題点


オブジェクトの属性情報(関数名等)が変わってしまう。

さっきのコードの最後の行に以下を追加すると、、、

print(base_func.__name__)


実行結果は以下になる。

base func called
add func called
func


関数名が、add_func内側で定義した関数名になっている。
これを回避するには、func関数をfunctoolsモジュールのwraps関数でデコレートする。

コード

from functools import wraps


def add_func(f):
    @wraps(f)
    def func():
        f()
        print("add func called")
    return func


@add_func
def base_func():
    print("base func called")


base_func()
print(base_func.__name__)


実行結果

base func called
add func called
base_func


引数付き関数のデコレータ


コード

rom functools import wraps

def add_func(f):
    @wraps(f)
    def func(a):
        f(a)
        print("add func called")
    return func


@add_func
def base_func(a):
    print("base func called " + a)


base_func("hoge")
print(base_func.__name__)


実行結果

base func called hoge
add func called
base_func


おぼえておくべき点


・base_funcを実行すると、add_funcの第一引数(f)としてbase_funcが渡される。
・base_func実行時の引数は、add_func内で定義した関数(func)の引数(a)にセットされる。

デコレータ記述(@add_func)に引数をつける事も可能


add_func関数内でネストする必要あり。コードは以下の通り。

コード

from functools import wraps


def add_func(b):
    def func1(f):
        @wraps(f)
        def func2(a):
            print(b)
            f(a)
            print("add func called")
        return func2
    return func1


@add_func("moge")
def base_func(a):
    print("base func called " + a)


base_func("hoge")
print(base_func.__name__)


実行結果

moge
base func called hoge
add func called
base_func


最後に


・参考URLに記載の通りビジネスロジックと管理ロジックを分けるために有用
・ただ、自分はインフラSEだし、そんな本格的なコードは書いてません。。。。。関数に渡されたオブジェクトをデバッグとしてログに出したい時などに使えるかも

サンプルコード

def deco(f):
    def func(*args):
        print("#DEBUG " + f.__name__ + " args")
        print(args)
        f(*args)
    return func

@deco
def test1(a, b):
    print("HOGE!!")

@deco
def test2(b):
    print("MOGE!!")


def main():
    test1(1,2)
    test2(3)

main()


実行結果

#DEBUG test1 args
(1, 2)
HOGE!!
#DEBUG test2 args
(3,)
MOGE!!


最後に2


参考URLの以下記述について

以下はよくない

def web_lookup(url, saved={}):
    if url in saved:
        return saved[url]
    page = urllib.urlopen(url).read()
    saved[url] = page
    return page


以下がよい

def cache(func):
    saved = {}
    @wraps(func)
    def newfunc(*args):
        if args in saved:
            return saved[args]
        result = func(*args)
        saved[args] = result
        return result
    return newfunc

@cache
def web_lookup(url):
    return urllib.urlopen(url).read()


と記述があったが、"return urllib.urlopen(url).read()"が理解できなかった。このコードは実行されないのでは?と思った。理由は、newfuncでreturnを定義している為。ただ、よくよく考えるとresult = func(*args)で実行される。すっきり!