【AWS Lambda初級編】Lambda関数を使ってサーバレスで翻訳Web APIを構築してみました!

今回はLambda関数を使って簡単な翻訳Web APIを作成したのでまとめてみました。これからLambdaを触っていきたい、サーバレスアーキテクチャに興味があるという方におすすめの記事になっています。
2021.11.09

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

どうもさいちゃんです。

今回はAWS Lambdaを使っていきたいと思います!

Lambdaを少しだけ触ってみたことはあったんですが、もう少し踏み込んで簡単なLambda関数を作ってみよう!ということで、Lambdaを使ってサーバレスで翻訳Web APIを構築してみました。

まずは早速Lambdaの簡単な概要からです!

Lambdaの概要

Lambdaといえばサーバレスでコードを実行できるサービスですよね。

Lambda はサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。Lambda は可用性の高いコンピューティングインフラストラクチャでコードを実行し、コンピューティングリソースの管理をすべて担当します。
引用元 AWS Lambda とは

AWS公式からはこのような説明がされています。

簡単に言うとLambdaは処理をコードで書いておくことで処理の自動実行ができるサービスです。

Lambdaをうまく使うことでリアルタイムな処理やバックエンド処理を自動で行うことが可能になっています。

Lambda APIを使用してLambda関数を呼び出したり、他のサービスのイベントをトリガーに処理を実行することが可能です。

Lambdaのメリット

・保守運用に手間がかからない

Lamubdaはマネージド型サービスです。マネージド型サービスはAWS側が実行環境を用意してくれているため、利用者はOSやフレームワークのことを気にせずに開発に専念ができます。

・コスト削減

Lambdaは実行時間に対して課金がされるしくみになっています。EC2は稼働中はずっとコストがかかるしくみになっているため、常に稼働したいプログラムでない限りLambdaのほうがコストを削減できます。

Lambdaがサポートする言語

Lambdaがサポートする言語は次の通りです。

AWS Lambda は、ネイティブでは、Java、Go、PowerShell、Node.js、C#、Python、Ruby のコードをサポートしています。また、関数の作成にその他のプログラミング言語を使用できるようにするための Runtime API を提供しています。
引用元 AWS Lambda よくある質問

基本的な言語はサポートされています。今回はpythonを使ってコードを書いていきます。

今回の目標

今回はLambdaとを使った簡単なアーキテクチャを設計していきます。

参考にしたのはAWS公式から出ている無料ハンズオン動画です。1時間ほどで動画視聴ができますが、少し古い動画(2019年リリース)となっているので、AWS公式ウェブサイトを確認しながら構築していきました!

構成図はこんな感じです。

やりたいこととしては

  • リクエストをAPIゲートウェイからlambda→翻訳サービス「Amazon Translate」を呼び出して翻訳を行う
  • 翻訳されたモノを再度Lambda経由でAPIゲートウェイに返しレスポンスとして返す。

という感じになります。それではさっそく作っていきます。

Amazon TranslateをLambdaから呼び出す

コードを編集

まずはLambdaを使ってAmazon Translateを呼び出し日本語を英語に翻訳できるようにしていきます。

今回はテンプレートを使わずに一から作成していきます。まずは、Translateを呼び出すためにコードをこのように書き換えていきます。

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

こちらのコードはPython SDKのAPI リファレンスを参考にしています。input_textに入った日本語(ja)を英語(en)に翻訳をしています。

ロールの編集

これだけではAWS Translateを呼び出すことができないのでさらにこちらの関数にアッタッチされているロールを編集していきます。

ここで関数の一般設定から関数作成時に割り当てられたロールを編集していきます。元々ついているポリシーに追加して「TranslateFullAccess」のポリシーをロールにアタッチしてTranslateへのアクセス権限を付与していきます。

これで設定→アクセス権限→リソースの概要の欄にAmazon Translateが出てきました!

この様態でテストを実行していきます。

テストは成功です。これでAmazon Translateを呼び出すところはクリアできました。

API Gatewayの設定

APIの作成

今回はREST APIを使っていきます。APIの名前はStudy-TranslateAPIとします。

リソースとGETメソッドの追加

APIを作成したら「Translate」というリソースを追加し、その中にGETメソッドの追加をしていきます。

統合タイプにはLambda関数を設定し、先ほど作った「Study-TranslateFunction」を選択します。
Lambdaプロキシ統合の使用にチェックを入れAPIGatewayからのInput/Outputをそのままパススルーする設定にしていきます。Lambda関数に権限を追加してよいか?とのポップアップもOKで大丈夫です。

メソッドリクエストでクエリパラメーターの設定

メソッドリクエストの中のURLパラメーターを編集していきます。

input_textを入力し必須に設定します。

Lambda関数の編集

Lambda関数を再度編集していきます。こちらではAWSの公式ドキュメントを参考に関数を編集していきます。

import json
  import boto3
  
  translate = boto3.client(service_name='translate')
  
  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')
  
      return {
          'statusCode': 200,
          'body': json.dumps({
              'output_text': output_text
          }),
          'isBase64Encoded': False,
          'headers': {}
      }

bodyの下にisBase64Encodedとheadersを足していき、input_textについても編集を加えてあります。

続いてテストイベントも変更していきます。

これでイベントから文字列を受け取ることができるようになります。

これでテストを実行してみるとしっかりHiが返って来ていることが分かります。

APIのデプロイ

ここまで来たらAPIをデプロイしてみます。

しかしこのままURLにアクセスしてもinput_textに文字列が渡されていないため、エラーが出ます。そこで、URLの後ろに文字列を渡すために「?input_text=こんばんは」を付けてみます

するとしっかりGood eveningが表示されています。

触ってみた感想

Lambda関数はコードを書いたり様々なサービスと連携させたりと難しそうなイメージがあったんですが意外と簡単に翻訳Web APIができちゃいました。

AWS公式からは、サービスを知るのにちょうどいいハンズオンがほかにもたくさん出ているので色々触りながらもっと学んでいこうと思います。