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

posted at

updated at

AWS LambdaでPython基礎

2022/4/6(水)に行われたAPNパートナー限定セミナー「Pythonの基礎から学ぶ!サーバーレス開発はじめの一歩」で学んだLambda部分の復習。

AWS Lambdaと Amazon Translate を使ってテキスト翻訳するアプリケーションを作成する。
image.png

1.Lambda 関数を実行する

1-1. Lambda 関数の作成

マネジメントコンソールで Lambda を開き「関数の作成」をクリックする。

  • 「一から作成」を選択する。
  • 関数名:適当な名前を付ける。目的がわかるようにしたいので今回はtranslate_lambdaとした。
  • ランタイム:python3.9

その他項目はデフォルト値のまま「関数の作成」をクリックする。
image.png

lambda 関数が作成できたら、画面下部のコードを書き換える。
image.png

lambda_function.py
def lambda_handler(event, context):
    # ログを出力する
    print("event:",event)
    print("context:",context)

コードを書き換えたら「Deploy」をクリックしてコードを保存する。
Deployすると「Changes not deployed」が消える。
image.png

テストタブに移動し、「テスト」をクリックする。
image.png

テストを実行すると、実行結果の「詳細」を展開してログを確認できる。
「ここをクリックし」のリンクをクリックすると、CloudWatch のロググループ画面が開き、該当のログの詳細を確認できる。
image.png

ClousWatch ロググループ画面には実行したLambda のログが出力されている。
image.png
eventcontextから続くログを見ると、Lambda関数にどんな引数が渡されたのか確認できる。
image.png

  • event:Lambda関数の呼び出し元の情報
  • context:Lambda で関数が実行されると、コンテキストオブジェクトハンドラーに渡される。このオブジェクトは、呼び出し、関数、および実行関数に関する情報を示すメソッドおよびプロパティを提供する。

今回はeventを変更せず実行したため、初期値で設定されていた{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}が引数としてLambda 関数に渡されていたことがわかる。
image.png

Lambda 関数のハンドラーは、イベントを処理する関数コード内のメソッドのこと。関数が呼び出されると、Lambda はハンドラーメソッドを実行し、ハンドラーによってレスポンスが終了するか、レスポンスが返ったら、別のイベントを処理できるようになる。
今回もハンドラーによってハンドラーメソッドが実行され、レスポンスが終了している状態となる。

今実行したコードはハンドラー(lambda_handler())を呼ぶ文を記述していないが、lambda_handler()が実行されているのは、Lambda関数のハンドラーとしてlambda_functions.pylambda_handler()がLambda関数のコードタブの画面下部で設定されているため。
image.png

2.Lambda 関数でAmazon Translate を使う

2-1.AWS Cloud9 で書いたコードを Lambda 関数用に書き換える

2-4-1.位置引数で練習した以下のpythonコードを書き換える。

positional_arguments.py (書き換え前)
 # boto3パッケージを使うように指定する
import boto3

 # honyaku関数の宣言
def honyaku(text, source_language_code, target_language_code): #位置引数をここで定義
    # boto3パッケージ内のどのサービスを使用するか指定する
    client = boto3.client('translate') #関数宣言前に書いてもいいし、関数内に書いてもいいらしい
    # translate_text()メソッド項目の「Request Syntax(リクエスト構文)」を参考に、パラメータを指定する
    response = client.translate_text(
        Text=text, # 位置引数text
        SourceLanguageCode=source_language_code, # 位置引数source_language_code
        TargetLanguageCode=target_language_code  # 位置引数target_language_code
        )
    # honyaku()関数はここまで
    
    # honyaku()関数の中にある変数 response の内容を出力 
    print(response)

 # honyaku()関数の呼び出し
honyaku('I want to be able to use Python!', 'en', 'ja') # 指定した順序で引数の値を書く

これを、以下の方針で Lambda関数に書き換える。

  • honyaku関数honyaku()はそのままLambda関数内のプログラムへ移行する
  • Lambda 関数が実行するlambda_handler()関数でhonyaku()関数を呼び出す

先ほど作成した「translate_lambda」に戻り、コードを書き換える。
lambda_handler()関数の上に、honyaku()関数とimport boto3をコピーして貼り付け。

「translate_lambda」lambda_function.py 編集中1
import boto3

 # honyaku関数の宣言
