kun432's blog

Alexaなどスマートスピーカーの話題中心に、Voiceflowの日本語情報を発信してます。たまにAWSやkubernetesなど。

〜スマートスピーカーやVoiceflowの記事は右メニューのカテゴリからどうぞ。〜

(Organizations環境で)Transit Gatewayを使ったアカウント跨ぎのVPC間通信をTerraformで作る

f:id:kun432:20210228193004p:plain

マルチアカウント間の通信にTransit Gatewayを使う場合、以下の記事にあるようにResouce Access Managerを使ってリソース共有を行う必要があります。

Organizations環境でTerraformを使ってやってみたのでメモ。なお、Organizationsの設定でAWS Resource Access Managerは有効になっている前提です。

f:id:kun432:20210228231928p:plain

目次

構成とコード

f:id:kun432:20210228224738p:plain

READMEに従えばできるはず。TF_VARS_*使えばvariables.tf修正する必要もないですね。

少し補足。

  • 実際には使いませんが、パブリックサブネットやInternet Gatewayも作ってます(他に色々試す場合にどうせ必要になるので)
  • EC2インスタンスは手動で適当に立てればいいです。
    • EC2インスタンスへのログインはSession Manager使えばいいと思います。VPCエンドポイントはTerraformで作成してます。
    • ただし、Session Manager使うためのIAMロールは作ってません。Systems Manager Quick Setupで作成されるAmazonSSMRoleForInstancesQuickSetup使えばいいかと思います。もちろん作ってもよし。
  • プライベートサブネットが各リージョンごとに複数あるのは、Transit Gatewayにアタッチされているサブネット以外からもアクセスできるということの確認のためです。

解説

Transit Gatewayの作成はモジュール化してます。OwnerとUserをうまく共通化する方法が思いつかなかったので、別モジュールになってます。

Owner側

variable "vpc_id" {}
variable "private_subnet_ids" {}
variable "private_rtb_id" {}
variable "user_account" {}
variable "user_cidr" {}

resource "aws_ec2_transit_gateway" "tgw" {
  dns_support                     = "enable"
  vpn_ecmp_support                = "disable"
  default_route_table_association = "enable"
  default_route_table_propagation = "enable"
  auto_accept_shared_attachments  = "enable"
}

resource "aws_ec2_transit_gateway_vpc_attachment" "tgw-attachment" {
  transit_gateway_id = aws_ec2_transit_gateway.tgw.id
  vpc_id             = var.vpc_id
  subnet_ids         = var.private_subnet_ids
  dns_support        = "enable"
}

resource "aws_ram_resource_share" "tgw" {
  name = "tgw"
  allow_external_principals = true
  tags = {
    Name = "tgw"
  }
}

resource "aws_ram_resource_association" "tgw" {
  resource_arn       = aws_ec2_transit_gateway.tgw.arn
  resource_share_arn = aws_ram_resource_share.tgw.arn
}

resource "aws_ram_principal_association" "tgw" {
  principal          = var.user_account
  resource_share_arn = aws_ram_resource_share.tgw.arn
}

resource "aws_route" "route_tgw" {
  route_table_id         = var.private_rtb_id
  destination_cidr_block = var.user_cidr
  transit_gateway_id     = aws_ec2_transit_gateway.tgw.id
}

Owner側では、

  • Transit Gatewayを作成
  • Resouce SharingでUserアカウントに共有

します。アカウント間のリソース共有は共有元・共有先の両方で設定しないといけないので、書き方いまいちピンとこないうちは試行錯誤してましたが、つながってみればほぼマニュアル通りな感じでした。

User側

variable "vpc_id" {}
variable "private_subnet_ids" {}
variable "private_rtb_id" {}
variable "owner_account" {}
variable "owner_cidr" {}

data "aws_ec2_transit_gateway" "tgw" {
  filter {
    name   = "owner-id"
    values = [var.owner_account]
  }
}

resource "aws_ec2_transit_gateway_vpc_attachment" "example" {
  vpc_id             = var.vpc_id
  subnet_ids         = var.private_subnet_ids
  transit_gateway_id = data.aws_ec2_transit_gateway.tgw.id
  dns_support        = "enable"
}

resource "aws_route" "route_tgw" {
  route_table_id         = var.private_rtb_id
  destination_cidr_block = var.owner_cidr
  transit_gateway_id     = data.aws_ec2_transit_gateway.tgw.id
}

User側では、Ownerが作成したTransit Gatewayを使うだけなので、dataリソースで読んでいます。Organizations環境でAWS Resource Access Managerが有効になっているので、とてもかんたんですね。

