0
0

AWSサーバレスアーキテクチャで文章解析サービスを構築する その2

Last updated at Posted at 2023-10-15

はじめに

本記事はAWSで提供されているサーバレスサービスを使用し、文章の感情分析および翻訳を行うサービスを構築するハンズオンです。
全3記事の構成となっており、本記事は第2回となります。

構築するアーキテクチャ、使用するサービスなどについては第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 をグラレコで解説より

yougo_s3.png

用語

用語 意味
バケット オブジェクトが保存されるコンテナです。バケット(Bucket)とはバケツのことでまさにファイルの入れ物を表します
オブジェクトキー オブジェクトを一意に識別する情報です。ファイルのフルパスのようなイメージで構いません
プレフィックス オブジェクトキーからオブジェクト名を除いた文字列です

Amazon EventBridge

サービスリソースの変更イベント(S3バケットへのオブジェクトアップロードなど)やスケジュールを処理のトリガーとし、後続の処理を実行させることができるサービスです。
以前はCloudWatch Eventsという同等の機能を持つサービスがありましたが、今後はこちらを使用するよう推奨されています。

以下の図はサーバーレスのイベントバスって何 ? Amazon EventBridge をグラレコで解説より

yougo_eventbridge.png

用語

用語 意味
イベントソース イベントの発生元です。例えば「当該S3バケットへのオブジェクトアップロード」イベントから後続処理を実行させたいというケースでは、S3バケットがイベントソースになります
イベントパターン 後続処理を実行させる条件です。例えば「当該S3バケットへのオブジェクトアップロード」イベントから後続処理を実行させたいというケースでは、当該S3バケットへのオブジェクトアップロードが条件になります
イベントターゲット イベントをトリガーとして処理させる対象です。例えばイベントをトリガーにLambda関数を実行させるケースでは、当該Lambda関数がイベントターゲットになります
イベントバス イベントの送受信を管理するEventBridgeの構成要素の一つです。イベントが通過する道路のようなイメージです

AWS Step Functions

前記事参照

以下の図はアプリのワークフローを視覚的に構成。 AWS Step Functions をグラレコで解説より

yougo_stepfunctions.png

Amazon Translate

ディープラーニング技術を用いた機械翻訳を提供するサービスです。

job_english_tsuuyaku.png

Amazon Comprehend

AIを活用したテキストを分析する様々な機能を提供するサービスです。
今回使用する感情分析の他、文章内の重要な言い回しを検出するキーフレーズ検出などの機能があります。

以下の図は機械学習の知識ゼロでもテキストデータを分析。Amazon Comprehend をグラレコで解説より

yougo_comprehend.png

今回ハンズオンで作成する構成

今回は赤枠で囲まれた部分をハンズオンで作成します。
処理の流れとしては以下になります。

  • Amazon S3に日本語文章が記載されたテキストファイルをアップロードする
  • S3にファイルがアップロードされたら、その事象(イベント)をトリガーにEventBridgeでステートマシンを呼び出す
  • ステートマシンは以下の処理を行う
    • アップロードされたファイルに記載されている文字列を取得する
    • 取得した文字列を対象に翻訳処理、感情分析処理を並列実行する
      • Amazon Translateで文字列を英訳する
      • Amazon Comprehendで文字列を感情分析する

handson_system.png

ハンズオン

S3バケットにファイルアップロードしたらステートマシンを起動させる

S3バケットを作成する

翻訳対象のテキストファイルをアップロードするS3バケットを作成します。
前回の「S3バケットの作成」を実行してください。

S3バケットにフォルダ作成

S3バケットにファイルをアップロードするフォルダを作成します。
作成したS3バケットの画面に遷移し、フォルダの作成ボタンをクリックしてください。

EB-03-06.png

フォルダ名uploadsと入力し、フォルダの作成ボタンをクリックしてください。

Step Functionsステートマシンを作成する

とりあえず、入力をそのまま返却するステートマシンを作成します。
前回の「ステートマシンの作成」を実行してください。

