こんにちは。技術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
開発時に必要なもの
実際に開発を始めるにあたり必要なファイルの準備手順を紹介します。
- requirements.txt
- serverless.yml
これは前回と同じなので、割愛します。
デプロイに必要なファイルになります。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の情報を作成
- 新たなリソースを作成
そのあたりはまた別の記事を書いてみる予定です。
また、もしこんなことすればもっと楽になるとかあれば、教えていただけると幸いです。