OrganizationsでAWS Resource Access Managerが無効になっている場合や、別組織のアカウントとのリソース共有では、ram_resource_share_accepterを使う必要があるようです(が試してないのでわからない)。詳しくはドキュメント見てください。

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ram_principal_association

https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ram_resource_share_accepter

まとめ

Transit Gatewayとかリソース共有殆ど触ったことなかったので、一通りできてよかったし、モジュールの作り方もやっとわかった。これでいつでも作って壊せる環境ができたのでいろいろ試してみたいと思います。

Voiceflow新機能発表イベント 『#VFV2』まとめ⑤ No Code Capabilities to All & Wrap-up

f:id:kun432:20210223110448p:plain

Voiceflowの新機能発表イベント「VFV2」のまとめ、その5です。 最後はNo Code Capabilities to AllとWrap-upです。新機能(現時点でリリースされているものもあれば今後リリースされるものも含みます)についてはNew!をつけています。

No Code Capabilities to All

  • Voiceflowで利用可能になった素晴らしい新機能を使用する新しい方法を紹介する。

f:id:kun432:20210227165535p:plain

  • Voiceflow Desktop App Beta New!
    • ワークフローを最適化し、より速く作業が可能
    • プロフェッショナルなデスクトップツール

f:id:kun432:20210227165838p:plain

  • ライブアップデート
    • 最新のアップデートを通知

f:id:kun432:20210227165938p:plain

  • カスタムプラグイン
    • .vfファイルを活用可能

f:id:kun432:20210227170043p:plain

f:id:kun432:20210227170120p:plain

  • メニュー
    • メニューからプロジェクトに関連するツールやリンクにアクセスすることが可能。

f:id:kun432:20210227170136p:plain

f:id:kun432:20210227170150p:plain

  • コンバータ、開発者コンソール、移行ツールなど。

f:id:kun432:20210227170211p:plain

  • プラグインエコシステム
    • .vfファイルを使用して、Voiceflow の上にサードパーティのプラグインを使えるエコシステムを構築した

f:id:kun432:20210227170223p:plain

  • 現時点では公式プラグインのみだが、将来的には誰でもプラグインを作成・公開できるよう計画中

f:id:kun432:20210227170238p:plain

  • 公式プラグイン
    • デスクトップアプリには、2つのプラグインが含まれている
      • プロジェクト変換ツール
      • ダイアログのエクスポート

f:id:kun432:20210227170317p:plain

f:id:kun432:20210227170329p:plain

  • プロフェッショナルなVoiceflowデスクトップアプリとプラグインエコシステムはまだ始まったばかり
  • みなさんがデスクトップアプリを使って何をするのかが楽しみ

f:id:kun432:20210227170347p:plain

  • ベータ版
    • Mac/Windows/Linuxで利用可能
    • ダウンロードリンクはVoiceflow内で通知する

f:id:kun432:20210227170411p:plain

Conclusion

  • 私たちのチームは、未来の会話を作れるようにするために、可能な限りコミュニティと話をする。
    • ユーザの障害となっているものをなにか?
    • ユーザが何に興奮するのか?
    • ユーザが求めている機能はなにか?
  • デザインやテスト体験はまだまだ改善すべきことがたくさんあるのを知っている。みんなの意見を反映したVoiceflow V2を公開できたことをとてもうれしく思っている。
  • 新しいインタフェースでできることの限界を押し広げてくれるのは、みなさんのようなクリエイターのおかげ。
  • よりよい会話体験をみなさんと一緒に作っていくことは、とてもエキサイティングだ。

f:id:kun432:20210227171646p:plain

  • 私達は、以下を通じて、ユーザを継続してサポートし、ユーザの会話に命を吹き込むことを約束する。
    • デザイン機能の強化
    • よりスマートなプロトタイピング
    • さらなる柔軟性の向上
      • コード開発
      • インテグレーション
      • チャネルの拡大

f:id:kun432:20210227191903p:plain

f:id:kun432:20210227191851p:plain

f:id:kun432:20210227191828p:plain

  • SDKドキュメントやテンプレート、本日発表された機能は今後利用可能になる予定

f:id:kun432:20210227191811p:plain

f:id:kun432:20210227191756p:plain

  • Voiceflow V2に参加してくれてありがとう。
  • ユーザからのサポートやメッセージのレベルの高さに圧倒されている。すべてのことに改めて感謝している。
  • ユーザが作るものを待ちきれない!

f:id:kun432:20210227191743p:plain

まとめ

ということで、#VFV2のイベントまとめ、最後の No Code Capabilities to All & Wrap-upでした。

