お役立ち Twitter Bot を作りながら学ぶ AWS ドリル

~第 7 回 AWS Step Functions を使って Well-being Bot を作ろう ! (後編)

2022-07-04
How to be a Developer

Author : 金澤 圭

ソリューションアーキテクト(SA)の金澤 (@ketancho) です。7 月になりましたが、皆さまいかがお過ごしでしょうか ? この記事を書いているのがちょうど梅雨が始まった時期なのですが、さっそく私は寒暖差とジメジメでやられてしまいそうな今日この頃です。カラッと軽やかな気持ちになれる、そんな Twitter Bot を僕のために開発してくださる方、募集中です。

この連載記事のその他の記事はこちら

選択
  • 選択
  • 第 1 回 おはよう Bot 編
  • 第 2 回 昔書いた記事の宣伝 Bot 編
  • 第 3 回 リファクタリング & 曜日ごとのツイート 編
  • 第 4 回 新章突入 ! 気になるワード検索 & 通知 Bot 編
  • 第 5 回 皆さまの代わりに英語でツイートしておくよ Bot 編
  • 第 6 回 AWS Step Functions を使って Well-being Bot を作ろう ! (前編)
  • 第 7 回 AWS Step Functions を使って Well-being Bot を作ろう ! (後編)
  • 第 8 回 - 総集編 & 夏休みの自由研究のすすめ
  • 第 9 回 - IaC 入門しながら作るリマインダー Bot (前編)
  • 第 10 回 - IaC 入門しながら作るリマインダー Bot (中編)
  • 完結回 - IaC & CI/CD 入門しながら作るリマインダー Bot (後編)

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 


1. この記事で作る Bot の機能と、とりあげる AWS サービス・機能

前回の記事 に引き続き、AWS Step Functions を活用して皆さまが元気かどうかをチェックする Well-being Bot を作っていきます。前回の作業が終わっていることを前提に進めますので、まだ終わっていない方は前回分を先に終えてから、この記事に戻ってきていただければと思います。

前回は、Step Functions から AWS Lambda 関数を呼び出したり、その結果に応じて Choice ステートを使って分岐したりといったワークフローを作成しました。個人的に GUI でワークフローを作っていく作業は楽しいと思っているのですが、皆さまどうでしたか ?

さて、Step Functions は AWS Lambda 関数を呼び出すだけではなく、AWS SDK 統合という機能を使い、多くの AWS サービスを直接呼び出すこともできます (参考記事)。今回の Well-being Bot 後編では、この機能も活用しながら Bot を育てていきます。まずはじめに、前回作った Step Functions のワークフローをおさらいしておきましょう。

まずツイート検索を行い、皆さまの普段づかいのアカウントで、日中のツイートがあるかを確認しました。この確認は、Twitter 検索用の Lambda 関数を呼び出すことで実施したのでしたね。

そして、その結果が 0 件であれば、日中ツイートできないほど忙しいと捉え 「大丈夫 ?」とツイートする。このような条件分岐するフローをつくりました。条件分岐には Choice ステートを使い、ツイートする部分は別の Lambda 関数を呼び出すアクションとしています。

クリックすると拡大します

しかし、日中ツイートしていたとしても、元気とは限りません。「あー、傘忘れた」「なんだか風邪気味..」「忙しくてブログを書く時間が取れない..」などのような、ネガティブ度合いの高いツイートが散見されるのであれば、きっと落ち込んでいるはずです。

そこで今回のドリルでは、日中のツイートを観察し、ネガティブなツイートが多いときにも、励ましツイートをするように Well-being Bot をアップデートしてみます。AWS には Amazon Comprehend という、テキストからインサイトや関係性を発見するための自然言語処理サービスがあります。機械学習の経験がない方でも機能として機械学習を利用できるサービスのひとつです。今回はこの Amazon Comprehend も使い、Well-being Bot 開発を進めていきます。

