インストール
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