DynamoDB.batchWriteItem()

AWS Lambdaを使っていて、node.jsからDynamoDBの値を更新しようとしたところちょっとハマったのでメモ。

■ 環境

  • Node.js 8.10
  • AWS Lambda
  • AWS DynamoDB

■ batchWriteItem()

マニュアルを見ていて、`batchWriteItem()`を知った。複数件を操作できるので便利そうだ、と思い早速やってみた。試しに10件更新はうまくいったので100件更新をしようとしたところエラー…。何か間違えたかな?とソースを確認するも問題はなさそう。

マニュアルを再度確認すると下記の記載があった。

* There are more than 25 requests in the batch.

これに引っかかっていたようである。

25件毎の実行に修正したところ問題なく操作ができた。

以上。

Lambda + node + Athena

表題の環境でハマったのでメモとして残しておく。

■ 環境

  • Node.js 8.10
  • AWS Lambda
  • AWS Athena

■ node

新規でLambdaの関数を”一から作成“で作成した際に、下記のコードが作成されたのでこれを元に処理を追加していった。

exports.handler = async (event) => {
    // TODO implement
    return 'Hello from Lambda!'
};

LambdaからAthenaに`startQueryExecution`でクエリを実行させ、S3にCSVが作成された、満足だ、と安心し更に実装を進めていたら、`startQueryExecution`の箇所はほぼ修正していないのに実行ができなくなってしまった…。その後、ファイルのversionを戻しても実行がされない…。`listNamedQueries`を実行してみても結果を得られない…。

  1. 実行できた時点のversionを再実行
  2. `startQueryExecution`を`listNamedQueries`にして実行
  3. 関数を新規に作成して実行

ここまで実行してもやはり実行はできなかった。エラーも出ていない、CloudWatchログで見ても実行時のエラーは出ていない。手詰まり…となったがふと思いたってランタイムを”Node.js 6.10“にして実行してみた。実行してみるとエラーが発生。`async`がダメというような内容であった。

従って、上記のサンプルでいうと下記のように修正した。

exports.handler = (event) => {
    // TODO implement
    return 'Hello from Lambda!'
};

実行できてしまった…。`listNamedQueries`も`startQueryExecution`も問題なく実行ができた。

もしや?と思いこのソースのままランタイムを”Node.js 8.10“に変更しても問題なく実行ができた。

変な箇所にハマって時間をくってしまったので原因を深く追求するのはやめて実装を進めることにする。

以上。

Lambda用に`npm deploy`

表題の通り。`npm deploy`コマンドを設定してしまっているというお話。

■ 環境

  • AWS Lambda
  • node v4.4.7
  • Mac OSX El Capitan

■ きっかけ

ServerlessFrameworkとかを使っていない環境で、Lambdaに簡易的にデプロイしたいなと思った時に、”package.json“に1行加えてデプロイをしている。いや、ServerlessFrameworkとかも使ったことすらないけど…。

■ AWS Lambda

各種設定等は”Management Console“で先にやってしまっている。そこでARNを取得する。

AWS Lambda > Functions > Function選択 > Actions > Show ARN

ここで得られた”ARN“を元にコマンドを設定する。

■ pakcage.json

{
  "name": "test",
  "version": "0.0.1",
  "description": "test test test.",
  "main": "index.js",
  "scripts": {
    "zip": "zip -r test.zip index.js node_modules",
    "update": "aws lambda update-function-code --function-name arn:aws:lambda:ap-northeast-1:XXXXXXXXXXX:function:test --zip-file fileb://`pwd`/test.zip --publish",
    "deploy": "npm run zip && npm run update"
  },
  :
}

上記のような”scripts“を追加している。後は実行するだけでOKである。

$ npm run deploy

当初はかなり適当に設定してみたのだが、意外と使えたので最近はもっぱらこれを使用している。

以上。

Lambdaで使えるnodeのversion

表題の件について調べたメモ。

■ 環境

  • AWS Lambda

■ node

Lambdaをnodeで実装したいのだが、開発するにあたってローカルのnodeのversionをどれにすれば良いのだろうか?という疑問。

調べてみるとドキュメントに記載されていた。

Lambda実行環境と利用できるライブラリ
https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html

nodeは”v0.10.36“だそうである。ローカルの環境をこれに合わせて準備する。

nodebrewを使用しているので下記のようになる。

$ nodebrew install-binary v0.10.36
fetch: http://nodejs.org/dist/v0.10.36/node-v0.10.36-darwin-x64.tar.gz
######################################################################## 100.0%
Install successful
$
$ nodebrew use v0.10.36
use v0.10.36
$
$ node -v
v0.10.36
$

以上。

■ 関連