Voiceflow Desktop App Beta、ちょっと使ってみましたが、ブラウザ版に比べてとても高速で使いやすいです。アプリのプラグインが増えてきたらもっと使いやすくなりそうですね!

Voiceflow Desktop App Betaは以下よりダウンロード可能ですのでぜひお試しください。

https://share.voiceflow.com/desktopapp

いろんな音声アプリのチャネルに対応し、デザインも開発もやりやすくなっていくVoiceflowの今後が楽しみです。まだ公式にリリースされていないものも多いので、リリースされ次第、いろいろご紹介できればと思います。

また、今回のイベントのまとめは公式ブログにもありますので、あわせてご覧ください。

Voiceflow新機能発表イベント 『#VFV2』まとめ④ Designer/Developer Hand-off

f:id:kun432:20210223110448p:plain

Voiceflowの新機能発表イベント「VFV2」のまとめ、その4です。 今回はDesigner/Developer Hand-offについて。新機能(現時点でリリースされているものもあれば今後リリースされるものも含みます)についてはNew!をつけています。

Designer/Developer Hand-off

  • プロトタイピングとデザインは多くの人にとってデザインと検証に最適だが、プロセスはそれだけでは終わらない。
  • Voiceflowは、最高のデザインツールとしてだけでなく、デザインから開発にプロジェクトを最もかんたんに受け渡せるようにしたい。

f:id:kun432:20210226223237p:plain

  • エンジニアチームは、Voiceflowが、すべてのチャンネルやユースケースで、信頼性と拡張性に最も優れたクリエイティブなツールとなるように取り組んできた。
  • その結果、すべての会話コンポーネントをオープンソース化するという大規模なシフトを行った。
  • これにより、企業やクリエイターがVoiceflow上で構築できるものの制限がなくなり、高いカスタマイズ性を提供できるようになった。
  • Voiceflowのプロジェクトで新たに可能になったことを少しだけ紹介する。

f:id:kun432:20210226223528p:plain

  • Voiceflowダイアログエンジン New!
    • Voiceflowで作成したフローは、シンプルなデザインで複雑な会話を表現していて美しい。
    • が、ブロックやフローそれ自体が本質的に何かをするわけではない。
    • 会話に命を吹き込むのがダイアログエンジン。
    • 既存のプロジェクト(Alexa スキル、Google アクション、プロトタイプ)もすべてこのエンジンを使っている。
  • このエンジンにより、どんなインターフェースでもVoiceflowプロジェクトを実行することが可能

f:id:kun432:20210226225029p:plain

  • 最終的な目標
    • Voiceflowの素晴らしいキャンバスシステム上でプロジェクトを設計・作成
    • ダイアログエンジンにより、プロダクション実行環境をユーザ自身で制御

f:id:kun432:20210226225220p:plain

  • この1年間で、ダイアログエンジンをゼロから再構築し、あらゆるチャンネルに適応できるようにした。

f:id:kun432:20210226225449p:plain

  • 高度にモジュール化されている
    • 自然言語処理(NLP)、ダイアログ管理、音声合成(TTS)などの会話コンポーネントを複数組み合わせることができる
    • 例えば、Rasaチャットボットを構築したり
    • Amazon Lex NLPをGoogle Wavenet TTSと組み合わせたり、といったことが可能

f:id:kun432:20210226225838p:plain

f:id:kun432:20210226225916p:plain

f:id:kun432:20210226225924p:plain

  • 今まで通りVoiceflowのホスティングを使う場合もダイアログエンジンのメリットがある
    • ダイアログエンジンはテストツールで使用しておりパワフル
    • Google アシスタントやAlexa向けには、ダイアログエンジンを使うことで、プラットフォームネイティブな機能を利用することができるようになる
      • カスタムアナリティクスをフックしたり
      • アシスタントの動作を細かく制御したり
      • これまでできなかった細かいカスタマイズが可能となる

f:id:kun432:20210226230915p:plain

f:id:kun432:20210226230926p:plain

  • Voiceflowは、デザインから開発への受け渡しの苦難を解決したいと考えている。
  • ダイアログエンジンを使って構築する場合は、プロトタイピングと開発に最高のチーム体験を提供し、可能な限りスムーズな受け渡しができるようにしたい

f:id:kun432:20210226230859p:plain

  • 同時に、開発者は使用するフレームワークに柔軟性と拡張性を求めており、開発者の生産性向上も重要
  • 素晴らしい会話体験を作る各フェーズが最終的な製品に付加価値を与えると考えているため、同じことの繰り返しに費やす時間を避けたい

f:id:kun432:20210226231042p:plain

  • Voiceflow SDK New!
    • デザイナーが作成したデザインを再利用可能
    • デザインをすぐにデプロイ、かつカスタマイズも可能となる
    • プロトタイピングと開発で重複した作業を排除

