はじめに
本記事はAWSで提供されているサーバレスサービスを使用し、文章の感情分析および翻訳を行うサービスを構築するハンズオンです。
全3記事の構成となっており、本記事は第2回となります。
- AWSサーバレスアーキテクチャで文章解析サービスを構築する その1
- AWSサーバレスアーキテクチャで文章解析サービスを構築する その2
- AWSサーバレスアーキテクチャで文章解析サービスを構築する その3
構築するアーキテクチャ、使用するサービスなどについては第1回目の記事を参照ください。
注意①
本資料内スクショのAWS管理コンソールのデザインは資料作成当時のものです。
デザインは今後変更される可能性があり、スクショと差異がある場合がありますのでご了承ください。
注意②
今までのハンズオン(前提条件・知識に記載)で実施した手順は基本省略して記載するのでご了承ください。
複雑な手順等は例外として記載する場合があります。
注意③
ハンズオンで作成したリソースについてはハンズオン終了後、各自削除をお願いします。
ゴール
- 複数のAWSサービスを並列実行するStep Functionsのステートマシンが構築できる
- IAMロール、IAMポリシー、信頼ポリシーについてイメージしていただく
- Amazon EventBridgeによるイベントのハンドリングを理解していただく
前提条件・知識
- 前回ハンズオンを実施していること
使用サービス紹介
本ハンズオンで触るAWSサービスを説明します。
その他サービスについては以降その都度説明いたします。
Amazon S3(Simple Storage Service)
容量無制限のオブジェクトストレージサービスです。厳密には違いますがオブジェクトはファイルと思って構いません。
DropBoxやGoogle Driveみたいなものをイメージしてください。
このストレージは99.999999999%の高い耐久性(データが損失しない確率)を持ち、アクセス制御、自動削除機能なども多数提供します。
また、他のAWSサービスとの連携も容易に可能です。
本サービスは2006年3月に一般公開されました。
以下の図は高い可用性と耐久性のオブジェクトストレージ。Amazon S3 をグラレコで解説より
用語
| 用語 | 意味 | 
|---|---|
| バケット | オブジェクトが保存されるコンテナです。バケット(Bucket)とはバケツのことでまさにファイルの入れ物を表します | 
| オブジェクトキー | オブジェクトを一意に識別する情報です。ファイルのフルパスのようなイメージで構いません | 
| プレフィックス | オブジェクトキーからオブジェクト名を除いた文字列です | 
Amazon EventBridge
サービスリソースの変更イベント(S3バケットへのオブジェクトアップロードなど)やスケジュールを処理のトリガーとし、後続の処理を実行させることができるサービスです。
以前はCloudWatch Eventsという同等の機能を持つサービスがありましたが、今後はこちらを使用するよう推奨されています。
以下の図はサーバーレスのイベントバスって何 ? Amazon EventBridge をグラレコで解説より
用語
| 用語 | 意味 | 
|---|---|
| イベントソース | イベントの発生元です。例えば「当該S3バケットへのオブジェクトアップロード」イベントから後続処理を実行させたいというケースでは、 S3バケットがイベントソースになります | 
| イベントパターン | 後続処理を実行させる条件です。例えば「当該S3バケットへのオブジェクトアップロード」イベントから後続処理を実行させたいというケースでは、 当該S3バケットへのオブジェクトアップロードが条件になります | 
| イベントターゲット | イベントをトリガーとして処理させる対象です。例えばイベントをトリガーにLambda関数を実行させるケースでは、 当該Lambda関数がイベントターゲットになります | 
| イベントバス | イベントの送受信を管理するEventBridgeの構成要素の一つです。イベントが通過する道路のようなイメージです | 
AWS Step Functions
以下の図はアプリのワークフローを視覚的に構成。 AWS Step Functions をグラレコで解説より
Amazon Translate
ディープラーニング技術を用いた機械翻訳を提供するサービスです。
Amazon Comprehend
AIを活用したテキストを分析する様々な機能を提供するサービスです。
今回使用する感情分析の他、文章内の重要な言い回しを検出するキーフレーズ検出などの機能があります。
以下の図は機械学習の知識ゼロでもテキストデータを分析。Amazon Comprehend をグラレコで解説より
今回ハンズオンで作成する構成
今回は赤枠で囲まれた部分をハンズオンで作成します。
処理の流れとしては以下になります。
- Amazon S3に日本語文章が記載されたテキストファイルをアップロードする
- S3にファイルがアップロードされたら、その事象(イベント)をトリガーにEventBridgeでステートマシンを呼び出す
- ステートマシンは以下の処理を行う
- アップロードされたファイルに記載されている文字列を取得する
- 取得した文字列を対象に翻訳処理、感情分析処理を並列実行する
- Amazon Translateで文字列を英訳する
- Amazon Comprehendで文字列を感情分析する
 
 
ハンズオン
S3バケットにファイルアップロードしたらステートマシンを起動させる
S3バケットを作成する
翻訳対象のテキストファイルをアップロードするS3バケットを作成します。
前回の「S3バケットの作成」を実行してください。
S3バケットにフォルダ作成
S3バケットにファイルをアップロードするフォルダを作成します。
作成したS3バケットの画面に遷移し、フォルダの作成ボタンをクリックしてください。
フォルダ名にuploadsと入力し、フォルダの作成ボタンをクリックしてください。
Step Functionsステートマシンを作成する
とりあえず、入力をそのまま返却するステートマシンを作成します。
前回の「ステートマシンの作成」を実行してください。
EventBridgeルールを作成する
S3バケットにファイルがアップロードされたらステートマシンを実行するようEventBridgeのルールを作成します。
まず、S3バケット内でのイベントをEventBridgeに送信するための設定を行います。
S3バケット一覧画面で作成したS3バケット名のリンクをクリックしてください。
S3バケットの詳細画面が表示されるので、プロパティタブを選択してください。
画面下部にイベント通知セクションがあります。
左下にある編集ボタンをクリックしてください。
このバケット内のすべてのイベントについて Amazon EventBridge に通知を送信するをオンに変更し、変更の保存ボタンをクリックしてください。
これにより、当該S3バケットに対するリソース変更イベントがEventBridgeに届くようになります。
続いて、EventBridgeルールを作成します。
画面上部の検索窓にeventbridgeと入力し、表示されるAmazon EventBridgeをクリックしてください。
画面左にあるルールをクリックしてください。
イベントバスはdefaultのままで、ルールを作成ボタンをクリックしてください。
EventBridgeルールの名前などを入力します。
名前は任意ですが、今回は{ユーザ名}_S3ObjectCreateRuleにしました。
それ以外の値はデフォルトにし、次へボタンをクリックします。
どのようなイベントをトリガーするかを定義するイベントパターンの項目を入力します。
イベントソースには、イベントの発生元の種類を選択します。今回はS3なのでデフォルトで構いません。
サンプルイベント - オプションは必須ではありませんが、テスト用で使用するため設定してみましょう。
サンプルイベントタイプにAWSイベント、サンプルイベントにObject Createdを選択してください。
表示されるJsonはS3バケットにファイルが生成された際に発生するイベントの実体です。
興味があれば、他サービスの場合も確認してみてください。
作成のメソッドはこの後に行うイベントパターンの作成方法を指定します。パターンフォームを使用するを選択してください。
イベントパターンはイベントをトリガーする条件(どのようなサービスで何のイベントが発生したか)を指定します。
イベントパターンの実体はJsonであり、セクション左側の入力に従って右側のイベントパターンが自動入力されます。
まず、イベントソースは先ほど説明したようにイベントの発生元の種類を指定します。今回はAWSのサービスを選択します。
次に、AWSのサービスでトリガーとなるイベントが発生するAWSサービスを指定します。今回はSimple Storage Service(S3)を選択します。
次に、イベントタイプで今回トリガーするイベントの種類を指定します。今回はS3にオプジェクトがアップロードされた時のイベントをトリガーにしたいのでAmazon S3イベント通知を選択します。
次に、具体的にどのイベントをトリガーにするか選択します。ラジオボタンで特定のイベントを選択し、プルダウンをクリックするとイベントが選択できるのでObject Createdを選択してください。
ここまでで、S3バケットにファイルがアップロードされた場合のイベントをキャッチすることはできますが、より条件を厳密にするため以下の設定を行います。
まず、どのS3バケットのObject Createdイベントをトリガーするかをラジオボタンで選択します。特定のバケット (名前別)を選択し、入力欄に作成したS3バケット名を入力してください。
次に、どのディレクトリにファイルをアップロードしたらトリガーするかを指定します。
セクション右側にあるパターンの編集ボタンをクリックしてください。
イベントパターンのJsonが編集できるようになります。
S3バケットの特定のディレクトリ(prefix)にファイルがアップロードされた時をトリガーにしたいので、Jsonのbucketオブジェクトと同階層に以下のJsonオブジェクトを追加します。
今回はuploadsディレクトリをprefixとして指定します。
"object": {
  "key": [{
    "prefix": "uploads/"
  }]
}
次に、イベントパターンの条件を満たすイベントが発生した場合、どのAWSサービスを起動するかをイベントターゲットとして指定します。
ターゲットタイプは起動させるターゲットの種類であり、今回Step Functionsのステートマシンを起動させたいのでAWSのサービスを選択します。
ターゲットの選択では、起動させるサービスについて指定します。今回はStep Functionsステートマシンを選択していただき、2つ目のプルダウンでは自身が作成したステートマシンを選択してください。
実行ロールはEventBridgeにどのような権限を持たせるかをIAMロールで指定します。今回はステートマシン作成時に自動生成されたIAMロールを指定します。(ユーザ名で検索すれば出てくるかと思います)
全て入力したら次へボタンをクリックしてください。
続いて、タグ入力画面ですが、特に入力せず、次へボタンをクリックしてください。
最後、確認画面になります。内容確認したらルールの作成ボタンをクリックしてください。
画面上部に成功メッセージが表示されれば、ルールの作成は完了です。
ステートマシン起動権限追加
EventBridgeからStep Functionsのステートマシンを起動させるため、IAMロールにIAMポリシーを追加します。
画面上部の検索窓にiamと入力し、表示されたIAMをクリックしてください。
左側または中央にあるロールをクリックしてください。
一覧の検索窓にユーザ名を入力し、「EventBridgeの実行ロールで指定した」IAMロールを選択します。
許可タブを選択し、許可を追加プルダウンを選択し、ポリシーをアタッチをクリックしてください。
検索窓にstepと入力し、表示されたAmazonStepFunctionsFullAccessをチェックして、許可の追加ボタンをクリックしてください。
さて、今までIAMロールやIAMポリシーなどと言ってきましたが、これらは一体なんでしょうか?
丁寧に説明するとかなりの文量となるため、それぞれを簡単に説明します。
まず、IAMロールです。
IAMロールはAWSのサービス(ステートマシンやEC2インスタンスなど)、AWSアカウントなどに一時的な権限を与える概念です。
一時的というのがポイントであり、これによりセキュアにサービスを実行したり、別アカウントと疎通したりすることができるようになります。
IAMロールはそのアイコンから帽子、某記事から仮面に例えられる場合があります。
次にIAMポリシーです。
IAMポリシーはIAMロールやIAMユーザに付与する権限を表します。
どのサービスでどのような操作を許可、拒否するかを指定します。
IAMロールについてはbuilders.flashの記事「テクニカルトレーナーと学ぶ AWS IAM ロール」が非常にわかりやすかったので是非ご一読ください。
EventBridge用の信頼ポリシーを追加
EventBridgeかIAMロールに付与された権限を使用できるようにするため信頼ポリシーを追加します。
信頼関係タブを選択し、信頼ポリシーを編集をクリックしてください。
続いて、信頼ポリシーを追加します。既存のStatementオブジェクトに以下のJsonオブジェクトを追加し、ポリシーを更新ボタンを押下してください。
{
    "Effect": "Allow",
    "Principal": {
        "Service": "events.amazonaws.com"
    },
    "Action": "sts:AssumeRole"
}
さて、信頼関係(信頼ポリシー)の追加を行いましたがこれは一体なんでしょうか?簡単に説明します。
信頼関係(信頼ポリシー)とは、IAMロールに付与する設定であり、IAMロールに追加した権限をどのサービスに使用許可するかを指定します。
今回はEventBridgeにStep Functionsのステートマシンの操作権限を与えたかったため、Principal.ServiceにEventBridgeを表すevents.amazonaws.comを指定しました。
EventBridgeルールでステートマシンが起動するか確認
テキストファイルを先ほど作成したフォルダにアップロードしてステートマシンが実行されるか確認します。
作成したフォルダのリンクを選択します。
アップロードボタンをクリックしてください。
ファイルの追加ボタンをクリックし、アップロードするファイル(日本語文章が書かれたファイル)を選択してください。
アップロードボタンをクリックしてください。
画面上部に成功メッセージが表示されればアップロード成功です。
ステートマシンが実行されたか確認します。
ステートマシンの詳細画面の実行履歴を見ると1つ実行され、成功していることがわかりました。
名前のリンクをクリックして、実行の詳細を確認してみましょう。
特にステートマシンの入力がどのようになっているのか確認します。
画面上部の実行の入力と出力からステートマシンの入出力が確認できます。
入力には、先ほどS3バケットにファイルをアップロードした際に発生したイベントに関連する情報が含まれています。
例えば、ファイルがアップロードされたS3バケット名(detail.bucket.name)やアップロードされたファイルのオブジェクトキー(detail.object.key)、ファイルのサイズ(detail.object.size)などです。
これら入力情報をステートマシンのステートで参照し、AWSサービスを呼び出してみましょう。
{
  "version": "0",
  "id": "9e78d6a1-c535-4605-c4c8-9372fb13b3f5",
  "detail-type": "Object Created",
  "source": "aws.s3",
  "account": "XXXXXXXXXXX",
  "time": "2023-08-01T16:52:30Z",
  "region": "ap-northeast-1",
  "resources": [
    "arn:aws:s3:::k.satou-20230721"
  ],
  "detail": {
    "version": "0",
    "bucket": {
      "name": "k.satou-20230721"
    },
    "object": {
      "key": "test.txt",
      "size": 30,
      "etag": "c00d66f30acd4e94e7c4df9da666005c",
      "sequencer": "0064C9384E15627D4E"
    },
    "request-id": "1ZXYPMYW1Z1EEY1T",
    "requester": "XXXXXXXXXXX",
    "source-ip-address": "XXXXXXXXXXX",
    "reason": "PutObject"
  }
}
ファイルから文字列を取り出す
Amazon TranslateやAmazon Comprehendのステートを実行するため、S3にアップロードしたファイルに記載されている文字列の取得が必要です。
作成したステートマシンのWorkflow Studioを表示してください。
そして、画面中央のステートマシンにすでにステートがある方は全て削除してください。
以下の状態になっていることを確認してください。
画面左側のアクションタブを選択し、検索窓にgetobjectと入力してください。
GetObjectというステートが表示されるのでそれをスクショの場所にドラッグ&ドロップしてください。
GetObjectのインターフェースを確認します。
GetObjectステートを選択し、画面右側の設定タブを選択します。
APIパラメータに着目してください。
これがAmazon S3のGetObjectAPIのリクエストJsonになります。
指定する項目について簡単に説明します。
| 項目名 | 意味 | 例 | 
|---|---|---|
| Bucket | 取得するオブジェクトを格納したS3バケット名 | hogeBucket | 
| Key | オブジェクトキー(ファイルパス) | test.txt | 
以上から、BucketにはファイルをアップロードしたS3バケット名、Keyにはアップロードしたファイルのパスを指定すれば良いことがわかります。
また、これら情報はステートマシンの実行でステートマシンの入力となったJsonに含まれています。
Bucketはdetail.bucket.name、Keyはdetail.object.keyです。
これらをGetObjectステートのAPIパラメータに指定すれば良いです。
指定の仕方は前記事のParameterをご一読ください。
今回入力するJsonは以下になります。APIパラメータに上書きしてください。
{
  "Bucket.$": "$.detail.bucket.name",
  "Key.$": "$.detail.object.key"
}
設定を保存し、再度S3バケットにファイルをアップロードさせ、ステートマシンを実行してみましょう。
ステートマシンの入出力の結果は以下のようになります。
出力JsonのBodyにファイルに記載された文字列が表示されていることがわかります。
この文字列を以降のAmazon Translate、Amazon ComprehendのAPIパラメータに渡します。
英訳機能を追加する
Amazon Translateの起動権限追加
ステートマシンに付与されているIAMロールにIAMポリシーを付与し、Amazon Translateのサービスを呼び出せるようにします。
前準備①と同様の手順でIAMポリシーを追加します。
前準備①のポリシーをアタッチをクリックした後の画面で、検索窓にtranslateと入力し、表示されたTranslateFullAccessをチェックして、許可の追加ボタンをクリックしてください。
ポリシーの一覧で以下のようにTranslateFullAccessが表示されていれば追加成功です。
Amazon Translateの翻訳APIの実行
ステートマシンにAmazon Translateで翻訳を行うステートを追加し、実行してみます。
実行方法については翻訳のほか、感情分析も同様に実施する必要があるため、1つずつ処理を実行すると処理時間がかかる可能性があります。
そのため、翻訳と感情分析は並列して実行させます。
画面左側のフロータブを選択し、Parallelステートを画面中央のGetObjectとEndの間にドラッグ&ドロップしてください。
このParallelステートの箱内に配置されるステートは並列実行されます。すべての処理が終了したら次のステートに遷移します。
続いて、Amazon Translateの翻訳サービスを行うステートを追加します。
画面左側のアクションタブを選択し、検索窓にtranslateと入力してください。
TranslateTextというステートが表示されるのでそれをスクショの場所にドラッグ&ドロップしてください。
TranslateTextのインターフェースを確認します。
TranslateTextステートを選択し、画面右側の設定タブを選択します。
APIパラメータに着目してください。
これがAmazon TranslateのTranslateTextAPIのリクエストJsonです。
出力されているのは必須項目だけですが、非必須項目も指定できます。
詳細は公式ドキュメント Request Syntaxを参照ください。
指定する項目について簡単に説明します。
| 項目名 | 意味 | 例 | 
|---|---|---|
| SourceLanguageCode | 翻訳元文章の言語コード | ja | 
| TargetLanguageCode | 翻訳先文章の言語コード | en | 
| Text | 翻訳対象の文字列 | こんばんは! | 
以上から、今回は日本語文章を英語翻訳するためにSourceLanguageCodeはja、TargetLanguageCodeはenを指定すれば良いことがわかります。
また、Text情報はファイルから文字列を取り出すでGetObjectステートの出力となったJsonのBodyに含まれています。
これらをTranslateTextステートのAPIパラメータに指定すれば良いです。
今回入力するJsonは以下になります。APIパラメータに上書きしてください。
{
  "SourceLanguageCode": "ja",
  "TargetLanguageCode": "en",
  "Text.$": "$.Body"
}
設定を保存し、再度S3バケットにファイルをアップロードさせ、ステートマシンを実行してみましょう。
ステートマシンの入出力の結果は以下のようになります。
出力JsonのTranslatedTextに翻訳された文字列が出力されていることがわかります。
感情分析機能を追加する
Amazon Comprehendの起動権限追加
ステートマシンに付与されているIAMロールに権限を付与し、Amazon Comprehendのサービスを呼び出すことができるようにする必要があります。
前準備①と同様の手順でIAMポリシーを追加します。
前準備①のポリシーをアタッチをクリックした後の画面で、検索窓にcomprehendと入力し、表示されたComprehendFullAccessをチェックして、許可の追加ボタンをクリックしてください。
ポリシーの一覧で以下のようにComprehendFullAccessが表示されていれば追加成功です。
Amazon Comprehendの感情分析APIの実行
ステートマシンにAmazon Comprehendで感情分析を行うステートを追加し、実行してみます。
画面左側のアクションタブを選択し、検索窓にcomprehend detectsentimentと入力してください。
DetectSentimentというステートが表示されるのでそれをスクショの場所にドラッグ&ドロップしてください。
DetectSentimentのインターフェースを確認します。
DetectSentimentステートを選択し、画面右側の設定タブを選択します。
APIパラメータに着目してください。
これがAmazon ComprehendのDetectSentimentAPIのリクエストJsonです。
詳細は公式ドキュメント Request Syntaxを参照ください。
指定する項目について簡単に説明します。
| 項目名 | 意味 | 例 | 
|---|---|---|
| LanguageCode | 分析対象文章の言語コード | ja | 
| Text | 分析対象の文字列 | こんばんは! | 
以上から、今回は日本語文章を感情分析するためにLanguageCodeはjaを指定すれば良いことがわかります。
また、Text情報はファイルから文字列を取り出すでGetObjectステートの出力となったJsonのBodyに含まれています。
これらをDetectSentimentステートのAPIパラメータに指定すれば良いです。
今回入力するJsonは以下になります。APIパラメータに上書きしてください。
{
  "LanguageCode": "ja",
  "Text.$": "$.Body"
}
設定を保存し、再度S3バケットにファイルをアップロードさせ、ステートマシンを実行してみましょう。
ステートマシンの入出力の結果は以下のようになります。
出力JsonのDetectSentimentに感情分析の結果(+TranslatedTextの結果)が出力されていることを確認してください。





















