今回の開発の流れは下記の通りです。

  • Amazon Comprehend の呼び出しを Step Functions のステートマシンに組み込む
  • 最新のツイートがネガティブであれば、心配するツイートをするように Step Functions のステートマシンを修正する
  • Step Functions の Map ステートを使い、日中のツイート全てを分析し、ネガティブなものが多ければ心配する形にアップデートする

それでは始めていきましょう ! 🙌


2. 今回から AWS ドリルを始める方の作業と、今回の開発を進める上での Tips

まずはじめに、今回の前提となる作業や情報をお伝えします。

まず、前述の通り、今回の内容は前回の AWS ドリル #6 の作業を前提としています。前回の作業がまだの方は、先にそちらを終えてからこの記事に戻ってきていただければと思います。

また、この後のドリルで Step Functions の実行結果のページにアクセスすることになるのですが、ブラウザ上部に「新しいページを試す」ボタンが表示されている方もいらっしゃると思います。こちらのボタンを押すと、Step Functions の画面の一部が新しくなります。

前回の記事ではこのボタンを押さずに進めていましたが、この記事では「新しいページを試す」版で作業を進めています。今回のドリルの内容としては大きな影響はないのですが、記事と同じ UI で進めたい ! という方は、こちらのボタンを押してから進めていただいてもいいでしょう。

クリックすると拡大します

また、今回は下記の 2 つの作業を繰り返し行いますので、最初にその流れや Tips を共有します。手順が分からなくなってしまった場合には、立ち返っていただければと思います。

  • Step Functions ワークフローの修正
  • Step Functions のテスト実行を効率的に行う

2-1. Step Functions ワークフローの修正

今回の AWS ドリルでも、少しずつ Step Functions ワークフローを修正し、トライアンドエラーの形で進めていきます。この編集の流れを都度書くと紙面がもったいないので、先にワークフローの編集方法を共有します。

まず、対象のステートマシンの画面に遷移し、「編集」ボタンをクリックします。

クリックすると拡大します

ステートマシンを編集する画面で、Amazon States Language (ASL) を用いてワークフローをアップデートすることもできます。しかし、この AWS ドリルでは GUI ツール Workflow Studio でアップデート作業を進めますので、右側の「Workflow Studio」ボタンをクリックしてください。

クリックすると拡大します

Workflow Studio を使ったワークフローの具体的な修正については、このあとの記事で少しずつ進めていきます。

修正が終わったら後の手順も紹介します。まずは、Workflow Studio 右上の「適用して終了」ボタンをクリックしてください。(まだこの時点では修正が反映されません。)

クリックすると拡大します

すると、ステートマシンを編集する画面に戻ります。その後、右上の「保存」ボタンを押すと、ステートマシンの更新が完了します。

クリックすると拡大します

編集の内容によっては、このような IAM に関する注意点が出てくる場合があります

記事の中でも取り上げますが、新しい AWS サービスの呼び出し、あるいは新しい Lambda 関数の呼び出しが追加される場合は、ステートマシンにアタッチされている IAM ロールの修正が必要になる場合があります。

クリックすると拡大します

以上が、Step Functions ワークフローの修正の流れになります。この後の記事ではこの部分を省略して記載しますが、流れが分からなくなってしまった場合は、こちらに戻ってきてください。

2-2. Step Functions のテスト実行を効率的に行う

同じく、作成した Step Functions ステートマシンの実行も何度も行いますので、その方法と Tips を共有します。

まず、実行方法は前回のドリルでも示した通り、対象のステートマシンの画面から行います。「実行の開始」ボタンが 2 箇所ありますが、どちらから進んでいただいても問題ありません。

クリックすると拡大します

ステートマシンへの入力を指定するポップアップが出るので、こちらに下記の JSON を入力し、「実行の開始」ボタンをクリックすると実行が始まります。(Twitter アカウント名は皆さまの普段づかいのものに変更してください。)

{
  "search_query": "from:ketancho -is:retweet",
  "search_before_hours": "12"
}

