はじめに
本記事は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のGetObject
APIのリクエスト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のTranslateText
APIのリクエスト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のDetectSentiment
APIのリクエストJsonです。
詳細は公式ドキュメント Request Syntaxを参照ください。
指定する項目について簡単に説明します。
項目名 | 意味 | 例 |
---|---|---|
LanguageCode | 分析対象文章の言語コード | ja |
Text | 分析対象の文字列 | こんばんは! |
以上から、今回は日本語文章を感情分析するためにLanguageCode
はja
を指定すれば良いことがわかります。
また、Text
情報はファイルから文字列を取り出すでGetObject
ステートの出力となったJsonのBody
に含まれています。
これらをDetectSentiment
ステートのAPIパラメータに指定すれば良いです。
今回入力するJsonは以下になります。APIパラメータに上書きしてください。
{
"LanguageCode": "ja",
"Text.$": "$.Body"
}
設定を保存し、再度S3バケットにファイルをアップロードさせ、ステートマシンを実行してみましょう。
ステートマシンの入出力の結果は以下のようになります。
出力JsonのDetectSentiment
に感情分析の結果(+TranslatedText
の結果)が出力されていることを確認してください。