俺のアウトプット

調べたこと、試したことを書きます

AWS Cloud9からPython3で作成したLambda関数を実行する

AWS Cloud9上で、Lambda関数を作成して実行します。

大まかな流れは下記になります。

  1. ローカル上にLambda関数を作成
  2. ローカル上のLambda関数を(デバッグ)実行
  3. AWS上にLambda関数をデプロイして実行

ここでいうローカルとは、ブラウザで起動したCloud9環境を指します。

Lambda関数はPython3で作成します。
Python3の構築は下記エントリを参照してください。

AWS Lambdaの連携先リージョン

その前にLambdaの連携先リージョンを変更します。

EC2環境のデフォルトでは、Lambdaの連携先リージョンは、AWS Cloud9を起動したリージョンと同じになります。

AWS Cloud9 EC2環境をシンガポールリージョンで作成した場合、Lambdaや実行ロール、それを作成するCloudFormationは、同じシンガポールリージョンに作成されます。

今回は、Lambdaの連携先をシンガポールリージョンから東京リージョンに変更します。

  1. ツールバー右側の歯車アイコンを選択して、プロジェクト設定を開く
  2. [AWS SETTINGS] を選択
  3. [AWS Region] をAsia Pacific (Tokyo)に変更

f:id:kitsugi:20180927075616p:plain

特に設定反映ボタンはありません。

ローカル上にLambda関数を作成

ローカル上、つまりAWS Cloud9 環境上に、Lambda関数を作成します。

右側サイドバーにある、[AWS Resources]を選択して [AWSリソース] ウィンドウを開きます。

ウィンドウ右上に、プロジェクト設定で選択した東京リージョン ap-northeast-1 が表示されています。

それではLambda関数を作成しましょう。 オレンジ色の [λ+] ボタンをクリックします。

f:id:kitsugi:20180927075625p:plain

サーバーレスアプリケーションの作成

関数名アプリケーション名を入力します。

f:id:kitsugi:20180927075632p:plain

ここで入力した関数名アプリケーション名は、Cloud9環境内のディレクトリ名、AWS Lambda関数名に使われます。

f:id:kitsugi:20180928060910p:plain

f:id:kitsugi:20180928062411p:plain

ランタイム(言語とバージョン)とテンプレートとなる設計図を選択します。

  1. ランタイムからPython 3.6を選択
  2. 設計図としてhello-world-python3を選択
  3. [Next] ボタンをクリック

f:id:kitsugi:20180927075650p:plain

関数トリガーでは、API Gateway と連携するかを設定します。
今回はデフォルトのnoneのまま、[Next] ボタンをクリックします。

f:id:kitsugi:20180927075657p:plain

メモリロールを選択します。
今回はデフォルトのまま、[Next] ボタンをクリックします。 ロールは自動生成されます。

f:id:kitsugi:20180927075706p:plain

確認画面です。
問題がなければ、[Finish] ボタンをクリックします。

f:id:kitsugi:20180927075714p:plain

ローカル上にいくつかのファイルが作成され、指定したリージョンにAWS Lambda関数(とロール)が作成されます。

Lambdaコードの修正

環境ウィンドウ内のlambda_function.pyをダブルクリックして、タブウィンドウにLambda関数を表示します。

f:id:kitsugi:20180928064947p:plain

下記コードに差し替えて、保存 (Command+S) します。

lambda_function.py

import json

print('Loading function')

def lambda_handler(event, context):
    message = 'Hello {} {}!'.format(event['first_name'], event['last_name'])

    return {
        'message' : message
    }

入力された名前と文字を連結して返すだけのシンプルなコードです。

ローカル上のLambda関数を実行

作成したLambda関数をローカル上で実行します。
操作は [AWSリソース] ウィンドウから行います。

  1. [Local Functions] 内のLambda関数myHelloWorldを右クリックしてメニュー表示
  2. [Run] - [Run Local] を選択

f:id:kitsugi:20180927075740p:plain

[実行] タブが表示されます。

[実行] タブ内の [Payload] ペインで、JSON形式で入力データを登録します。

{
  "first_name": "太郎",
  "last_name": "山田"  
}

[Run] ボタンをクリックすると、結果が下に表示されます。

f:id:kitsugi:20180927075748p:plain

ローカル上でLambda関数をデバッグする

今度はデバッグ実行してみましょう。

行番号の横をクリックして、ブレークポイントを貼ります。 赤い円が表示されます。

f:id:kitsugi:20180928052935p:plain

[Run] ボタン右側の [バグ] アイコンをクリックします。アイコンが灰色から緑に切り替わります。
この状態で、[Run] ボタンをクリックします。

f:id:kitsugi:20180928052947p:plain

ブレークポイントでコードが一時停止され、[デバッガー] ウィンドウに現在の値が表示されます。

f:id:kitsugi:20180928052956p:plain

AWS上でLambda関数を実行

ローカル上のLambda関数をAWS上にデプロイして実行します。
操作は [AWSリソース] ウィンドウから行います。

AWS上にデプロイ

  1. [Local Functions] 内のLambda関数myHelloWorldを右クリックしてメニュー表示
  2. [Deploy] を選択

指定したリージョンへLambda関数がデプロイされます。

f:id:kitsugi:20180927075804p:plain

Lambda関数のリモート実行

  1. [Local Functions] 内のLambda関数myHelloWorldを右クリックしてメニュー表示
  2. [Run] - [Run Remote] を選択

f:id:kitsugi:20180927075811p:plain

[実行] タブ内の接続先が、Lambda (remote)になっていることを確認して、[Run] ボタンをクリックします。

f:id:kitsugi:20180928074312p:plain

[結果] ペインにステータスコード200が表示されていれば成功です。

削除

作成したLambda関数を削除する場合、AWS側のリソースとローカル上の両方を削除する必要があります。

AWS側のリソース

CloudFormationから削除します。

[サービス] - [管理ツール] - [CloudFormation] からスタックを削除します。

f:id:kitsugi:20180927075756p:plain

ローカル上

AWS Cloud9 [環境] パネル上のアプリケーションディレクトリを右クリックして削除します。

まとめ

AWS Cloud9を利用すれば、Lamba関数を簡単にデバッグすることができます。
PC上にローカル環境(aws-sam-cli)を構築する必要はありません。

今回は触れていませんが、既存のLamba関数をAWS Cloud9上にインポートすることもできます。

気軽に試してみましょう。

参考