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

# はじめに

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

- [AWSサーバレスアーキテクチャで文章解析サービスを構築する　その１](https://qiita.com/kenryo/private/a47eaf8195e30f6a8182)
- AWSサーバレスアーキテクチャで文章解析サービスを構築する　その２
- [AWSサーバレスアーキテクチャで文章解析サービスを構築する　その３](https://qiita.com/kenryo/private/7fb84b4f736b3d9e29d1)

構築するアーキテクチャ、使用するサービスなどについては[第１回目の記事](https://qiita.com/kenryo/private/a47eaf8195e30f6a8182)を参照ください。

:::note warn
注意①
本資料内スクショのAWS管理コンソールのデザインは資料作成当時のものです。
デザインは今後変更される可能性があり、スクショと差異がある場合がありますのでご了承ください。
:::

:::note warn
注意②
今までのハンズオン（[前提条件・知識](#前提条件・知識)に記載）で実施した手順は基本省略して記載するのでご了承ください。
複雑な手順等は例外として記載する場合があります。
:::

:::note warn
注意③
ハンズオンで作成したリソースについてはハンズオン終了後、各自削除をお願いします。
:::

## ゴール

- 複数のAWSサービスを並列実行するStep Functionsのステートマシンが構築できる
- IAMロール、IAMポリシー、信頼ポリシーについてイメージしていただく
- Amazon EventBridgeによるイベントのハンドリングを理解していただく

## 前提条件・知識

- [前回ハンズオン](https://qiita.com/kenryo/private/a47eaf8195e30f6a8182)を実施していること

## 使用サービス紹介

本ハンズオンで触るAWSサービスを説明します。
その他サービスについては以降その都度説明いたします。

### Amazon S3(Simple Storage Service)

容量無制限のオブジェクトストレージサービスです。厳密には違いますがオブジェクトはファイルと思って構いません。
DropBoxやGoogle Driveみたいなものをイメージしてください。
このストレージは99.999999999%の高い耐久性（データが損失しない確率）を持ち、アクセス制御、自動削除機能なども多数提供します。
また、他のAWSサービスとの連携も容易に可能です。
本サービスは`2006年3月`に一般公開されました。

以下の図は[高い可用性と耐久性のオブジェクトストレージ。Amazon S3 をグラレコで解説](https://aws.amazon.com/jp/builders-flash/202202/awsgeek-s3/?awsf.filter-name=*all)より

![yougo_s3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/6cb06c88-08c7-5523-43ee-2434df7ab716.png)

#### 用語

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

### Amazon EventBridge

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

以下の図は[サーバーレスのイベントバスって何 ? Amazon EventBridge をグラレコで解説](https://aws.amazon.com/jp/builders-flash/202009/awsgeek-eventbridge/?awsf.filter-name=*all)より

![yougo_eventbridge.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/aa0a13ee-2ce1-62dc-caec-94abb9f5c1e9.png)

#### 用語

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

### AWS Step Functions

[前記事参照](https://qiita.com/kenryo/private/a47eaf8195e30f6a8182#step-functions%E3%81%A8%E3%81%AF)

以下の図は[アプリのワークフローを視覚的に構成。 AWS Step Functions をグラレコで解説](https://aws.amazon.com/jp/builders-flash/202208/awsgeek-stepfunctions/?awsf.filter-name=*all)より

![yougo_stepfunctions.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/5055284a-4512-cebc-a758-20d9c63df48a.png)

### Amazon Translate

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

![job_english_tsuuyaku.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/e738d3ae-4592-82a7-d40d-7e8b13578836.png)

### Amazon Comprehend

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

以下の図は[機械学習の知識ゼロでもテキストデータを分析。Amazon Comprehend をグラレコで解説](https://aws.amazon.com/jp/builders-flash/202107/awsgeek-comprehend/?awsf.filter-name=*all)より

![yougo_comprehend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/f4fc2488-383c-5065-42ba-2a3e7f8da5e0.png)

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

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

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

![handson_system.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/c93bc230-6fee-7920-b869-f50d590cf6eb.png)

## ハンズオン

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

#### S3バケットを作成する

翻訳対象のテキストファイルをアップロードするS3バケットを作成します。
[前回の「S3バケットの作成」](https://qiita.com/kenryo/private/a47eaf8195e30f6a8182#s3%E3%83%90%E3%82%B1%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E6%88%90)を実行してください。

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

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

![EB-03-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/cf3eaa4d-6a5a-f354-f4ca-f25ac4587186.png)

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

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

とりあえず、入力をそのまま返却するステートマシンを作成します。
[前回の「ステートマシンの作成」](https://qiita.com/kenryo/private/a47eaf8195e30f6a8182#%E3%82%B9%E3%83%86%E3%83%BC%E3%83%88%E3%83%9E%E3%82%B7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90)を実行してください。

![EB-03-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/3c236928-6f43-9fb4-7537-2407ffbfdb23.png)

#### EventBridgeルールを作成する

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

![EB-01-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/97f3ab51-35ca-dfdb-c35a-e21e3db10c74.png)

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

![EB-01-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/a55d9c63-0d52-dbcd-ce50-9b97476321b0.png)

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

![EB-01-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/a1f9c881-029e-b3a5-09a7-fd49ec674194.png)

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

![EB-01-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/1e71cd04-e2ea-700c-119a-781c1ddbb01a.png)

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

![EB-02-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/5c4a2676-46ff-0afe-44b5-655e4e6b7c8f.png)

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

![EB-02-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/40d677e7-cea4-8434-cd2f-7e41a0ac15db.png)

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

![EB-02-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/7c3c1e6c-e795-b2e1-865c-4d7f47746c12.png)

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

![EB-02-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/d4482942-cdc7-54bc-4d9c-48c4f0dec90c.png)

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

![EB-02-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/b234d073-f835-2544-29c1-4e819432115a.png)

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

![EB-02-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/55523e23-f8a5-e2c1-bda3-f5497b4dabe1.png)

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

![EB-02-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/bd46726e-d83e-95ce-eafa-932159d56aa8.png)

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

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

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

![EB-02-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/bb1e765e-fb56-0cf0-d8e7-cc32649c9157.png)

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

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

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

![EB-02-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/1b25f692-5631-1306-0b29-660d40476399.png)

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

![EB-02-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/382bdd70-54b8-a50b-281f-00c35848e468.png)

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

![EB-02-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/9e4b2f38-f267-9c7a-5367-7c6a94529d55.png)

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

![EB-02-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/96156c39-e06f-00ea-e400-efdfcbe70c70.png)

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

![EB-02-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/90d27d51-c4c1-cdd3-1888-0bc7404bfadf.png)

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

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

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

![EB-03-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/e783a7b8-4111-53f7-ac74-c9f061709f52.png)

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

![EB-03-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/a9f9a3b4-a410-db3e-cdd7-e2b3ef4afd45.png)

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

![EB-03-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/25b3da8c-7d06-fb84-9b31-12ecd78090ec.png)

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

![EB-03-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/82909fb4-f4fd-233e-87e9-a9f9280e1da6.png)

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

![EB-03-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/b39a56a0-bced-731a-b447-4398f93f7a2d.png)

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

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

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

IAMロールについては[builders.flashの記事「テクニカルトレーナーと学ぶ AWS IAM ロール」](https://aws.amazon.com/jp/builders-flash/202303/learn-iam-role/?awsf.filter-name=*all)が非常にわかりやすかったので是非ご一読ください。

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

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

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

![EB-03-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/2afd46fc-cca7-2e5f-5f53-6e40c4fd775b.png)

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

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

![EB-03-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/68ae7bbf-8fa6-100f-22a4-2339b75550a0.png)

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

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

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

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

![EB-03-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/833f60f1-9390-bbba-b99c-b11c3b07f031.png)

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

![EB-03-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/11741a98-d8a3-3763-ff6e-50c56cc8d954.png)

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

![EB-03-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/0404f00f-9c73-f780-f71b-5942b4bf459e.png)

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

![EB-03-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/4730edfe-c0d3-3a33-7119-4291550a79d6.png)

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

![EB-03-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/93583bad-8004-f619-fa7d-805c8a5b6b58.png)

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

![EB-03-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/334950b3-64f5-02bb-eef0-a2e40d216ae0.png)

```json
{
  "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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/4dcae8c7-873e-7290-9fef-8df174e84b5b.png)

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

![TR-01-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/f50b2c8d-d52b-c5f6-46cd-bd37c70fa0b7.png)

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

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

![TR-01-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/8f615c2b-df87-ef4a-769a-fca13e970291.png)

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

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

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

![TR-01-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/572fbf8e-2b6e-e488-1588-23ba7ee7237e.png)

### 英訳機能を追加する

#### Amazon Translateの起動権限追加

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

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

![TR-01-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/1b70a970-8d0f-2df8-aacb-5b85b49c6282.png)

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

![TR-01-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/5fe9a674-9632-01b8-229a-dddbaf2239db.png)

#### Amazon Translateの翻訳APIの実行

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

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

![TR-02-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/5a67e2dc-5ee7-bbf8-97ca-febda7464fcc.png)

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

![TR-02-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/bed20d73-4d10-3450-bb44-ac8286900564.png)

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

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

![TR-02-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/eb6a1d93-f5e6-199e-083f-f6d00976834c.png)

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

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

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

![TR-02-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/2626d729-7d8a-17c2-13a5-3dbc6c9ca14b.png)

### 感情分析機能を追加する

#### Amazon Comprehendの起動権限追加

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

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

![CO-01-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/3a5e8538-462f-afcd-aa27-7b4e4679ebe8.png)

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

![CO-01-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/5698eaa2-9af5-d993-ba73-38fc9ad62d1f.png)

#### Amazon Comprehendの感情分析APIの実行

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

![CO-02-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/f47fccd8-5944-633d-86e1-ceef6aae86d4.png)

`DetectSentiment`のインターフェースを確認します。
`DetectSentiment`ステートを選択し、画面右側の`設定`タブを選択します。
`APIパラメータ`に着目してください。
これがAmazon Comprehendの`DetectSentiment`APIのリクエストJsonです。
詳細は[公式ドキュメント Request Syntax](https://docs.aws.amazon.com/comprehend/latest/APIReference/API_DetectSentiment.html)を参照ください。
指定する項目について簡単に説明します。

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

![CO-02-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/7e8e6058-15b2-3c2e-fc92-48ff9fc41c20.png)

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

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

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

![CO-02-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545707/8b54e3ce-90bf-5255-4f32-d1dc65fd1cc7.png)

## 参考

- https://docs.aws.amazon.com/ja_jp/step-functions/latest/dg/tutorial-cloudwatch-events-s3.html
- https://www.irasutoya.com/
- https://aws.amazon.com/jp/builders-flash/