クリックすると拡大します

今回の AWS ドリルでは、この同じ JSON を入れ続けていただきます。何度もトライアンドエラーしていただくことになるのですが、この JSON 情報を何度も入力するのがめんどくさい・・・と思われることがあるかもしれません。その場合は、ステートマシンの実行結果の画面に遷移し、そこから実行するのがオススメです。

ステートマシンの画面を下にスクロールすると、過去の実行結果が一覧で表示されます。そのうちの一つをクリックしてください。

クリックすると拡大します

表示された実行結果画面で「新しい実行」をクリックすると、その実行をしたときと同じ入力値が、デフォルトでポップアップに追加されます。こちらから「実行の開始」をしていただくことで入力を省略することができます。

クリックすると拡大します

以上が、今回の AWS ドリルを進める上で前提となる手順と、抑えておきたい手順の紹介になります。ここから具体的な Well-being Bot の実装に入っていきましょう。


3. Amazon Comprehend の呼び出しを Step Functions のステートマシンに組み込む

まずはじめに、Amazon Comprehend の機能を呼び出す部分を進めていきます。この記事で、初めて Amazon Comprehend を利用するという方も多くいらっしゃると思いますので、まずはマネージメントコンソールから Amazon Comprehend を試すところから始めます。

3-1. Amazon Comprehend を試す

Amazon Comprehend の画面 に遷移してみてください。トップページ右側の「Launch Amazon Comprehend」ボタンをクリックしていただくか、こちらの Real-time analysis の画面 に移動すると、文章を分析することができます。

少し下の方にスクロールしていただくと、Input text というエリアがあります。こちらの「Input text」欄にお好きな文字を入れてみてください。(私は「あー、傘忘れた」と入れてみました。)

その後、右下の「Analyze」ボタンをクリックしてください。

クリックすると拡大します

実行すると、下部に Insights というエリアが表示されます。ここにインサイトや関係性が出てくるのですが、今回はこの内のセンチメント分析機能を利用したいので、「Sentiment」タブをクリックしてください。

すると Results の部分に、そのテキストの感情を分析することができます。ポジティブな文章なのか、ネガティブなものなのか、といった形です。

また、下部の Application Integration の枠をクリックすると、より詳細に情報を取得することができます。

参考 : https://docs.aws.amazon.com/ja_jp/comprehend/latest/dg/how-sentiment.html

以上で、Amazon Comprehend のお試しは終了です。

クリックすると拡大します

AWS ドリル #5 で翻訳サービス Amazon Translate を利用したときと同じように、プログラムから AWS SDK を使ってこの Amazon Comprehend を呼び出せます。過去のドリルに取り組んでいただいた方の中には「AWS Lambda から Amazon Comprehend を利用する形であれば、実装できそう !」と思っていただけた方もいらっしゃるかもしれません。

しかし、今回は Lambda 関数を経由して Amazon Comprehend を呼び出すのではなく、Step Functions ワークフローから直接呼び出す機能を活用する形で実装を進めていきたいと思います。

3-2. Amazon Comprehend の機能を呼び出すように Step Functions ワークフローを修正する

それでは、前回作成した Step Functions をアップデートしていきます。いきなり今回やりたいことを全て実装するのではなく、まずは Amazon Comprehend を Step Functions から呼び出すだけ、というところまで進めようと思います。最終的には、日中のツイートを全て取得しそれぞれに対してセンチメント分析したいのですが、練習も兼ねて「最新のツイートのみ」を分析するワークフローを作ります。

それでは、前回の作成した Step Functions ステートマシンのページに移動し、作業を進めていきます。(ステートマシンの編集の仕方は、この記事の冒頭の 「2-1. Step Functions ワークフローの修正」に記載しています。)

まずはじめに、左上の方にある アクション / フロー の検索窓に “Comprehend Sentiment” と入力してください。すると、該当する候補が絞り込まれますので、この中から「DetectSentiment」をドラッグ & ドロップします。

