LoginSignup
0
0

More than 1 year has passed since last update.

【AWS初学者向け】翻訳WEB APIを作成してみた(ハンズオン)

Last updated at Posted at 2021-11-28

注釈

こちらに移動しました。

はじめに

AWSハンズオン資料集の中から「サーバーレスアーキテクチャで翻訳 Web API を構築する」を試してみて結構楽しかったので

  1. AWS初学者向けに構築フロー
  2. つまずきポイント
  3. 個人的に修正してみた箇所

の3点を共有します。

上記、URLからAWS初学者の方はぜひトライしてみてください。

#参考ドキュメント

#構成
スクリーンショット 2021-11-14 15.12.10.png(ハンズオン資料より抜粋)

#####ブラウザで翻訳語の文字列が返ってくれば完成
スクリーンショット 2021-11-28 12.25.55.png
スクリーンショット 2021-11-28 12.26.00.png

#LambdaからAWS Translateを呼び出す
LambdaからAWS Translateを呼び出すためには、python SDK のboto3を使用します。

公式ドキュメントからtranslateの項目を確認し、使い方を参照します。

スクリーンショット 2021-11-28 12.03.24.png

スクリーンショット 2021-11-28 12.04.18.png

必須パラメータは、下記の通り

response = client.translate_text(
    Text='string',
    SourceLanguageCode='string',
    TargetLanguageCode='string',
    }
)

レスポンスは下記のように返ってくるとのこと
スクリーンショット 2021-11-28 12.54.37.png

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
        }),
    }

#API Gatewayを設定し、Lambdaのソースコードを修正する

アクションからリソースの作成→メソッドの作成を行う
スクリーンショット 2021-11-28 13.04.33.png

スクリーンショット 2021-11-28 13.06.04.png

クエリ文字列パラメータの設定
スクリーンショット 2021-11-28 13.10.43.png

API Gateway統合レスポンスで検索すると、
Lambda プロキシ統合で、Lambda 関数は以下の形式で出力を返す必要があることがわかります。

{
    statusCode: "...",            // a valid HTTP status code
    headers: { 
        custom-header: "..."      // any API-specific custom header
    },
    body: "...",                  // a JSON string.
    isBase64Encoded:  true|false  // for binary support
}

###コード修正


import boto3

translate = boto3.client('translate')

input_text = event['queryStringParameters']['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
        }),
        'isBase64Encoded': False,
        'headers': {}
    }

#DynamoDBに入力テキストと変換後テキストを格納する

事前にテーブルを作成する必要あり

修正箇所

import datetime

dynamodb = boto3.resource('dynamodb')
translate_history_table = dynamodb.Table('tranlate-history')

translate_history_table.put_item(
        Item = {
            'timestamp': datetime.datetime.now().strftime("%Y%m%d%H%M%S"),
            'input_text': input_text,
            'output_text': output_text
        }
    )

#Lambda関数全体

import json
import boto3
import datetime

translate = boto3.client('translate')

dynamodb = boto3.resource('dynamodb')
translate_history_table = dynamodb.Table('translate-history')

def lambda_handler(event, context):
    
    input_text = event['queryStringParameters']['input_text']

    response = translate.translate_text(
        Text=input_text,
        SourceLanguageCode='ja',
        TargetLanguageCode='en'
    )
    output_text = response.get('TranslatedText')
    
    translate_history_table.put_item(
        Item = {
            'timestamp': datetime.datetime.now().strftime("%Y%m%d%H%M%S"),
            'input_text': input_text,
            'output_text': output_text
        }
    )
    
    return {
        'statusCode': 200,
        'body': json.dumps({
            'output_text': output_text
        }),
        'isBase64Encoded': False,
        'headers': {}
    }

#つまずきポイント

https://*******.execute-api.ap-northeast-1.amazonaws.com/Stage/translate?input_text=こんにちは

スクリーンショット 2021-11-28 14.44.35.png

あれ、返ってこない、、、

####結論:dynamoDBへの実行ロールを付与し忘れ
スクリーンショット 2021-11-28 14.51.58.png

####余談
api gatewayは、作成するときに自動的にロール付与してくれたな。。
スクリーンショット 2021-11-28 14.54.52.png

#個人的に工夫した点

####任意のステータスコードを返すようにLambda関数にエラーハンドリングを実装

import json
import boto3
import datetime
import logging

translate = boto3.client('translate')

dynamodb = boto3.resource('dynamodb')
translate_history_table = dynamodb.Table('tranlate-history')

def lambda_handler(event, context):
    
    input_text = event['queryStringParameters']['input_text']

#追加箇所
    try:
        response = translate.translate_text(
            Text=input_text,
            SourceLanguageCode='ja',
            TargetLanguageCode='en'
        )
    except Exception :
        raise ExtendException(400, "Bad Request")

        
    output_text = response.get('TranslatedText')
    
    translate_history_table.put_item(
        Item = {
            'timestamp': datetime.datetime.now().strftime("%Y%m%d%H%M%S"),
            'input_text': input_text,
            'output_text': output_text
        }
    )
    
    return {
        'statusCode': 200,
        'body': json.dumps({
            'output_text': output_text
        }),
        'isBase64Encoded': False,
        'headers': {}
    }

#追加箇所
class ExtendException(Exception):
    def __init__(self, statusCode, description):
        self.statusCode = statusCode
        self.description = description

    def __str__(self):
        obj = {
            "statusCode": self.statusCode,
            "description": self.description
        }
        return json.dumps(obj)

#まとめ
SAA資格勉強での知識しかなかった私にはとても有用なハンズオンでした。
次は、SAMでデプロイの自動化を実装したいと思います。

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