EB-03-07.png

EventBridgeルールを作成する

S3バケットにファイルがアップロードされたらステートマシンを実行するようEventBridgeのルールを作成します。
まず、S3バケット内でのイベントをEventBridgeに送信するための設定を行います。
S3バケット一覧画面で作成したS3バケット名のリンクをクリックしてください。

EB-01-01.png

S3バケットの詳細画面が表示されるので、プロパティタブを選択してください。

EB-01-02.png

画面下部にイベント通知セクションがあります。
左下にある編集ボタンをクリックしてください。

EB-01-03.png

このバケット内のすべてのイベントについて Amazon EventBridge に通知を送信するオンに変更し、変更の保存ボタンをクリックしてください。
これにより、当該S3バケットに対するリソース変更イベントがEventBridgeに届くようになります。

EB-01-04.png

続いて、EventBridgeルールを作成します。
画面上部の検索窓にeventbridgeと入力し、表示されるAmazon EventBridgeをクリックしてください。

EB-02-01.png

画面左にあるルールをクリックしてください。

EB-02-02.png

イベントバスdefaultのままで、ルールを作成ボタンをクリックしてください。

EB-02-03.png

EventBridgeルールの名前などを入力します。
名前は任意ですが、今回は{ユーザ名}_S3ObjectCreateRuleにしました。
それ以外の値はデフォルトにし、次へボタンをクリックします。

EB-02-04.png

どのようなイベントをトリガーするかを定義するイベントパターンの項目を入力します。
イベントソースには、イベントの発生元の種類を選択します。今回はS3なのでデフォルトで構いません。

EB-02-05.png

サンプルイベント - オプションは必須ではありませんが、テスト用で使用するため設定してみましょう。
サンプルイベントタイプAWSイベントサンプルイベントObject Createdを選択してください。
表示されるJsonはS3バケットにファイルが生成された際に発生するイベントの実体です。
興味があれば、他サービスの場合も確認してみてください。

EB-02-06.png

作成のメソッドはこの後に行うイベントパターンの作成方法を指定します。パターンフォームを使用するを選択してください。

EB-02-07.png

イベントパターンはイベントをトリガーする条件(どのようなサービスで何のイベントが発生したか)を指定します。
イベントパターンの実体はJsonであり、セクション左側の入力に従って右側のイベントパターンが自動入力されます。

まず、イベントソースは先ほど説明したようにイベントの発生元の種類を指定します。今回はAWSのサービスを選択します。
次に、AWSのサービスでトリガーとなるイベントが発生するAWSサービスを指定します。今回はSimple Storage Service(S3)を選択します。
次に、イベントタイプで今回トリガーするイベントの種類を指定します。今回はS3にオプジェクトがアップロードされた時のイベントをトリガーにしたいのでAmazon S3イベント通知を選択します。
次に、具体的にどのイベントをトリガーにするか選択します。ラジオボタンで特定のイベントを選択し、プルダウンをクリックするとイベントが選択できるのでObject Createdを選択してください。

ここまでで、S3バケットにファイルがアップロードされた場合のイベントをキャッチすることはできますが、より条件を厳密にするため以下の設定を行います。
まず、どのS3バケットのObject Createdイベントをトリガーするかをラジオボタンで選択します。特定のバケット (名前別)を選択し、入力欄に作成したS3バケット名を入力してください。

EB-02-08.png

次に、どのディレクトリにファイルをアップロードしたらトリガーするかを指定します。
セクション右側にあるパターンの編集ボタンをクリックしてください。
イベントパターンのJsonが編集できるようになります。

S3バケットの特定のディレクトリ(prefix)にファイルがアップロードされた時をトリガーにしたいので、Jsonのbucketオブジェクトと同階層に以下のJsonオブジェクトを追加します。
今回はuploadsディレクトリをprefixとして指定します。

"object": {
  "key": [{
    "prefix": "uploads/"
  }]
}

EB-02-09.png

