LoginSignup
26
26

More than 5 years have passed since last update.

lambda-uploaderを使ってAWS Lambdaをリモートで開発、実行、デプロイする

Last updated at Posted at 2017-01-04

概要

lambdaをリモートマシンで開発、実行、デプロイできるツールのインストール手順と使い方です。
pythonのlambda-uploaderというpipを使います。

環境

  • CentOS6.7
  • python 2.7.12
  • pip lambda-uploader
  • pip awscli

pythonのインストール

こちらを参照
python(pyenv + virtualenv) + CentOS7インストールメモ

lambda-uploaderのインストール

$ pip install lambda-uploader

aws-cliも使うのでインストール

$ pip install awscli

初期設定

AWSの認証情報を下記コマンドで登録します。

$  aws configure --profile dev

AWS Access Key ID [None]: {Your Access Key Id}
AWS Secret Access Key [None]: {Your Secret Access Key}
Default region name [None]: ap-northeast-1
Default output format [None]: json

必要なファイルを用意

下記のデイレクトリ構成でファイルを作成します。

|- ~/lambda-uploader/
       |- bin/
          └ lambda-exec
       |- sample-api/ # 名前はなんでも良いlambda関数一つにつき1ディレクトリ
          └ requirements.txt
          └ lambda.json
          └ index.py
          └ event.json

別にこの構成でなくても構いませんが、

  • requirements.txt
  • lambda.json
  • index.py
  • event.json

この4つのファイルは、1functionにつき必ず必要で、この4つは同じ階層に存在する必要があります。

~/lambda-uploader/bin/lambda-exec

リモート環境でlambdaを実行するためのスクリプト。
awsコマンドが長いので、下記の内容で作成し、簡単に実行できるようにします。

#!/bin/bash

FUNCTION_NAME=$1
EVENT_JSON=$2

echo ${FUNCTION_NAME}
echo ${EVENT_JSON}

aws lambda invoke \
    --invocation-type RequestResponse \
    --function-name ${FUNCTION_NAME} \
    --payload file://${EVENT_JSON} \
    /tmp/lambda_outputfile.txt

echo ''
echo '[result]'
cat /tmp/lambda_outputfile.txt
echo ''

実行権限を付与

$ chmod +x ~/lambda-uploader/bin/lambda-exec

PATHを通すため、bash_profileに下記を追記

$ vi ~/.bash_profile

export PATH=$PATH:"$HOME/lambda-uploader/bin"

変更を適用

$ source ~/.bash_profile

~/lambda-uploader/sample-api/requirements.txt

pipモジュールの一覧が書かれたファイル。
下記コマンドで生成します。

$ pip freeze > requirements.txt

~/lambda-uploader/sample-api/lambda.json

lambdaの設定ファイル。ここに関数名などを記載します。

{
  "name": "{lambda functionの名前}",
  "description": "{lambda functionの説明}",
  "region": "ap-northeast-1",
  "handler": "index.lambda_handler",
  "role": "arn:aws:iam::123456789012:role/role-name",
  "timeout": 300,
  "memory": 128
}

handlerは、上記の例だと、index.pyのlambda_handler関数が実行されるという意味になります。

roleには、Lambda関数のExecution Roleのarnを定義してください。
事前別途roleの作成が必要です。

参考までに、API Gateway, SQS, SNSと連携するLambdaを作った際は、IAMロールに以下の権限を付与しました。

  • AmazonAPIGatewayPushToCloudWatchLogs
  • AmazonSNSFullAccess
  • AmazonSQSFullAccess
  • AWSLambdaFullAccess
  • AWSLambdaVPCAccessExecutionRole

~/lambda-uploader/sample-api/index.py

Lambda関数を作成。
下記はPOSTリクエストを受け取って返すだけのサンプルです。

# -*- coding:utf-8 -*-

def lambda_handler(event, context):
    text = '%s is %s years old.' %(event['name'], event['age'])
    return text

~/lambda-uploader/sample-api/event.json

テスト時に投げるPOSTリクエストの内容を定義します。(GETリクエストのテストの場合は空でOK)
※ダブルクォーテーションにしないとエラーになる

{
    "name" : "Michael",
    "age" : "30"
}

Lambdaをデプロイ

lambda関数をAWSにデプロイします。
lambda.json, index.pyなどがあるデイレクトリに移動してデプロイコマンドを実行します。

$ cd ~/lambda-uploader/sample-api

デプロイコマンド

$ lambda-uploader

Lambda関数を実行

リモート環境でlambda関数を実行します。
実行するためには、先にAWSにデプロイされている必要があります。
こちらもlambda.json, index.pyなどがあるデイレクトリに移動して実行します。

$ cd ~/lambda-uploader/sample-api

下記コマンドで実行
第1引数にLambda関数名、第2引数にevent.jsonファイルを指定します。

$ lambda-exec {Lambda関数名} event.json

下記のようなresponseが帰ってくれば成功です。

sample-api
event.json
{
    "StatusCode": 200
}

[result]
"Michael is 30 years old."

以上

参考

AWS Lambda Pythonをlambda-uploaderでデプロイ

26
26
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
26