AWS LambdaからAmazon Translateを呼び出してみた

## はじめに
本記事は以下の記事の続編です。

https://qiita.com/uccy/items/aaa0d9931095f6e05ba2

前回はLambdaを単体で動かすところまで実施しましたので、今回は**LambdaからTranslateを呼び出してみます**。

今回のゴール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/0feb7194-d67b-1fd3-63f5-16103f1c76dc.png)

参考にしたハンズオンはこちら。

https://pages.awscloud.com/JAPAN-event-OE-Hands-on-for-Beginners-Serverless-1-2022-confirmation_422.html

## やってみた
マネジメントコンソールにアクセスし、前回作成したLambda関数(translate-function)のページに行きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/ad4f4d01-1395-084f-2434-c0e764dd04e5.png)

Lambda関数からTranslateを呼び出すためにコードを修正します。
コード修正には、以下のページが参考になりますので、開いてみましょう。

https://aws.amazon.com/jp/sdk-for-python/

Boto3は、PythonでAWSサービスとやり取りするためのライブラリで、AWSサービスに対するAPI呼び出しができます。
「APIリファレンス」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/a63d14e0-6e00-9f3e-aa06-06d8f63f64c2.png)

ページ内で「Translate」を検索し、ページにアクセスします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/cbaef594-54b1-c99e-14d4-cc5168af24e1.png)

赤枠で囲まれたソースコードをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/05a71ed8-25d9-831c-f3e5-983b40589b7c.png)

```python:ソースコード
import boto3

client = boto3.client('translate')
```

Lambdaのページに戻り、関数を修正します。
修正前の関数は以下です。
```python:修正前のLambda関数
import json
import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    
    logger.info(event)    
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

```
まずはロギングに関する記述を削除します。
```python:
import json

def lambda_handler(event, context):
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```
先程コピーしたソースを2行目に貼り付けます。
clientという変数が分かりにくいため、translateに書き換えました。
```python:
import json
import boto3

translate = boto3.client('translate')
def lambda_handler(event, context):
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

AWS SDK for Pythonのページに戻ります。
少し下にスクロールすると「translate_text」があるのでクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/b1cb364b-3237-ecde-a3f3-16044e561dcb.png)

Request Syntaxをコピーします。
Translateでテキストを翻訳するときのサンプルコードです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/ff1dcedb-df59-852e-d6f2-3aae7cdfbe3f.png)

lambda関数に張り付けます。
```python
import json
import boto3

translate = boto3.client('translate')

def lambda_handler(event, context):
    
    response = client.translate_text(
    Text='string',
    TerminologyNames=[
        'string',
    ],
    SourceLanguageCode='string',
    TargetLanguageCode='string',
    Settings={
        'Formality': 'FORMAL'|'INFORMAL',
        'Profanity': 'MASK',
        'Brevity': 'ON'
    }
)

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```

これを以下のように修正します。
・インデントを整えます。
・Translateにinputするテキスト(input_text)を追加します。
・response変数の右辺のclientはtranslateに合わせこみます。
・不要な個所を削除します。
・SourceLanguageCodeを'ja'(日本語)、TargetLanguageCodeを'en'(英語)にします。
・翻訳結果を格納するoutput_text変数を追加し、returnで出力するようにします。
```python
import json
import boto3

translate = boto3.client('translate')

def lambda_handler(event, context):
    
    input_text = '私はスープが大好きです。毎日飲みます。'
    
    response = translate.translate_text(
        Text=input_text,
        SourceLanguageCode='ja',
        TargetLanguageCode='en'
    )

    output_text = response.get('TranslatedText')

    return {
        'statusCode': 200,
        'body': json.dumps({
            'output_text': output_text   
        })
    }
```

今回は日本語→英語の翻訳としました。
サポートされている言語は以下のページをご参照下さい。

https://docs.aws.amazon.com/ja_jp/translate/latest/dg/what-is-languages.html

コード修正後、「Deploy」をクリックします。
※画像はクリックした後のスクショなのでDeployボタンがグレーになってます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/b8133ed0-0977-46bd-bdb6-70d6a4a82389.png)

コードの修正は完了しましたが、このままでは実行しても失敗します。
Lambda関数がTranslateを呼び出す権限を持っていないためです。
なので権限を追加します。
「設定」タブをクリックし、ロールをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/c19dc1cf-e2ed-b19a-4817-2e80b3dc334a.png)

「許可を追加」をクリックし、「ポリシーをアタッチ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/634ec972-9a5b-539a-3a3e-f2ceb20cf561.png)

「translate」で検索します。
今回は「TranslateFullAccess」を選択します。
従来であれば、事故が起きないように必要な最小権限をアタッチするのが望ましいです。
「許可を追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/fb369970-d3b2-1991-42cc-7d9adc1b7dda.png)

ポリシーがアタッチされました。
これでLambda関数がTranslateを呼び出すことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/60a73882-b0db-7dab-dc54-d2e42ea25770.png)

Lambdaのページに戻り、「テスト」タブをクリックします。
前回記事で作成したtestイベントを選択し、「テスト」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/71c2d122-65f5-6564-4a88-5550e5914eeb.png)

成功したっぽいです。
詳細を見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/5ee0f4a0-24aa-5a61-19dc-cd1e387c8064.png)

inputしたテキスト(私はスープが大好きです。毎日飲みます。)が英語に翻訳されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/99dd39a0-2320-42c7-f9a9-8d2b20e423ff.png)

次は違うテキストを試してみます。
「私が一番好きなコナン映画は天国へのカウントダウンです。」としました。
コード修正後、「Deploy」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/c3f26706-cb9f-3336-07e1-bfaa09ba84a0.png)

再度テストします。
しっかり英語になっていますね。
カウントダウンがどこに行ったのか分かりませんが、コナンをKONANではなく、CONANとしているのは偉いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/d955be6a-ed03-4e5e-1c1f-a41908838a1f.png)

## おわりに
今回はLambda関数からTranslateを呼び出して遊んでみました。
boto3の素晴らしさを学ぶことができました！
次回はAPI Gatewayで遊んでみます！

![AdobeStock_166316779.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3848705/827530ef-cba6-2576-5819-372e739c3b9e.jpeg)