0
Help us understand the problem. What are the problem?

posted at

updated at

AWS LambdaでPython基礎~Amazon S3とAmazon Translateを利用する

2022/4/6(水)に行われたAWSセミナー「Pythonの基礎から学ぶ!サーバーレス開発はじめの一歩」で構築したサーバレスアーキテクチャ環境の復習。

構成図

AWS Lambdaを起動し、S3バケットにアップロードした英語のテキストを、翻訳して返す簡易アプリケーションをPyhonで開発する。
image.png

0.前提

「AWS Cloud9でPython基礎~Amazon S3とAmazon Translateを利用する」で作成した s3 バケットが存在していること。
「AWS Cloud9でPython基礎~Amazon S3とAmazon Translateを利用する」で作成したPythonコードindex.pyを、AWS Lambdaに移植していく。

1.Lambda関数の作成

AWSマネジメントコンソールでLambda画面を開き、「関数の作成」から以下設定し、その他項目はデフォルトで「関数の作成」をクリックする。

  • 一から作成
  • 関数名:translate_file
  • ランタイム:Python3.9

image.png

Lambda関数作成直後は以下のコードが書かれている。

import json

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

このLambda関数ではlambda_handler()関数が初めに実行される。
そのため、AWS Cloud9でPython基礎~Amazon S3とAmazon Translateを利用するで作成したPythonコードindex.pyを以下の方針で移行する。

  • 関数はそのまま移動する
  • 関数外のプログラムはlambda_handler()関数内で実行する
  • boto3のclientは関数の外に定義する

関数の外でboto3.clientを実行する理由
boto3のclientは、lambda_handler()の外部で定義すると、複数回Lambda関数が呼び出された際に初期化されたままとなり、実行が効率的になる。
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/runtimes-context.html

lambda_function.py

import boto3

s3_client = boto3.client('s3')
translate_client = boto3.client('translate') 


def read_s3_file():
    input_object = s3_client.get_object(Bucket='learn-python-20220417-xxxxx-input', Key='sample_file.txt')
    input_object_byte = input_object['Body'].read()
    input_object_text = input_object_byte.decode()
    return input_object_text
 
 
def honyaku(text, source_language_code, target_language_code):
    response = translate_client.translate_text(
        Text=text, 
        SourceLanguageCode=source_language_code, 
        TargetLanguageCode=target_language_code  
        )
    
    print(response['TranslatedText'])
    return response['TranslatedText']


def write_s3_file(output_text):
    s3_client.put_object(Bucket='learn-python-20220417-xxxxx-output', Key='upload.txt', Body=output_text.encode())


def lambda_handler(event, context):
    text = read_s3_file()
    source_language_code='en'
    target_language_code='ja'
    translated_text = honyaku(text, source_language_code, target_language_code) 
    write_s3_file(translated_text)

「Deploy」をクリックしてコードを保存する。

2.Lambda関数への権限付与

このままだとLambda関数がS3バケットへのアクセス権限と Amazon Translate へのアクセス権限を保持していないためエラーになる。

設定タブから[アクセス権限]-[実行ロール]のリンクをクリックする。
image.png

[アクセス許可を追加]-[ポリシーをアタッチ]をクリックする。
image.png

「AmazonS3FullAccess」にチェックを入れ、「ポリシーをアタッチ」をクリックする。

ここでは操作を簡単にするためにS3へ全ての操作を許可する権限を付与しているが、必要なリソースに必要な権限のみ付与することがベストプラクティスであることに注意。
image.png

続けて Amazon Translate への権限を付与する。
[アクセス許可を追加]-[ポリシーをアタッチ]をクリックする。
image.png

「TranslateReadOnly」にチェックを入れ、「ポリシーをアタッチ」をクリックする。
image.png

3.Lambda関数実行

Lambda 関数の画面に戻り、テストタブから「テスト」をクリックする。
成功と表示され、ログに翻訳後の文章が表示されていることが確認できる。
image.png

S3バケットを見ると、「upload.txt」の時間が更新されているのが確認できる。
image.png

参考

AWS Cloud9でPython基礎
AWS Cloud9でPython基礎~ファイルの読み書き
AWS LambdaでPython基礎
AWS Cloud9でPython基礎~Amazon S3を利用する
AWS Cloud9でPython基礎~Amazon S3とAmazon Translateを利用する
AWS LambdaでPython基礎~Amazon S3とAmazon Translateを利用する

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?