前回該当するツイート数が 1 以上の場合は何もせずに Success (終了) としましたが、その Success の直前に DetectSentiment が入るようにドラッグ & ドロップします。

クリックすると拡大します

狙った場所にアクションを入れられましたか ?

ドラッグ & ドロップした後は、おそらく今挿入した DetectSentiment が選択された状態 (背景色が水色) になっていると思います。この状態で、右側の API パラメータの欄下記の値を入れましょう。

{
  "LanguageCode": "ja",
  "Text.$": "$.data[0].text"
}

クリックすると拡大します

上記のような API パラメータにした理由を少しだけ解説します。もし、検索に該当するツイートが複数あった場合、下記のような JSON が Detect Sentiment アクションに入力されます。最終的には変更するのですが、現時点では暫定的に最新のもの、data[0] に絞って感情分析を行います。結果、$.data[0].text をターゲットにしています。

{
  "data": [
    {
      "id": "1533247931209224193",
      "text": "やっぱりポジティブな気持ちです"
    },
    {
      "id": "1533247656901812224",
      "text": "これはネガティブなツイートです"
    }
  ],
  "meta": {
    "newest_id": "1533247931209224193",
    "oldest_id": "1533247656901812224",
    "result_count": 2
  }
}

ここまでの作業が終わったら、現状の Step Functions ステートマシンが期待する動きになるかを確認します。ステートマシンへの変更を保存してください (保存の仕方が分からない方は、この記事の冒頭の 「2-1. Step Functions ワークフローの修正」を参考にしてみてください)。

このとき、IAM ロールに関する注意喚起のポップアップが出ると思います。現在、Step Functions ステートマシンに紐づく IAM ロールに、Amazon Comprehend の DetectSentiment API を呼び出す権限が付与されていません。そのため、このままテスト実行してもエラーとなります (試しに実行し、エラーになることを確認してもいいかもしれません)。そこで、適切な権限を割り当てる作業を進めていきましょう。

まずは、ステートマシンのページに戻り、紐づく IAM ロールのページに移ります。こちらの IAM ロール ARN のリンクをクリックし、IAM ロールの設定画面に移ります。

クリックすると拡大します

IAM ロールに権限を追加する方法は幾つかあるのですが、今回は Amazon Comprehend に関連する操作が事前定義された IAM ポリシーを活用します。(IAM ポリシーは、本来は必要最低限の権限に絞るべきなのですが、今回は標準で用意されている IAM ポリシーを使います。)

アクセス許可を追加」ボタンから「ポリシーをアタッチ」をクリックします。

クリックすると拡大します

続いて、既存の IAM ポリシーが一覧表示される画面に遷移しましたら、検索窓に Comprehned と入力し、エンターを押してください。このうち「ComprehendReadOnly」を使いますので、その左側にチェックを入れ、右下の「ポリシーをアタッチ」をクリックしてください。

以上で、現状のステートマシンを実行するのに必要な権限を付与することができました。

クリックすると拡大します

3-3. Step Functions ワークフローのテストを実施する

それではテスト実行していきましょう。テストの仕方を忘れてしまった ! という方や、入力する JSON を忘れてしまった ! という方は、この記事の冒頭の 「2-2. Step Functions のテスト実行を効率的に行う」を参考にしてください。

