銀の弾丸

プログラミングに関して、いろいろ書き残していければと思っております。

AWS Lambdaの関数アップロードをお手軽に

Lambda関数を、ローカルPCからアップロードするコマンドをご紹介。ダウンロードも出来ますよっと。

Lambda関数はAWSのWEBコンソールで編集できますが、数が増えるとやってらんない。そして外部モジュールを使う場合はWEBでは無理ですし。

でき得るならばローカルで、編集したのをアップロードしたいのだけど、その都度ZIPしてアップしてとか、それはそれで手間がかかってイライラします…

f:id:takamints:20160309213632p:plain
photo credit: 150120-N-ZZ999-002 via photopin (license)

てなことで、怒りに任せて(笑)取り急ぎ、勢いで3つばかり作ってしまいました。

追記:その後コマンド追加したり手直しして、npmにaws-node-utilという名で登録しています。

以下のメニューで御説明。

目次

  1. コマンド
    1. aws-lambda-get - Lambda関数をダウンロード
    2. aws-lambda-upload - Lambda関数を更新(上書き)
    3. aws-lambda-create - Lambda関数を新規作成
  2. 機能説明
    1. ローカルのLambda関数のディレクトリ構造
    2. アップロード前に特定の処理を実行する
  3. セットアップ
    1. 実行環境と必要なツール等
    2. インストール方法
    3. リポジトリ


aws-node-utilDynamoDB関連記事はこちらです:

takamints.hatenablog.jp


1. コマンド

1-1. aws-lambda-get - Lambda関数をダウンロード

AWSのLambda関数をダウンロードします。

$ aws-lambda-get <function-name>

パラメータ

  • function-name - Lambda関数名。

ちゃんとダウンロードできたら、カレントディレクトリに関数名のディレクトリが作られ、全てのファイルが展開されます。

安心してください、上書きしませんよ

既に同名のサブディレクトリがカレントディレクトリ直下にある場合はダウンロードしません。 ディレクトリの名前を変更して再実行してください。

1-2. aws-lambda-upload - Lambda関数を更新(上書き)

AWSのLambda関数をローカルファイルで更新します。

カレントディレクトリ直下の関数名のディレクトリをZIPファイルにまとめてAWSへアップロードして上書きます。

$ aws-lambda-upload <function-name>

パラメータ

  • function-name - Lambda関数名。カレントディレクトリ直下に同名のサブディレクトリが必要です。それをZIPしてアップします。

1-3. aws-lambda-create - Lambda関数を新規作成

ローカルのLambda関数をAWSへアップロードし、新規作成します。

カレントディレクトリ直下の関数名のディレクトリをZIPファイルにまとめてAWSへアップロードします。

$ aws-lambda-create <function-name> <role-arn>

パラメータ

  • function-name - Lambda関数名です。カレントディレクトリ直下に同名のサブディレクトリが必要です。それをZIPしてアップします。
  • role-arn - Lamdaに付けられるRoleのarnを指定してください。RoleはAWS IAMで作成出来ます。

Node.js限定です

新規作成に関しては、言語はnode.jsだけで、ハンドラーは index.handlerに固定されています。

生成だけなら別途awsコマンドでやってもたいした手間ではありません。その後、uploadすれば大丈夫なんじゃないかな?(試してないのでスミマセン)

2. 機能説明

2-1. ローカルのLambda関数のディレクトリ構造

AWSからダウンロードするとカレントディレクトリ直下に関数名のサブディレクトリが作成されます。 このディレクトリは、そのままアップロードできる状態になっています。

たとえば、以下のようにHelloLambdaという関数をダウンロードすると、 カレントディレクトリ直下にディレクトHelloLambdaが作成され、全ファイルが展開されます。

$ aws-lambda-get HelloLambda

以下は、HelloLambdaがモジュールを使用している場合の例です。

./HelloLambda/
    index.js
    node_modules/
      node-uuid/
        ....

2-2. アップロード前に特定の処理を実行する

アップロードする前に、Lambda関数が利用しているモジュールを更新したり、エディタのテンポラリファイルを削除したくなると思います。

各関数のディレクトリ直下に、.onupload.sh というファイルがあれば、アップロード前(正確にはZIPで固める前)に、これをシェルスクリプトとして実行します。

このファイル自体はAWSへはアップロードされません。

#node-uuidをインストール
if [ ! -d node_modules ]; then
    npm install node-uuid
else
    npm update node-uuid
fi
#VIMのバックアップファイルを消す
rm *~ .*~ 

3. セットアップ

3-1. 実行環境と必要なツール等

利用するには、以下のものが必要です。

  • AWSのアカウント - これがないと始まらない。今なら登録から1年間は基本的に無料。
  • AWSCLI - AWSコマンドラインインターフェースです。AWSからダウンロードしてインストールし、AWSアカウントで接続できるようにしておいてください。各コマンドから利用しています。
  • Bash - コマンドがシェルスクリプトなので必要です。
  • Node.js - JSONの処理等に利用しています。将来的には全部Nodeでやりたいです。
  • Zip/Unzipコマンド - Lambda関数のアップロード、ダウンロードで必要になります。(Bashで最初から利用できるのかも?)

3-2. インストール方法

npmにpublishしたので、インストールは npm install -g aws-node-utilでOKです。

インストールスクリプトINSTALL.sh

$ sh INSTALL.sh

実行すると、各スクリプト~/binへコピーし、node_modules以下のファイルを ~/node_modules へコピーしています。

かなりいい加減なインストールスクリプトで申し訳ないです。当方MinGW使ってるのでこれで済んでいます。

可能ならば、Forkして適切に修正してください。そしてプルリク下さい。よろしくお願いいたします。

3-3. リポジトリ

ソースは全て以下のGitHubに置いています。 ご自由に利用なさってください(MIT license)。 他にも雑多なスクリプトが入っていますが、それはそれでまたおいおい。

github.com