ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

サーバレスハンズオンに参加しました!

はじめまして
クラウドインテグレーション事業部 ゆきりん こと ゆきりんです。
2019年9月からフォージビジョンにエンジニアとしてジョインしました!
今月(2020/5)でエンジニア歴2年目が終わるところです。

今日は、少し前のお話になってしまうのですが、
今回は以前参加した JAWS-UG 初心者支部&千葉支部サーバレスハンズオン
ハンズオン内容+わたしが詰まったところを書こうと思います。

参加したハンズオン

jawsug-bgnr.connpass.com

ハンズオン手順

AWS Japan 金澤さんの手順が大変わかりやすかったです!
speakerdeck.com

アジェンダ

  1. AWS Lambda を使って英訳をする
    • Lambda Function を作成しHello,World!と表示する
    • Lambda Function を修正し Amazon Translate と連携する
  2. 翻訳 web API を作る
    • 外部からでも実行できる Web API を作る
  3. 完走した感想

1. AWS Lambda を使って英訳をする

Lambda Function を作成しHello,World!と表示する

  • 関数の作成

まずは Hello,World を表示させるために、
マネジメントコンソールから Lambda を選択し、関数の作成を行いました。

関数名     : 任意の名前
ランタイム : Python 3.8
IAM ロール : 基本的な Lambda アクセス権限で新しいロールを作成

"一から作成" を選択すると Hello from Lambda! と出力されるコードが
元から記載されていました!

import json

def lambda_handler(event, context):
    # TODO implement
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
  • テストイベントの作成と Lambda の実行

新しいテストイベントを作成します。

● 新しいテストイベント
イベントテンプレート : hello-world
イベント名 : 任意の名前

テストイベントの作成を選択すると表示される json ファイルの中身は
特に変更なく、そのままで問題ないようです。
保存したのちにテストを実行すると・・・きました、Hello World です!

Response:
{
  "statusCode": 200,
  "body": "\"Hello from Lambda!\""
}

Lambda Function を修正し Amazon Translate と連携する

  • Lambda 実行用 IAM ロールの権限追加

続けて、Lambda Function の修正です。
Lambda にアタッチする IAM ロールを修正します。

今作成した関数内 "アクセス権限" タブからロール名を選択し
IAM のサービスページへ遷移後、以下の権限を追加します。

追加する権限 : TranslateFullAccess
  • 関数コードの修正

Lambda 関数コードへ戻り、中身のソースコードを以下のように編集します。
この時点ではハードコーディングというか
翻訳できているかの確認ポイントのような感じです。

import json
import boto3

def lambda_handler(event, context):

    translate = boto3.client('translate')
    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
        })
    }

実行!できました!

Response:
{
  "statusCode": 200,
  "body": "{\"output_text\": \"- Okay?\"}"
}

input_text = で定義されている "順調ですか?"の部分を変更し、
遊ぶことができるようです!ステキ=͟͟͞͞( ε:)

2. 翻訳 web API を作る

外部からでも実行できる Web API を作る

  • 関数コードの修正
    関数のコードを以下のように修正します。
import json
import boto3

def lambda_handler(event, context):

    translate = boto3.client('translate')
    input_text = event['queryStringParamaters]['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
        })
    }

input_text を API Gateway のイベントから
クエリストリングパラメータとして渡してあげるように変更しました。
ちなみに、この時点で Lambda のテストを実行すると
渡されているパラメータがないので Error が返ってきます!一旦無視!

  • API の作成
    API を新規で作成していきます。
API タイプ : REST API
API 名 : 任意の名前
説明 : 任意
エンドポイントタイプ : リージョン
  • リソースの作成
    適当なリソース名で作成します。
    リソースパスも特に変更ありません。
リソース名 : 任意の名前
リソースパス : 変更なし
  • メソッドの作成
    続いて、メソッドを作成します。
    先ほどから使用している Lambda 関数と、GET メソッドを紐づけます。
統合タイプ : Lambda 関数
Lambda プロキシ統合の利用 : 有効
Lambda リージョン : 作成した Lambda Function と同じリージョン
Lambda 関数 : 作成した Lambda Function 名
デフォルトタイムアウトの使用 : 有効
  • API のデプロイ
    ここまできたらあと少しです!
    続いて、API をデプロイします。
デプロイされるステージ : 新しいステージ
ステージ名 : 任意の名前
ステージの説明 : 任意
デプロイメントの説明 : 任意

デプロイ後にステージを確認すると、以下のような URL が自動生成されます。

URL の呼び出し: https://"ランダム文字列".execute-api."リージョン名".amazonaws.com/"ステージ名"
  • 翻訳してみる
    URL の "ステージ名"後に以下を付け足します。
/"API Gateway のリソース名"?input_text="翻訳したい日本語"

例えば、以下で設定をした場合

リージョン : オハイオ
ステージ名 : dev
リソース名 : translate

このような URL になるはずです。

https://hogehoge.execute-api.us-east-2.amazonaws.com/dev/translate?input_text=こんにちは世界

翻訳できましたでしょうか!?
先ほどは Lambda をテスト実行すると Error が返ってきましたが
今度は 、URL の中でちゃんとパラメータを渡してあげているので
Error にはなりません。

完走した感想

わたしは、URL を叩いたときに Internal server error が表示されており、
時間内に完了させることができませんでした。

原因もはっきりはしていませんが、
Lambda Function ソースコードを貼りつけ直したのと
エラーの後はブラウザを変えて試したところ、上手く翻訳されました。

わたしは普段まるで縁がないため、
Lambda も、APIGateway も、Translate も初めて触りましたが
とっても楽しかったです。
何か面白いハンズオンがあればまた参加したいと思います!

あと、今回参加したハンズオンでは、もうひとつ
"文字起こし+翻訳パイプラインを作る"という課題がありましたが、
わたしは翻訳 API に手間取っていたので、宿題となりました(◞‸◟)
また近いうちに、宿題提出しようと思います!

それでは また。