AWS Lambda: バイナリデータをイベントとして送る

以下のツイートが興味深かったので、ちょっと検証してみた。

送信側Rubyスクリプト

バイナリを直接送信することはできないので、Base64エンコードする。

#!/usr/bin/env ruby
require 'aws-sdk-core'
require 'json'
require 'base64'

client = Aws::Lambda::Client.new(region: 'us-east-1')

open('jugemu.zip') do |f|
  client.invoke_async(
    function_name: 'test',
    invoke_args: JSON.dump('zip' => Base64.strict_encode64(open('london-bridge.zip', &:read))))
end

Lambda側

test.js

#!/usr/bin/env lambchop
/*
function_name: test
role: arn:aws:iam::xxx:role/lambda_exec_role
handler: test.handler
*/
exports.handler = function(event, context) {
  var zip = new require('node-zip')(event.zip, {base64: true, checkCRC32: true});
  console.log(zip.files['london-bridge.txt']);
  context.done();
};

ファイル構成

.
├── node_modules
│   └── node-zip
└── test.js

実行結果

{
  "function_name": "test",
  "function_arn": "arn:aws:lambda:us-east-1:xxx:function:test",
  "configuration_id": "338beaa4-209a-4983-bbeb-d6caac957ff5",
  "runtime": "nodejs",
  "role": "arn:aws:iam::xxx:role/lambda_exec_role",
  "handler": "test.handler",
  "mode": "event",
  "code_size": 6750678,
  "description": "",
  "timeout": 3,
  "memory_size": 128,
  "last_modified": "2014-11-24 18:01:20 +0900"
}
Node modules:
[
  "node-zip"
]
START RequestId: 81f485b5-73b8-11e4-8fc8-67c3e590f30d
2014-11-24T09:01:54.004Z  81f485b5-73b8-11e4-8fc8-67c3e590f30d    { name: 'london-bridge.txt',
  _data: 'London Bridge is broken down,\nBroken down, broken down.\nLondon Bridge is broken down,\nMy fair lady.\n',
  options:
   { binary: true,
     optimizedBinaryString: true,
     date: Mon Nov 24 2014 18:00:40 GMT-0800 (PST),
     dir: false,
     base64: false,
     compression: null } }
END RequestId: 81f485b5-73b8-11e4-8fc8-67c3e590f30d
REPORT RequestId: 81f485b5-73b8-11e4-8fc8-67c3e590f30d  Duration: 636.34 ms Billed Duration: 700 ms    Memory Size: 128 MB    Max Memory Used: 10 MB

一応、zipファイルを送信してLambda側で解凍できた。

実際に使う機会はなさそうだけど…