【続】AWS Lambdaをローカル環境で開発してみた

記事タイトルとURLをコピーする

こんにちは。技術3課の森です。
長年スノーボードをやってまして、板はアルペン(gray snowboards / FORCE)を使ってます。

前回のお話と今回の概要

前回のお話では、「virtualenv」と「python-lambda-local」と「lambda-uploader」を使ったAWS Lambdaの開発を紹介させていただきました。
今回は、「Serverless Framework」を使ってAWS Lambdaをローカル環境で開発する環境を以下の手順でご紹介します。

  • serverless frameworkのインストール

事前情報

今回はAmazon EC2を使って作業をします。

  • OS: Amazon Linux
  • IAM Role: AdministratorAccessポリシー

Serverless Frameworkのインストール

これからServerless Frameworkをインストールしていきます。まずは、EC2をt2.microで起動させて、ec2-userでログインしてください。

yumパッケージのインストールとアップデートを行い、再起動

まず最初に、yumパッケージのインストールとアップデートを行います。そして、再起動します。

$ sudo yum update -y
$ sudo yum install -y gcc gcc-c++ make git openssl-devel bzip2-devel readline-devel libffi-devel sqlite-devel
$ sudo reboot
nvmとnode.jpのインストール

次に、nvmとnode.jpをインストールします。次のコマンドを実行してください。

$ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.29.0/install.sh | bash
$ source ~/.bashrc
$ nvm install v6.9
$ nvm use 6.9
$ nvm alias default 6.9
Serverless Frameworkのインストール

やっとServerless Frameworkのインストールを行います。今回は、version 1.6.1 を利用します。

$ npm install serverless@1.6.1 -g
Pythonの実行環境を構築

最後に、前回も使ったPythonの実行環境を構築します。以下のコマンドを実行してください。

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

設定情報を.bash_profileに書き込みます。

## Set path for pyenv
export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
    eval "$(pyenv virtualenv-init -)"
fi

.bash_profileに書き込みましたので、ロードします。

 $ source ~/.bash_profile

次にPythonと仮想環境の作成を行います。 今回は一般ユーザのホームディレクトリ配下に「Developments/project」フォルダを作成して作業することにします。

$ pyenv install 2.7.11
$ mkdir -p ~/Developments/project
$ cd ~/Developments/project
$ pyenv virtualenv 2.7.11 project
$ pyenv local project
開発時に必要なもの

実際に開発を始めるにあたり必要なファイルの準備手順を紹介します。

  1. requirements.txt
  2. これは前回と同じなので、割愛します。

  3. serverless.yml
  4. デプロイに必要なファイルになります。Lambda関数に付与するIAMロールやAWS Lambdaに設定するハンドラー、トリガーなどを書きます。詳しい内容はここでは割愛しますが、リファレンスがあるので、コチラをご覧ください。

Lambda Functionの実行とデプロイ

インストールは終わって環境ができたので、デプロイしていきます。 それでは、実行コマンドを書いていきます。

ローカルでLambda Functionを実行

まずはコマンド実行例を紹介します。

 $ serverless invoke local -f 
引数 説明
<function name> serverless.ymlの"functions"プロパティの下に書かれる名前
AWS - Functions

なお、コマンド内の「local」を消すとデプロイ済みのLambda関数を実行します。

ローカルからのデプロイ

コマンド一発でデプロイができます。

 $ serverless deploy
serverless deploy
Serverless: Packaging service...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3 (11.19 MB)...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.........
Serverless: Stack update finished...
Serverless: Removing old service versions...
Service Information
service: sample-service
stage: sample-stage
region: ap-northeast-1
api keys:
  None
endpoints:
  None
functions:
  sample-service-sample-stage-function

これで、Lambda関数をAWSにデプロイすることができました。

前回と違うところ

前回のvirtualenv / python-lambda-local / lambda-uploaderでは、Lambdaのトリガー設定ができないと書きましたが、今回のServerless Frameworkではトリガー設定ができるようになります。
以下に、S3のバケットに拡張子が「csv」のファイルが置かれたらLambdaが発火するというserverless.ymlの例を書きます。

functions:
  csv-move-dir:
    handler: pythonfile.main
    events:
      - s3:
          bucket: put_csv_bucket
          event: s3:ObjectCreated:*
          rules:
            - suffix: .csv

この例は、「pub_csv_bucket」という名のバケットに拡張子が「csv」のファイルが作成(配置)されたらhandler「pythonfile.main」が実行されるとなります。

まとめ

実際にコードを開発している間では、前回と変わりはありませんが、今回書かなかったですが、serverless.ymlに情報を書き込むことで他にもできることがあります。

  • トリガーに必要なリソースの作成とLambdaへのトリガー設定
  • IAMRoleの情報を作成
  • 新たなリソースを作成

そのあたりはまた別の記事を書いてみる予定です。
また、もしこんなことすればもっと楽になるとかあれば、教えていただけると幸いです。