[AWS]apexを使用してawsのlambda関数を作成する

カテゴリ: aws, python | タグ:

インストール

apexは、下記のコマンドでインストールすることができます。macOSの場合インストール先はデフォルトで/usr/local/bin/apexになります。

$ curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  8006  100  8006    0     0  20623      0 --:--:-- --:--:-- --:--:-- 20687
apex/apex: checking GitHub for latest version
apex/apex: found version 1.0.0-rc3 for darwin/amd64
apex/apex: downloading https://github.com/apex/apex/releases/download/v1.0.0-rc3/apex_1.0.0-rc3_darwin_amd64.tar.gz
apex/apex: verifying checksums
apex/apex: installed as /usr/local/bin/apex

バージョンの確認

インストールが完了したら、動作確認をかねてapex versionコマンドでバージョンを確認します。

$ apex version
Apex version 1.0.0-rc2

接続の認証情報を作成

まずはAWSのweb画面よりIAMを作成しておきます。今回、作成したアカウントにはAWSLambdaFullAccessとIAMFullAccessの権限を与えておきました。

次に以下の内容で、認証情報ファイルを作成しておきます。ファイル中のmyapp-devはアプリケーション名なので、好きな名前をつけて良いです。
- ~/.aws/config

[myapp-dev]
output = json
region = ap-northeast-1
  • ~/.aws/credentials
[myapp-dev]
aws_access_key_id = AKIxxxxxxxx
aws_secret_access_key = xxxxxxxxxxxxxxxxxxxxxxxx

プロジェクトの作成

認証情報を用意したら、profileとregionを指定してapex initコマンドを実行します。
プロジェクト名などを対話的に聞かれるので、適当に入力します。

$ apex init --profile myapp-stage --region ap-northeast-1


             _    ____  _______  __
            / \  |  _ \| ____\ \/ /
           / _ \ | |_) |  _|  \  /
          / ___ \|  __/| |___ /  \
         /_/   \_\_|   |_____/_/\_\



  Enter the name of your project. It should be machine-friendly, as this
  is used to prefix your functions in Lambda.

    Project name: myapp

  Enter an optional description of your project.

    Project description: test_myapp_180723

  [+] creating IAM myapp_lambda_function role
  [+] creating IAM myapp_lambda_logs policy
  [+] attaching policy to lambda_function role.
  [+] creating ./project.json
  [+] creating ./functions

  Setup complete, deploy those functions!

    $ apex deploy

プロジェクト作成で自動生成されたファイルを確認する

initが完了したらfindでファイル一覧を確認します。2つのファイルが作成されていました。

$ find . -type f
./project.json
./functions/hello/index.js

project.jsonの方は環境設定で、メモリ128MByte,タイムアウト5秒の設定がされていました。実行環境(言語)が指定されていませんが、省略するとnode.jsを指定したと見なされるようです。

$ more project.json
{
  "name": "myapp",
  "description": "test_myapp_180723",
  "memory": 128,
  "timeout": 5,
  "role": "arn:aws:iam::999999999:role/myapp_lambda_function",
  "environment": {}
}

index.jsはnode.jsのソースコードで、jsonのデータを返すスクリプトになっています。

$ more functions/hello/index.js
console.log('starting function')
exports.handle = function(e, ctx, cb) {
  console.log('processing event: %j', e)
  cb(null, { hello: 'world' })
}

サンプルをデプロイする

apex initで用意されていたファイルを変更せずに、そのままデプロイしてみます。

$ apex deploy --profile myapp-stage --region ap-northeast-1
   • creating function         env= function=hello
   • created alias current     env= function=hello version=1
   • function created          env= function=hello name=myapp_hello version=1

awsのコンソールで見ると、myapp_helloの名前でlambdaの関数ができていました。

右上のテストボタンから実行してみると、 index.jsが走りhello worldがjsonで出力されました。

サンプルプログラムをpythonに変更する

