docker-lambda を使って AWS Lambda Function を開発する方法
はじめに
docker-lambda
で AWS Lambda Function を開発する方法を調べた。
TL;DR
docker-lambda
を試した- 追加パッケージをインストールしてデプロイするまで
- 試した言語は Python, Ruby, Node.js
docker-lambda
はいいぞ
目次
環境・条件
1 | $ sw_vers |
詳細
今回作ったコード類は以下に整理した。
17number/aws-lambda-docker-practice
docker-lambda とは
AWS Lambda Function を開発するための環境。
AWS Lambda Function は、中身は Amazon Linux なので Mac などのローカル環境で開発すると、環境差分でうまく動かないことがある(らしい)。
そこで「Amazon Linux の環境を Docker で構築して、Docker 内で各種パッケージをインストールして、それらをまとめて zip で固めて〜」ということを、簡単に行えるようにしたものが docker-lambda(という認識)。
今回試した Python, Ruby, Node.js 以外のランタイム(golang, Java など)にも対応している。
docker-lambda を試す
事前に Docker のインストールが必要。
基本形は以下の通り。ランタイム、ファイル名、関数名を指定すれば OK。
1 | $ docker run --rm -v <code_dir>:/var/task lambci/lambda:<runtime> <filename>.<funcname> |
ランタイムは Ruby2.5
で、./function.rb
の handler
メソッドを使う場合は以下の通り。
1 | $ docker run --rm -v "$PWD":/var/task lambci/lambda:ruby2.5 function.handler |
docker image がローカルに無い場合には、コマンド実行時に pull
してくれる。
Python
function.py
として保存、コードの引用元はここ。
1 | def my_handler(event, context): |
イベントの情報を利用するので、カスタムイベントを実行時に指定。
1 | $ docker run --rm -v "$PWD":/var/task lambci/lambda:python3.7 function.my_handler \ |
実行結果。
1 | START RequestId: 12345678-1234-1234-1234-1234567890ab Version: $LATEST |
Ruby
function.rb
を作成。コードはこちらからコピー。
1 | require 'json' |
docker-lambda
で実行。
1 | $ docker run --rm -v "$PWD":/var/task lambci/lambda:ruby2.5 function.handler |
実行結果。
1 | START RequestId: 12345678-1234-1234-1234-1234567890ab Version: $LATEST |
Node.js
function.js
として保存、コードの引用元はここ。
1 | exports.handler = async function(event, context) { |
イベントの情報を利用するので、カスタムイベントを実行時に指定。
1 | $ docker run --rm -v "$PWD":/var/task lambci/lambda:nodejs10.x function.handler \ |
実行結果。
1 | START RequestId: 12345678-1234-1234-1234-1234567890ab Version: $LATEST |
本番用ファイルを作成する
追加パッケージをインストールして、bitFlyer Ticker API を実行するだけの Lambda function を作っていく。
Python
pip install
するパッケージは requirements.txt
に書き出す。今回は requests
をインストール。
1 | requests |
lambda_function.py
を作成。
1 | import requests |
Dockerfile
を作成。
1 | FROM lambci/lambda:build-python3.7 |
ビルド。
1 | $ docker build -t aws-lambda-python3.7-test . |
デプロイファイルを作成。
1 | $ docker run --rm -v "$PWD":/var/task aws-lambda-python3.7-test:latest |
成功すると deploy_package.zip
ができている。unzip -Z
で中身を確認。
1 | $ unzip -Z deploy_package.zip |
aws lambda create-function
で Lambda function を作成。ロールは IAM で事前に作成済み。
1 | $ aws lambda create-function \ |
Lambda Console で開いて、テストを実行。
Ruby
bundle init
で Gemfile
を作成。
1 | $ bundle init |
Gemfile
を編集、faraday
を追加。
1 | source "https://rubygems.org" |
lambda_function.rb
を作成。
1 | require("faraday") |
Dockerfile
を作成。
1 | FROM lambci/lambda:build-ruby2.5 |
ビルド。
1 | $ docker build -t aws-lambda-ruby2.5-test . |
デプロイファイルを作成。
1 | $ docker run --rm -v "$PWD":/var/task aws-lambda-ruby2.5-test:latest |
成功すると deploy_package.zip
ができている。
aws lambda create-function
で Lambda function を作成。
1 | $ aws lambda create-function \ |
Lambda Console で開いて、テストを実行。Python と同じ結果なので、画像は省略。
Node.js
npm init
で package.json
を生成。
1 | $ npm init |
npm-add-dependencies
で、axios
を package.json
に追加。
npm-add-dependencies
については npm でパッケージをインストールせずに package.json の dependencies を更新する方法 にまとめてある。
1 | $ npm-add-dependencies axios |
npm-add-dependencies
実行後の package.json
の diff はこうなる。
1 | - "license": "ISC" |
index.js
を作成。
1 | const axios = require("axios"); |
Dockerfile
を作成。
1 | FROM lambci/lambda:build-nodejs10.x |
ビルド。
1 | $ docker build -t aws-lambda-nodejs10.x-test . |
デプロイファイルを作成。
1 | $ docker run --rm -v "$PWD":/var/task aws-lambda-nodejs10.x-test:latest |
成功すると deploy_package.zip
ができている。
aws lambda create-function
で Lambda function を作成。
1 | $ aws lambda create-function \ |
Lambda Console で開いて、テストを実行。Python と同じ結果なので、画像は省略。
後片付け
docker-lambda
の使い方はわかったので、不要な Lambda Function は削除しておく。
1 | $ aws lambda delete-function --function-name docker-lambda-python-test |
まとめ
docker-lambda
を試した- 追加パッケージをインストールしてデプロイするまで
- 試した言語は Python, Ruby, Node.js
docker-lambda
はいいぞ
参考文献
- lambci/docker-lambda: Docker images and test runners that replicate the live AWS Lambda environment
- docker-lambdaでAWS Lambda環境をお手軽に動かす - Qiita
- AWS Lambda x Pythonでのローカル開発環境の再現について - Qiita
- Lambdaのローカル開発環境を構築 - Qiita
- docker-lambda - Dockerを使ったAWS Lambdaクローン MOONGIFT
- 【Python3.6】AWS Lambdaを再現するDocker Imageのdocker-lambdaを使ってみた - 歩いたら休め
関連記事
- docker-lambda + sharp で画像変換する AWS Lambda Function
- AWS lambda で S3 の画像をリサイズする(チュートリアル)
- Python boto3 で AWS S3 を操作する
- Python requests + boto3 で AWS S3 に画像を直接アップロード
- AWS S3 から Cloud Storage for Firebase にファイルをコピー
- axios で添付ファイルありのリクエスト(multipart/form-data の POST)
- JavaScript で URL のクエリパラメータを操作する方法
- jQuery Select2 で、初期値の設定と選択状態のクリア