def honyaku(text, source_language_code, target_language_code): #位置引数をここで定義
    client = boto3.client('translate')
    response = client.translate_text(
        Text=text, # 位置引数text
        SourceLanguageCode=source_language_code, # 位置引数source_language_code
        TargetLanguageCode=target_language_code  # 位置引数target_language_code
        )

def lambda_handler(event, context):
    # ログを出力する
    print("event:", event)
    print("context:", context)

lambda_handler()関数内のprint文を削除し、honyaku()関数を実行する呼び出し文を追記する。
ここではユーザー定義のhonyaku()関数に直接文字列を渡すのではなく、変数にそれぞれ値を格納してからhonyaku()関数にその変数を渡す。

「translate_lambda」lambda_function.py 編集中2
import boto3

 # honyaku関数の宣言
def honyaku(text, source_language_code, target_language_code): #位置引数をここで定義
    client = boto3.client('translate')
    response = client.translate_text(
        Text=text, 
        SourceLanguageCode=source_language_code, 
        TargetLanguageCode=target_language_code 
        )
      
    # honyaku()関数の中にある変数 response の内容を出力 
    print(response)

def lambda_handler(event, context):
    # honyaku()関数に渡す文字列を変数に格納する
    text="I want to be able to use Python!"
    source_language_code="en"
    target_language_code="ja"
    # honyaku()関数の呼び出し
    honyaku(text, source_language_code, target_language_code) 

ここまで編集したら「Deploy」をクリックしてコードを保存し、テストタブから先ほどと同じように「テスト」をクリックしてコードを実行する。「実行結果: 失敗(ログ)」と表示され、詳細を開くと以下のようにエラーログが表示される。

{
  "errorMessage": "An error occurred (AccessDeniedException) when calling the TranslateText operation: User: arn:aws:sts::xxxxxxxxxxxx:assumed-role/translate_lambda-role-cd41u5ay/translate_lambda is not authorized to perform: translate:TranslateText because no identity-based policy allows the translate:TranslateText action",
  "errorType": "ClientError",
  "requestId": "a3201585-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 21, in lambda_handler\n    honyaku(text, source_language_code, target_language_code)\n",
    "  File \"/var/task/lambda_function.py\", line 6, in honyaku\n    response = client.translate_text(\n",
    "  File \"/var/runtime/botocore/client.py\", line 391, in _api_call\n    return self._make_api_call(operation_name, kwargs)\n",
    "  File \"/var/runtime/botocore/client.py\", line 719, in _make_api_call\n    raise error_class(parsed_response, operation_name)\n"
  ]
}

エラーログを読むとtranslate_lambda is not authorized to perform: translate:TranslateText because no identity-based policy allows the translate:TranslateText actionとあり、translate_lambdaがAmazon Translateを実行する権限がないことがわかる。

2-2.Lambda関数に AmazonTranslateを操作する権限を付与する

「設定」タブで「アクセス権限」を開き、実行ロールのロール名をクリックする。
image.png

IAM の画面に飛ぶので、このロールに AmazonTranslate の権限を付与する。「アクセス許可を追加」から「ポリシーをアタッチ」を選択する。
image.png

TranslateReadOnlyを選択し、「ポリシーをアタッチ」をクリックする。
image.png

2-3.Lambda 関数を再度実行する

「translate_lambda」の実行画面に戻り、テストタブから再度実行する。
成功し、翻訳結果がログに出力されているのが確認できる。
image.png

translate_lambda 実行結果ログ
START RequestId: cb4380b9-xxxx-xxxx-xxxx-xxxxxxxxxxxx Version: $LATEST
{'TranslatedText': 'Pythonを使えるようになりたい!', 'SourceLanguageCode': 'en', 'TargetLanguageCode': 'ja', 'ResponseMetadata': {'RequestId': '5e18059e-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': '5e18059e-xxxx-xxxx-xxxx-xxxxxxxxxxxx', 'cache-control': 'no-cache', 'content-type': 'application/x-amz-json-1.1', 'content-length': '115', 'date': 'Sat, 16 Apr 2022 10:22:53 GMT'}, 'RetryAttempts': 0}}
END RequestId: cb4380b9-xxxx-xxxx-xxxx-xxxxxxxxxxxx
REPORT RequestId: cb4380b9-xxxx-xxxx-xxxx-xxxxxxxxxxxx	Duration: 1247.15 ms	Billed Duration: 1248 ms	Memory Size: 128 MB	Max Memory Used: 66 MB	Init Duration: 251.46 ms	

参考

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
1
Help us understand the problem. What are the problem?