2022/4/6(水)に行われたAWSセミナー「Pythonの基礎から学ぶ!サーバーレス開発はじめの一歩」で構築したサーバレスアーキテクチャ環境の復習。
構成図
AWS Lambdaを起動し、S3バケットにアップロードした英語のテキストを、翻訳して返す簡易アプリケーションをPyhonで開発する。
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
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
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 へのアクセス権限を保持していないためエラーになる。
設定タブから[アクセス権限]-[実行ロール]のリンクをクリックする。
[アクセス許可を追加]-[ポリシーをアタッチ]をクリックする。
「AmazonS3FullAccess」にチェックを入れ、「ポリシーをアタッチ」をクリックする。
続けて Amazon Translate への権限を付与する。
[アクセス許可を追加]-[ポリシーをアタッチ]をクリックする。
「TranslateReadOnly」にチェックを入れ、「ポリシーをアタッチ」をクリックする。
3.Lambda関数実行
Lambda 関数の画面に戻り、テストタブから「テスト」をクリックする。
成功と表示され、ログに翻訳後の文章が表示されていることが確認できる。
S3バケットを見ると、「upload.txt」の時間が更新されているのが確認できる。
参考
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を利用する