f:id:kun432:20210226232838p:plain

  • ダイアログエンジンとSDKエコシステムのコア機能
    • 設定不要ですぐに使えるサービス
    • ユーザはウェブからアクセス可能
  • SDKエコシステム
    • 任意のプログラミング言語で利用可能なライブラリとして提供
    • オープンソースとして提供、利用だけでなくコントリビュートも可能

f:id:kun432:20210226233442p:plain

  • ライブアップデート
    • 一度デプロイすれば、ダイアログエンジンがデザイナーの継続的な更新に追従
    • 更新のたびに開発者が修正を行う必要はない
    • ユーザからもすぐに利用可能

f:id:kun432:20210226233427p:plain

  • ステート管理
    • 開発者が会話体験を構築する際の最大の問題点
      • プロジェクト規模が大きくなるにしたがって、コードもさらに複雑化
      • 市場の多くのアプリはリニアかつ不自然なパスに依存してしまっている
      • 逆に会話は進化、より複雑でカスタマイズ可能な体験に対するニーズが高い
    • Voiceflow V2のステート管理
      • 完全に新しい方法
      • プロジェクトのフローは、エンジンによって自動的に翻訳、複雑な遷移をサポート

f:id:kun432:20210226232806p:plain

  • 多言語対応
    • 19言語をサポート、さらに追加予定

f:id:kun432:20210227002811p:plain

  • 自然言語処理(NLP)とダイアログ管理機能
    • ほとんどの会話アプリに共通の要件である、自然言語処理とダイアログ管理機能を搭載
      • これにより、ダイアログエンジンを必要最小限の設定ですぐに使える
      • ユーザーの発話に合わせたスマートで柔軟に会話体験を提供可能

f:id:kun432:20210227003722p:plain

f:id:kun432:20210227003951p:plain

  • テキスト音声合成機能(TTS)
    • Amazon Polly、Google WaveNet、Azureといった最も人気のある音声から選択可能

f:id:kun432:20210227004015p:plain

f:id:kun432:20210227004056p:plain

  • 自動音声認識(ASR)
    • Voiceflow上でホストされているかどうかに関係なく、音声の発話・聞き取りの両方の応答をSDKがサポート

f:id:kun432:20210227004226p:plain

f:id:kun432:20210227004236p:plain

  • 独自のサービスやブロックを追加可能
    • Voiceflowのドラッグ&ドロップなインターフェースは迅速な反復作業に最適だが、開発者はそれ以上のものを必要としている
    • 簡単で拡張可能でオープンソースのシステム

f:id:kun432:20210227005052p:plain

  • プライバシー保護
    • Voiceflow上でダイアログエンジンをホストする場合にはユーザーセッションを保存しない。
    • プロジェクトはオープンソースで公開しているのでぜひチェックしてみてほしい。

f:id:kun432:20210227005533p:plain

f:id:kun432:20210227005821p:plain

  • エクスポート可能
    • アプリの開発と実行をユーザ自身が用意したインフラストラクチャ上で行うことが可能
    • HIPAA、GDPR、CCPA、などのコンプライアンス規格に対応可能
    • 独自のNLP、ASR、TTSコンポーネントで拡張することが可能

f:id:kun432:20210227010021p:plain

f:id:kun432:20210227010033p:plain

  • SDKを使ってみる
    • 銀行のためのシンプルなウェブサイトを例に紹介
    • チャットウインドウが用意されている
    • ただしまだチャットエンジンの実装はされていない。

f:id:kun432:20210227010852p:plain

f:id:kun432:20210227010950p:plain

  • サンプルはシンプルなHTML/CSS/JSで構成
    • HTMLでダイアログエンジンSDKをインポート

f:id:kun432:20210227011058p:plain

  • Chatクラスを使ってユーザーからの入力に対する応答を得るためののロジックはコントローラ内に存在

f:id:kun432:20210227011753p:plain

  • Chatクラスは、2つのメソッドとアトリビュート
    • startInteractionメソッド
      • チャットウィンドウが最初に開かれた時に使用される
    • interactionメソッド
      • ユーザーが入力を送信するたびに使用される
    • stateアトリビュート
      • 会話の終了を教えてくれる
  • 例では、startInteractionとinteractionにそれぞれプレースホルダが設定されていてそれを返すだけで何も実装されていない
    • "Welcome, how can I help you?"
    • "Sorry, I have not been implemented yet."

f:id:kun432:20210227013325p:plain

  • インポートしたダイアログエンジンSDKを利用して実装していく