project.jsonにruntimeとhandlerを追加します。
今回は、runtimeとしてpython3.6を指定しました。他にpython2.7も指定可能です。
また、handlerは実行する関数を指定します。main.lambda_handleを指定すると、./functions/xxx/main.pyにあるlambda_handle()が実行される関数になります。

  • project.json
{
  "name": "myapp",
  "description": "test_myapp_180723",
  "memory": 128,
  "timeout": 5,
  "role": "arn:aws:iam::999999999:role/myapp_lambda_function",
  "runtime": "python3.6",
  "handler": "main.lambda_handle",
  "environment": {}
}

最初に用意されていたfunctions/hello/index.jsを削除して、./functions/hello/main.pyの名前で下記のpythonスクリプトを作成します。

def lambda_handle(event, context):
     return {'hello': 'python'}

編集が終わったら、再度デプロイします
apex deploy --profile myapp-stage --region ap-northeast-1

再度AWSのweb上で確認すると、指定されたpythonの関数がデプロイされていることがわかります。
テストを実行すると、Resultのウィンドウにはpythonスクリプトの実行結果が出力されました。

lambda関数からpipパッケージを利用する

次に、lambda関数から外部のpipパッケージを利用してみます。今回はhttpリクエストを発行できるrequestsパッケージを利用してみます。

pipパッケージのインストール

以下のように-tオプションでパッケージの保存先を指定してpipコマンドでインストールします

$ pip install requests -t functions/hello/vendor

pipパッケージにパスを通す

project.jsonファイルを編集し、vendorディレクトリが検索パスに含まれるようにします

{
  "name": "myapp",
  "description": "test_myapp_180723",
  "memory": 128,
  "timeout": 5,
  "role": "arn:aws:iam::999999999999:role/myapp_lambda_function",
  "runtime": "python3.6",
  "handler": "main.lambda_handle",
  "environment": {
        "PYTHONPATH": "/var/runtime:/var/task/vendor"
    }
}

pythonスクリプトの作成と実行

pythonプログラムでは、import requestsでパッケージを読み込みます。今回はlivedoorの天気予報APIをコールしてみます。

import requests

def lambda_handle(event, context):
    url = 'http://weather.livedoor.com/forecast/webservice/json/v1?city=130010'
    result = requests.get(url).json()
    desc = result['description']['text']
    return {'msg': desc}

project.jsonとスクリプトの作成が完了したら、サーバにアップするためにapex deployコマンドで再度デプロイします。

まずは、環境変数のPYTHONPATHにproject.jsonで指定した値がセットされていることを確認します。

Lambda関数を実行すると、以下のように結果が出力されます。

apexコマンドのTips

コマンドラインからAWSのLambda関数を呼び出す

apex invokeコマンドで、AWSのサーバ上にデプロイされたLambda関数を呼び出せます。

$ apex invoke hello --profile myapp-stage --region ap-northeast-1
{"hello": "python"}

登録済みの関数一覧を取得する

apex listコマンドは、project.jsonを読みやすい形で出力してくれます。

$ apex list

  hello
    runtime: python3.6
    memory: 128mb
    timeout: 5s
    role: arn:aws:iam::999999999999:role/myapp_lambda_function
    handler: main.lambda_handle

コマンドの実行ログを見る

apex logsコマンドで、Lambda関数の実行ログを確認できます。(apex logs -fコマンドも使用できます)

$ apex logs --profile myapp-stage --region ap-northeast-1
/aws/lambda/myapp_hello START RequestId: bf0f1234-8e7f-11e8-b27e-2bcf7ca0f405 Version: 8
/aws/lambda/myapp_hello END RequestId: bf0f1234-8e7f-11e8-b27e-2bcf7ca0f405
/aws/lambda/myapp_hello REPORT RequestId: bf0f1234-8e7f-11e8-b27e-2bcf7ca0f405  Duration: 0.32 ms   Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 21 MB
こちらもおススメ

コメントを残す

メールアドレスが公開されることはありません。