次に、イベントパターンの条件を満たすイベントが発生した場合、どのAWSサービスを起動するかをイベントターゲットとして指定します。
ターゲットタイプは起動させるターゲットの種類であり、今回Step Functionsのステートマシンを起動させたいのでAWSのサービスを選択します。
ターゲットの選択では、起動させるサービスについて指定します。今回はStep Functionsステートマシンを選択していただき、2つ目のプルダウンでは自身が作成したステートマシンを選択してください。
実行ロールはEventBridgeにどのような権限を持たせるかをIAMロールで指定します。今回はステートマシン作成時に自動生成されたIAMロールを指定します。(ユーザ名で検索すれば出てくるかと思います)
全て入力したら次へボタンをクリックしてください。

EB-02-10.png

続いて、タグ入力画面ですが、特に入力せず、次へボタンをクリックしてください。

EB-02-11.png

最後、確認画面になります。内容確認したらルールの作成ボタンをクリックしてください。

EB-02-12.png

画面上部に成功メッセージが表示されれば、ルールの作成は完了です。

EB-02-13.png

ステートマシン起動権限追加

EventBridgeからStep Functionsのステートマシンを起動させるため、IAMロールにIAMポリシーを追加します。

画面上部の検索窓にiamと入力し、表示されたIAMをクリックしてください。

EB-03-01.png

左側または中央にあるロールをクリックしてください。

EB-03-02.png

一覧の検索窓にユーザ名を入力し、「EventBridgeの実行ロールで指定した」IAMロールを選択します。

EB-03-03.png

許可タブを選択し、許可を追加プルダウンを選択し、ポリシーをアタッチをクリックしてください。

EB-03-14.png

検索窓にstepと入力し、表示されたAmazonStepFunctionsFullAccessをチェックして、許可の追加ボタンをクリックしてください。

EB-03-15.png

さて、今までIAMロールIAMポリシーなどと言ってきましたが、これらは一体なんでしょうか?
丁寧に説明するとかなりの文量となるため、それぞれを簡単に説明します。

まず、IAMロールです。
IAMロールはAWSのサービス(ステートマシンやEC2インスタンスなど)、AWSアカウントなどに一時的な権限を与える概念です。
一時的というのがポイントであり、これによりセキュアにサービスを実行したり、別アカウントと疎通したりすることができるようになります。
IAMロールはそのアイコンから帽子、某記事から仮面に例えられる場合があります。

次にIAMポリシーです。
IAMポリシーIAMロールIAMユーザに付与する権限を表します。
どのサービスでどのような操作を許可、拒否するかを指定します。

IAMロールについてはbuilders.flashの記事「テクニカルトレーナーと学ぶ AWS IAM ロール」が非常にわかりやすかったので是非ご一読ください。

EventBridge用の信頼ポリシーを追加

EventBridgeかIAMロールに付与された権限を使用できるようにするため信頼ポリシーを追加します。

信頼関係タブを選択し、信頼ポリシーを編集をクリックしてください。

EB-03-04.png

続いて、信頼ポリシーを追加します。既存のStatementオブジェクトに以下のJsonオブジェクトを追加し、ポリシーを更新ボタンを押下してください。

{
    "Effect": "Allow",
    "Principal": {
        "Service": "events.amazonaws.com"
    },
    "Action": "sts:AssumeRole"
}

EB-03-05.png

さて、信頼関係(信頼ポリシー)の追加を行いましたがこれは一体なんでしょうか?簡単に説明します。

信頼関係(信頼ポリシー)とは、IAMロールに付与する設定であり、IAMロールに追加した権限をどのサービスに使用許可するかを指定します。
今回はEventBridgeにStep Functionsのステートマシンの操作権限を与えたかったため、Principal.ServiceにEventBridgeを表すevents.amazonaws.comを指定しました。

EventBridgeルールでステートマシンが起動するか確認

テキストファイルを先ほど作成したフォルダにアップロードしてステートマシンが実行されるか確認します。
作成したフォルダのリンクを選択します。

EB-03-08.png

