`node-lambda` で素朴にLambdaを使ってみる


node-lambda で素朴にLambdaを使ってみる

概要

AWS Lambdaを利用して何かをやりたい場合は以下のいずれかを使うのがイマドキでしょうか

そんな時代ではありますが node-lambda の紹介をします
名前の通りAWS LmabdaをNode.jsで使うときに利用します。(Node.js以外の言語には対応していません)
素朴なツールで出来ることは少ないですが、お手軽にLambdaを使ってみる分にはよいツールではないかと思います

install

% npm i -g node-lambda

globalにinstallしたことにして話を進めます

初期化

適当な作業ディレクトリを作成し、そこに移動したのち setup を実行します

% node-lambda setup
Running setup.
/path/.env file successfully created
/path/event.json file successfully created
/path/deploy.env file successfully created
/path/context.json file successfully created
/path/event_sources.json file successfully created
Setup done.
Edit the .env, deploy.env, context.json, event_sources.json and event.json files as needed.%

node-lambda が利用するファイルがもりもり作成されました。
取り急ぎ使うのは event.json.env です

  • .env
    • Lambdaにdeployするときに利用。RoleやLambdaのメモリ設定など
  • deploy.env
    • 名前が紛らわしいのですが、Lambdaに設定する環境変数を設定するためのファイルです
  • event_sources.json
    • S3のイベントをトリガーにLambdaを実行したいときなどに設定します
  • event.json
    • ローカルで実行するときに利用する
  • context.json
    • ローカルで実行するときに利用する

Lambdaのハンドラ例

以下のファイルを例に進めます

index.js
exports.handler = async (event, context) => {
  console.log('Running index.handler')
  console.log('==================================')
  console.log('event', event)
  console.log('==================================')
  console.log('Stopping index.handler')

  return true
}

ローカルで実行してみる

run を実行します。
デフォルトでは index.js にある handler という関数を実行します

% node-lambda run
Running index.handler
==================================
event { key: 'value', key2: 'value2', other_key: 'other_value' }
==================================
Stopping index.handler
Result:
true

上述のindex.jsの内容が実行されました

引数の event に値が渡っていることに気付くかと思います
デフォルトでは setup で作成された event.json を引数のeventに渡します

setup で作成される event.json は以下の通りです

% cat ./event.json
{
  "key": "value",
  "key2": "value2",
  "other_key": "other_value"
}

設定

ローカルで動作確認できたらLambdaにdeployします
そのための設定を .env にします

~/.aws/credentials にアクセスキーなどの設定がしてあれば以下の設定くらいで十分です
変数名から何の設定かは想像できると思いますので詳細は割愛します

.env
AWS_ENVIRONMENT=development
AWS_ROLE_ARN=arn:aws:iam::xxx:role/test
AWS_REGION=us-east-1
AWS_FUNCTION_NAME=test-function
AWS_HANDLER=index.handler
AWS_MEMORY_SIZE=128
AWS_TIMEOUT=5
AWS_RUNTIME=nodejs8.10

deploy

deploy でLambdaにdeployします

% node-lambda deploy
=> Moving files to temporary directory
=> Running npm install --production
=> Zipping deployment package
=> Zipping repo. This might take up to 30 seconds
=> Reading zip file to memory
=> Reading event source file to memory
=> Uploading zip file to AWS Lambda us-east-1 with parameters:
{ FunctionName: 'test-function-development',
  Code:
   { ZipFile:
      <Buffer xxx more bytes> },
  Handler: 'index.handler',
  Role: 'arn:aws:iam::xxx:role/test',
  Runtime: 'nodejs8.10',
  Description: '',
  MemorySize: '128',
  Timeout: '5',
  Publish: false,
  VpcConfig: { SubnetIds: [], SecurityGroupIds: [] },
  Environment: { Variables: null },
  KMSKeyArn: '',
  DeadLetterConfig: { TargetArn: null },
  TracingConfig: { Mode: null } }
=> Done uploading. Results follow:
{ FunctionName: 'test-function-development',
  FunctionArn:
   'arn:aws:lambda:us-east-1:xxx:function:test-function-development',
  Runtime: 'nodejs8.10',
  Role: 'arn:aws:iam::xxx:role/test',
  Handler: 'index.handler',
  CodeSize: n,
  Description: '',
  Timeout: 5,
  MemorySize: 128,
  LastModified: '2019-04-04T09:30:17.015+0000',
  CodeSha256: 'zzz',
  Version: '$LATEST',
  VpcConfig: { SubnetIds: [], SecurityGroupIds: [], VpcId: '' },
  KMSKeyArn: null,
  TracingConfig: { Mode: 'PassThrough' },
  MasterArn: null,
  RevisionId: 'yyy' }
=> All tasks done. Results follow:
{}

以上でdeployは完了です。(index.js を変更した後ももう一度 deploy すればLambdaの更新が行えます)

Webコンソールで確認すると以下の通りです

  • 一覧画面の様子
  • 関数詳細の設定内容の一部

Lambdaをinvoke

素朴なツールだけあってLambdaをinvokeする機能は提供されていません。
READMEにもある通り aws コマンドでinvokeするか、Webコンソールで実行して動作確認しましょう

まとめ

素朴なツール node-lambda でAWS Lambdaを使ってみました
イマドキなツールと比べると見劣りする部分も多いですが、内部でCloudFormationを使っているということもなくお手軽にLambdaをはじめるには十分だと思います
また素朴なツールなのでコードを読むとシンプルにAPIを使ってLambdaにdeployしたり、トリガーとなるイベントの紐付け方などが理解しやすいかもしれません