また、12 時間以内にツイートしていないと検索に該当するツイートが存在せず、前回のドリルの心配するツイートの方に分岐してしまいます。よろしければ何かしらツイートをした上で、テスト実行してみてください。(「AWS ドリル #7 やってるよ ! #AWSウェブマガジン」のようなツイートをしていただけると私は嬉しいです😆)

テスト実行すると、こちらのような結果画面に遷移します。赤いエラーが出ておらず、出力欄に何かしらのセンチメント分析の結果が表示されていれば成功です🎉

もしエラーとなった場合は、エラーメッセージを見ながら対応を進めましょう。エラーで一番多いのは、IAM の設定を誤ってしまい、権限系のエラー (AccessDeniedException) が出るパターンかなと思います。その場合は、ステートマシンに紐づく IAM ロールの設定を見直してみてください。

クリックすると拡大します


4. 最新のツイートがネガティブであれば、心配するツイートをするように Step Functions のステートマシンを修正する

続いて、検索に該当した最新のツイートがネガティブなものだった場合は、心配するメンションを送るようにステートマシンを修正していきます。

再度、ステートマシンの編集画面に遷移してください。

左側の「フロー」タブをクリックしたのち、「Choice」ステートをドラッグ & ドロップします。配置先は DetectSentiment アクションの直後にします。

クリックすると拡大します

Choice ステートが選ばれている状態で、右側の「状態名」に「Choice - Tweets are Negative」と入力してください。

その後、Choice Rules の Rule #1 の「編集」ボタンをクリックし、分岐条件を定義します。

クリックすると拡大します

先ほどのテスト実行でセンチメント分析の出力として表示された Sentiment の値が NEGATIVE であれば、心配ツイートをしたいと思います。そこで、条件に下記を入力し、「条件を保存する」をクリックしてください。

  • Variable : $.Sentiment
  • Operator : is equal to
  • Value : String constant
  • Value の右側 : NEGATIVE

クリックすると拡大します

続いて、条件を満たしたとき、つまりネガティブなツイートがあったときに、心配するメンションを送るようにします。この部分は前回のドリルで構築した部分をコピーしていきます。

Tweet Lambda Invoke」アクションを右クリックし、「状態を複製」を選択してください。

クリックすると拡大します

すると、このように「Tweet Lambda Invoke (1)」アクションが複製されます。こちらを先ほど定義した、Sentiment が NEGATIVE だったときの分岐先にドラッグ & ドロップしましょう。

クリックすると拡大します

狙ったところに挿入できたでしょうか ?

今挿入した Tweet Lambda Invoke の状態名を区別しやすいように「Tweet Lambda Invoke - cheer up」に変更しましょう。

続いて、ツイートする文言を決めるためにペイロードの部分を修正します。この部分は、皆さまがかけられたら嬉しいメッセージにしてみてください。私は同じカテゴリーで執筆している吉田さんからよく頂く、優しい励ましを採用し、下記のように設定しました。

{
  "tweet_text": "@ketancho 落ち込んでる暇なんてないですよ!ブログ書いて!"
}

クリックすると拡大します

それでは、テスト実行してみましょう。今回作成した分岐のテストをするために、事前に何かしらネガティブなツイートをしてから実行してみてください。

「Tweet Lambda Invoke - cheer up」アクションを通るフローで、かつオールグリーンになれば OK です。

クリックすると拡大します

Twitter Bot からも優しい励ましが飛んでくれば成功です🎉
温かいメッセージですね。


5. Step Functions の Map ステートを使い、日中のツイート全てを分析し、ネガティブなものが多ければ心配する形にアップデートする

さて、今回のドリルの最後のパートに入っていきます。Well-being Bot には、1 日トータルでの感情分析をしてもらいたいと考えています。多少ネガティブなツイートがあったとしても、それと同等、あるいはそれを上回るポジティブなツイートがあれば総じて良かった日だと言えると思いますし、ネガティブなツイートがひとつしかなかったとしても、それ以外に嬉しい話がなければ心が折れかかっているかもしれません。そのため、日中のツイートを全て分析するようにステートマシンをアップデートしていきます。

日中の全てのツイートを分析するために Step Functions の Map ステート を使います。Map ステートは入力された配列の要素に対して、同じステップを繰り返し実行するステートです。先ほどは直近のツイートのみに対して行った「ツイートのセンチメント分析をする」を、全てのツイートに対して行うイメージです。実際に作業をしながら動作確認するのが一番わかりやすいと思いますので、早速進めていきましょう。

5-1. Step Functions ワークフローを修正する

ワークフロー編集画面で、再び「フロー」タブを選択したのち、Map ステートをドラッグ & ドロップします。挿入先は Detect Sentiment の直前としてください。

クリックすると拡大します

続いて、Map ステートで繰り返し実行したい DetectSentiment アクションを Map ステートの中にドラッグ & ドロップします。

クリックすると拡大します

続いて、Map ステートの処理を定義します。反復処理への Input を定義することができるのですが、今回は検索結果が、

{
  "data": [
    {
      "id": "1533247931209224193",
      "text": "やっぱりポジティブな気持ちです"
    },
    {
      "id": "1533247656901812224",
      "text": "これはネガティブなツイートです"
    }
  ],
  "meta": {
    "newest_id": "1533247931209224193",
    "oldest_id": "1533247656901812224",
    "result_count": 2
  }
}

の形で渡されてきます。

このうち data の配列の各要素に対して処理をしていきたいので、「項目配列へのパス」欄に $.data と入力してください。

また、その下の「最大同時実行」は 20 としますが、この値は日中のツイートの数に応じて調整してみてください。

クリックすると拡大します

続いて、DetectSentiment アクションの修正を行います。先ほどまでは、「最新のツイート」のみを対象としていましたが。今回、Map ステートを挟んだことで、data の配列の要素がひとつずつ DetectSentiment に渡されてくるので、その text 部分を参照する形に変更します。

{
  "LanguageCode": "ja",
  "Text.$": "$.text"
}

クリックすると拡大します

この時点で試しに実行してみると、エラーになるはずです。先ほど定義した「Choice - Tweets are Negative」ステートの条件が、「単一の」センチメント分析結果が来ることを前提としているからです。

エラーとなっている Choice ステートの「入力」欄を見ると分かる通り、下記のように Map ステートで実行された各 Action の結果が JSON の「配列」となって入力されています。

[
  {
    "Sentiment": "NEGATIVE",
    "SentimentScore": {
      "Mixed": 0.0000057592565,
      "Negative": 0.9946972,
      "Neutral": 0.003532787,
      "Positive": 0.0017641679
    }
  },
  {
    "Sentiment": "NEGATIVE",
    "SentimentScore": {
      "Mixed": 0.0015158787,
      "Negative": 0.8581669,
      "Neutral": 0.025057787,
      "Positive": 0.115259506
    }
  }
]

クリックすると拡大します

そこで、この配列の各要素から Sentiment を取得し、ポジティブとネガティブのどちらが多いかを評価する Lambda 関数をひとつ挟むことで、元々やりたかった機能を実現していきます。

5-2. Lambda 関数を新規で作成する

前回までと同じように AWS Lambda のサービス画面 に遷移し、右上の「関数の作成」をクリックしてください。

関数の基本的な情報には、

  • 関数名 : twitter-bot-is-positive-day-function
  • ランタイム : Python 3.9
  • アーキテクチャ : x86_64

を設定し、「関数の作成」をクリックしてください。(これまでのドリルと違う点として、この Lambda 関数では Twitter API を呼び出す必要がないので、requests_oauthlib モジュールもインストールする必要がない点にご注意ください。)

私は Lambda 関数のソースを下記のようにしてみました。

import json

def lambda_handler(event, context):
    current_tweets = event
    
    number_of_positive = 0
    number_of_negative = 0
    for tweet in current_tweets:
        if tweet['Sentiment'] == 'POSITIVE':
            number_of_positive+=1
        if tweet['Sentiment'] == 'NEGATIVE':
            number_of_negative+=1
    
    return {
        'is_positive': number_of_negative <= number_of_positive
    }

Lambda 関数ができあがりましたので、このように先ほどの JSON をイベント JSON として投入したテストを行ってみてください。NEGATIVE なものが多ければ False, そうでなければ True が返ってくるはずです。

(イベント JSON を用いた Lambda 関数のテスト実行については、ドリル #6 の 3-4. Lambda 関数のテスト実行をする をご覧ください。)

クリックすると拡大します

それではこの Lambda 関数を Step Functions ワークフローに組み込んでいきましょう。

Choice - Tweets are Negative」ステートの直前に AWS Lambda Invoke アクションを追加します。

クリックすると拡大します

今追加した Lambda Invoke アクションを選択し、「状態名」を「Lambda Invoke - check well-being」とします。

また、API パラメータ内の「Function name」の欄には、先ほど作成した twitter-bot-is-positive-day-function を入力しましょう。

クリックすると拡大します

続いて、「Choice - Tweets are Negative」ステートを選択し、分岐のルールを変更します。

クリックすると拡大します

条件を下記の通り指定し、右下の「条件を保存する」ボタンをクリックしてください。

  • Variable : $.is_positive
  • Operator : is equal to
  • Value : Boolean constant
  • Value の右側 : false

クリックすると拡大します

以上で、ワークフローの修正は完了なので、保存してください。最後に、新しい Lambda 関数をステートマシンから呼び出すことになったので、IAM ロールの修正を行います。

5-3. ステートマシンに紐づく IAM ロールをアップデートする

ステートマシンに紐づく IAM ロールの画面に遷移し、 IAM ロールに紐づく LambdaInvoke から始まる IAM ポリシーをクリックしてください。

クリックすると拡大します

ポリシーの編集」ボタンをクリックします。

クリックすると拡大します

JSON タブを選択し、先ほど追加した Lambda 関数 twitter-bot-is-positive-day-function の情報を 2 箇所追加し (直前の行末にカンマを忘れないように気をつけてください)、「ポリシーの確認」をクリックします。

クリックすると拡大します

ポリシーの確認画面にて「変更の保存」をクリックすると、IAM 関連の作業が完成です。

クリックすると拡大します

ステートマシンを試しに実行してみると、ネガティブなツイートが多い場合はこのようなフローになり、改めて Well-being Bot からメンションが飛ぶと思います。

(直近のテストで同一の文言をツイートしている場合はエラーになるので、そのツイートを削除してから実行するか、文言を変更してテストしてください。)

クリックすると拡大します

逆に、ポジティブなツイートが多い、あるいはポジティブ・ネガティブが同数の場合は、楽しいことが多い日を送れたということで、特にツイートすることなく終了となります。

クリックすると拡大します

最終的にはこのようなワークフローになっていると思います。改めて前回と今回のドリルで作った Well-being Bot の処理の流れを整理すると、

  • 直近のツイートを検索する
  • 該当するツイートがなければ元気かを心配する
  • 該当するツイートがある場合は、Map ステートと Amazon Comprehend を組み合わせて、各ツイートのセンチメント分析をする
  • ポジティブなものとネガティブなものの数を比べる Lambda 関数を挟んで、もしネガティブなものが多ければその場合も心配する

となります。

クリックすると拡大します

前回の Amazon EventBridge の設定が残っていれば、毎日 21 時にこのワークフローが動きますので、皆さまが何かしらの理由で元気がない場合は、Well-being Bot が励ましてくれると思います🎉

(EventBridge の設定は、ドリル #6 の 7. 毎日 21 時に定期実行する設定を行う をご覧ください。)


6. 落ち穂拾い & 参考情報

2 回に渡ってお送りしてきた Well-being Bot 開発、いかがでしたでしょうか ?

実は、この Bot は、2-3 年前に個人開発で作った Twitter Bot が元ネタになっています。心配するメンションを送るのではなく、30 分おきに直近のツイートを取得し、センチメント分析の結果に応じてユーザー名の末尾につく顔文字を変える (例 : POSITIVE → 😆、NEGATIVE → 🙁)という実装にしていました。(今も運用し続けているので、ご興味のある方は @ketancho を見に来ていただければと思います。)

個人的にこの機能を気に入っているので、今回の AWS ドリルでも同じことをやろうかなと思っていたのですが、この執筆時点で Twitter API v2 ではこの実装に使っている API (v1 における POST account/update_profile) が未対応でした。そこで、今回の Well-being Bot のように、ネガティブであれば心配メンションをする形に変更してお届けしています。先々 Twitter API v2 でもこの API が利用できるようになった際には、センチメント分析の結果によってユーザー名の顔文字を変える、という実装にも挑戦してみていただければ幸いです。(参考: Twitter API endpoint map)

最後に、前回の記事でも紹介した AWS Step Functions に関する動画ハンズオンを改めて共有します。今回の AWS ドリルでは使わなかった Parallel ステート、Wait ステートを利用しているので、Step Functions をより使いこなすための Next Step としておすすめです。

Hands-on for Beginners - AWS Step Functions 入門編

オンデマンド形式で配信している Hands-on for Beginners シリーズの、AWS Step Functions 入門編です。今回のドリル同様、Workflow Studio を使ってワークフローを作成するのですが、加えてこのハンズオンでは「AWS SDK 統合」機能を活用し、プログラムを書かずに AWS の各種サービスを利用していきます。「日本語の記事を英訳化 & 音声化する」という内容も楽しいと思いますので、ぜひあわせてご覧いただければ嬉しいです。

クリックすると拡大します


7. まとめ

「お役立ち Twitter Bot を作りながら学ぶ AWS ドリル」連載の第 7 弾として、皆さまの普段づかいのアカウントの最近のツイートをチェックして、負の感情が大きそうであれば心配する Well-being Bot を作りました。まだまだジメジメした季節が続きますが、この Bot のサポートがあればカラッと晴れやかな気持ちで夏休みまで頑張れるのではないでしょうか ! (私はちょっとバテつつあるので、ついうっかり手が滑って 7 月中に夏休みを取ってしまいそうです😌)

最後に改めてのお願いなのですが、皆さまのご感想・ご要望を #AWSウェブマガジン タグをつけてツイートしていただけたら嬉しいです🙏 この記事に +α して、こんなものを作ってみました ! という共有も大歓迎です。今後の連載の参考にさせてもらいたいと思っておりますので、ぜひよろしくお願いしますー !

それでは次回の記事でまたお会いしましょう !

この連載記事のその他の記事はこちら

選択
  • 選択
  • 第 1 回 おはよう Bot 編
  • 第 2 回 昔書いた記事の宣伝 Bot 編
  • 第 3 回 リファクタリング & 曜日ごとのツイート 編
  • 第 4 回 新章突入 ! 気になるワード検索 & 通知 Bot 編
  • 第 5 回 皆さまの代わりに英語でツイートしておくよ Bot 編
  • 第 6 回 AWS Step Functions を使って Well-being Bot を作ろう ! (前編)
  • 第 7 回 AWS Step Functions を使って Well-being Bot を作ろう ! (後編)
  • 第 8 回 - 総集編 & 夏休みの自由研究のすすめ
  • 第 9 回 - IaC 入門しながら作るリマインダー Bot (前編)
  • 第 10 回 - IaC 入門しながら作るリマインダー Bot (中編)
  • 完結回 - IaC & CI/CD 入門しながら作るリマインダー Bot (後編)

builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

金澤 圭 @ketancho
アマゾン ウェブ サービス ジャパン合同会社
技術統括本部 ソリューションアーキテクト

サーバーレスが好きなソリューションアーキテクト。業種業界問わず、お客様のプロダクト開発をサポートさせていただいています。オンデマンドで視聴できるハンズオン「AWS Hands-on for Beginners」、実際にものづくりをしながら AWS を学ぶ「AWS ドリルシリーズ」を企画・推進しており、楽しく学べるコンテンツを日々考えています。好きなサービスは AWS Lambda、AWS Step Functions、Amazon Personalize で、好きな休日の過ごし方は娘ふたりと川の字になって昼寝👧👧と赤ん坊を抱っこしながらの散歩です👶

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する