アップロードボタンをクリックしてください。

EB-03-09.png

ファイルの追加ボタンをクリックし、アップロードするファイル(日本語文章が書かれたファイル)を選択してください。
アップロードボタンをクリックしてください。

EB-03-10.png

画面上部に成功メッセージが表示されればアップロード成功です。

EB-03-11.png

ステートマシンが実行されたか確認します。
ステートマシンの詳細画面の実行履歴を見ると1つ実行され、成功していることがわかりました。

EB-03-12.png

名前のリンクをクリックして、実行の詳細を確認してみましょう。
特にステートマシンの入力がどのようになっているのか確認します。
画面上部の実行の入力と出力からステートマシンの入出力が確認できます。
入力には、先ほどS3バケットにファイルをアップロードした際に発生したイベントに関連する情報が含まれています。
例えば、ファイルがアップロードされたS3バケット名(detail.bucket.name)やアップロードされたファイルのオブジェクトキー(detail.object.key)、ファイルのサイズ(detail.object.size)などです。
これら入力情報をステートマシンのステートで参照し、AWSサービスを呼び出してみましょう。

EB-03-13.png

{
  "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を表示してください。
そして、画面中央のステートマシンにすでにステートがある方は全て削除してください。
以下の状態になっていることを確認してください。

TR-01-03.png

画面左側のアクションタブを選択し、検索窓にgetobjectと入力してください。
GetObjectというステートが表示されるのでそれをスクショの場所にドラッグ&ドロップしてください。

TR-01-04.png

GetObjectのインターフェースを確認します。
GetObjectステートを選択し、画面右側の設定タブを選択します。
APIパラメータに着目してください。
これがAmazon S3のGetObjectAPIのリクエストJsonになります。
指定する項目について簡単に説明します。

項目名 意味
Bucket 取得するオブジェクトを格納したS3バケット名 hogeBucket
Key オブジェクトキー(ファイルパス) test.txt

TR-01-05.png

以上から、BucketにはファイルをアップロードしたS3バケット名、Keyにはアップロードしたファイルのパスを指定すれば良いことがわかります。
また、これら情報はステートマシンの実行でステートマシンの入力となったJsonに含まれています。
Bucketdetail.bucket.nameKeydetail.object.keyです。
これらをGetObjectステートのAPIパラメータに指定すれば良いです。
指定の仕方は前記事のParameterをご一読ください。
今回入力するJsonは以下になります。APIパラメータに上書きしてください。

{
  "Bucket.$": "$.detail.bucket.name",
  "Key.$": "$.detail.object.key"
}

設定を保存し、再度S3バケットにファイルをアップロードさせ、ステートマシンを実行してみましょう。
ステートマシンの入出力の結果は以下のようになります。
出力JsonのBodyにファイルに記載された文字列が表示されていることがわかります。
この文字列を以降のAmazon Translate、Amazon ComprehendのAPIパラメータに渡します。

TR-01-06.png

英訳機能を追加する

Amazon Translateの起動権限追加

ステートマシンに付与されているIAMロールにIAMポリシーを付与し、Amazon Translateのサービスを呼び出せるようにします。
前準備①と同様の手順でIAMポリシーを追加します。

前準備①ポリシーをアタッチをクリックした後の画面で、検索窓にtranslateと入力し、表示されたTranslateFullAccessをチェックして、許可の追加ボタンをクリックしてください。

TR-01-01.png

ポリシーの一覧で以下のようにTranslateFullAccessが表示されていれば追加成功です。

TR-01-02.png

Amazon Translateの翻訳APIの実行

ステートマシンにAmazon Translateで翻訳を行うステートを追加し、実行してみます。
実行方法については翻訳のほか、感情分析も同様に実施する必要があるため、1つずつ処理を実行すると処理時間がかかる可能性があります。
そのため、翻訳と感情分析は並列して実行させます。

画面左側のフロータブを選択し、Parallelステートを画面中央のGetObjectEndの間にドラッグ&ドロップしてください。
このParallelステートの箱内に配置されるステートは並列実行されます。すべての処理が終了したら次のステートに遷移します。

TR-02-01.png

続いて、Amazon Translateの翻訳サービスを行うステートを追加します。
画面左側のアクションタブを選択し、検索窓にtranslateと入力してください。
TranslateTextというステートが表示されるのでそれをスクショの場所にドラッグ&ドロップしてください。

TR-02-02.png

TranslateTextのインターフェースを確認します。
TranslateTextステートを選択し、画面右側の設定タブを選択します。
APIパラメータに着目してください。
これがAmazon TranslateのTranslateTextAPIのリクエストJsonです。
出力されているのは必須項目だけですが、非必須項目も指定できます。
詳細は公式ドキュメント Request Syntaxを参照ください。
指定する項目について簡単に説明します。

項目名 意味
SourceLanguageCode 翻訳元文章の言語コード ja
TargetLanguageCode 翻訳先文章の言語コード en
Text 翻訳対象の文字列 こんばんは!

TR-02-03.png

以上から、今回は日本語文章を英語翻訳するためにSourceLanguageCodejaTargetLanguageCodeenを指定すれば良いことがわかります。
また、Text情報はファイルから文字列を取り出すGetObjectステートの出力となったJsonのBodyに含まれています。
これらをTranslateTextステートのAPIパラメータに指定すれば良いです。
今回入力するJsonは以下になります。APIパラメータに上書きしてください。

{
  "SourceLanguageCode": "ja",
  "TargetLanguageCode": "en",
  "Text.$": "$.Body"
}

設定を保存し、再度S3バケットにファイルをアップロードさせ、ステートマシンを実行してみましょう。
ステートマシンの入出力の結果は以下のようになります。
出力JsonのTranslatedTextに翻訳された文字列が出力されていることがわかります。

TR-02-04.png

感情分析機能を追加する

Amazon Comprehendの起動権限追加

ステートマシンに付与されているIAMロールに権限を付与し、Amazon Comprehendのサービスを呼び出すことができるようにする必要があります。
前準備①と同様の手順でIAMポリシーを追加します。

前準備①ポリシーをアタッチをクリックした後の画面で、検索窓にcomprehendと入力し、表示されたComprehendFullAccessをチェックして、許可の追加ボタンをクリックしてください。

CO-01-01.png

ポリシーの一覧で以下のようにComprehendFullAccessが表示されていれば追加成功です。

CO-01-02.png

Amazon Comprehendの感情分析APIの実行

ステートマシンにAmazon Comprehendで感情分析を行うステートを追加し、実行してみます。
画面左側のアクションタブを選択し、検索窓にcomprehend detectsentimentと入力してください。
DetectSentimentというステートが表示されるのでそれをスクショの場所にドラッグ&ドロップしてください。

CO-02-01.png

DetectSentimentのインターフェースを確認します。
DetectSentimentステートを選択し、画面右側の設定タブを選択します。
APIパラメータに着目してください。
これがAmazon ComprehendのDetectSentimentAPIのリクエストJsonです。
詳細は公式ドキュメント Request Syntaxを参照ください。
指定する項目について簡単に説明します。

項目名 意味
LanguageCode 分析対象文章の言語コード ja
Text 分析対象の文字列 こんばんは!

CO-02-02.png

以上から、今回は日本語文章を感情分析するためにLanguageCodejaを指定すれば良いことがわかります。
また、Text情報はファイルから文字列を取り出すGetObjectステートの出力となったJsonのBodyに含まれています。
これらをDetectSentimentステートのAPIパラメータに指定すれば良いです。
今回入力するJsonは以下になります。APIパラメータに上書きしてください。

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

設定を保存し、再度S3バケットにファイルをアップロードさせ、ステートマシンを実行してみましょう。
ステートマシンの入出力の結果は以下のようになります。
出力JsonのDetectSentimentに感情分析の結果(+TranslatedTextの結果)が出力されていることを確認してください。

CO-02-03.png

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0