f:id:kun432:20210227012745p:plain

  • 最初のステップ:ダイアログクライアントのインスタンス作成
    • 銀行チャットボットのVoiceflowプロジェクトを再利用するサンプル
      • 必要なオプションはバージョンIDのみ
      • ダイアログクライアントはデフォルトでは、すべてのSpeakブロックのトレースを公開する
      • チャットウィンドウのビジュアルを扱う場合にはVisualタイプもインクルードする
      • オーディオやチップのような他のタイプもこの配列にインクルード可能

f:id:kun432:20210227014101p:plain

  • 対話の開始メソッドの実装
    • プレースホルダを実際の実装に置き換え
    • ダイアログエンジンを起動すると、会話の状態を含むContextと、ユーザに提示するのに必要な出力に関する一連のトレースを返してくれる

f:id:kun432:20210227014352p:plain

  • Contextを処理する関数の作成
    • Contextが保持している値でstateを終了状態に設定
    • Contextからすべてのレスポンスを受け取り、Trace Processorに渡す

f:id:kun432:20210227015058p:plain

  • Trace Processorの作成
    • SDKのヘルパービルダーを使用
    • 処理する必要がある各タイプ(この例では"speak" と "visual" )に対して、トレースを引数として受けて、出力を返す関数を渡す

f:id:kun432:20210227015216p:plain

  • interactメソッドの実装
    • 会話が終了した場合は start をもう一度呼び出す
    • それ以外の場合はsendTextを呼び出す。sendTextはContextを返すので、先ほどのprocessContextメソッドと同じように処理する。
  • これで実装は終了

f:id:kun432:20210227020055p:plain

f:id:kun432:20210227020129p:plain

  • 実際に動いているかを確認
    • Voiceflowのプロジェクトで作成した会話フローが使用されている
    • VisualとSpeakブロックが表示されている

f:id:kun432:20210227020523p:plain

  • フローに従って対話

f:id:kun432:20210227020708p:plain

  • 処理結果
    • ユーザの発話に応じた処理が行われ、その結果がVisualとSpeakブロックで定義したとおりに表示される
    • 最後にフローを終了
    • プロジェクトにダイアログエンジンSDKを実装することでチャットが完全に機能

f:id:kun432:20210227020726p:plain

  • SDKのメリット
    • この例で使用したコードはすべてのユースケースに適用可能
      • カスタムなウェブサイト上のチャットボット
      • メッセンジャーボット
      • 開発者は、対話ロジックを開発する必要がなく、アプリケーションロジックに集中できる
    • Voicwflow上のプロジェクトが更新されれば、SDKを利用したアプリ上にも反映される
  • ダイアログエンジンとSDKエコシステムへのアクセスについて
    • 開発者向けの技術的な機能を提供するが、同時ににシームレスなローコード体験のためのビジュアルレイヤーを提供することも計画している
    • 我々はゆっくりとクリックして簡単にアップロードできる統合機能をこれらの新しいチャンネルに追加していく予定
    • デモやドキュメント、さらなる詳細を含めた開発者向けSDKスターティングパックの申込についてメールで周知する予定。
    • Voiceflowをいろんなインタフェースで利用するためにSDKに興味があれば誰でも申込可能。

f:id:kun432:20210227021110p:plain

まとめ

Designer/Developer Hand-offというテーマで開発者向けの機能紹介でした。今回は特に技術的な内容だったので、ノンコーディングプラットフォームという観点からすると少し難しい内容だったかもしれません。

ただ、SDKがリリースされることで、巷でよく言われる「ノンコーディングはできることが限られている・限界がある」というようなことはもう言えなくなるほどの拡張性が得られる可能性がありますし、多数のユースケースに対応できるカスタムアシスタントはもちろん、これまで利用できなかったAlexaやGoogleなどの音声プラットフォームが提供する独自機能への対応というところも可能になるのではないかと思います。非常に可能性が感じられるアップデートですね!

もともとノンコーディングは、開発(コーディング)に対する敷居を下げることで誰でも参入しやすいという特徴があります。それが往々にしてコーディング VS ノンコーディングという対立構造にされがちなのですが、そうではなく、それぞれの得意分野に沿って最適な形で提供することでお互いのメリットを活かすことができますし、その間の連携がうまく取れればお互いにハッピーですよね。柔軟かつスピーディーなテストツールによるプロトタイピングと、拡張性に優れたSDKの組み合わせは、非常に期待が持てる良いアップデートになるのではないかと思います。

ちなみにSDKのベータテストへの申込は以下より行えます。興味のある方はぜひ!

https://airtable.com/shrQWZwypDQTOrt0I

次回は最後にNo Code Capabilities to Allについてまとめます。