以下のツイートが興味深かったので、ちょっと検証してみた。
@shot6 Lambdaってイベントストリームに画像バイナリ流せるのですか?それおもしろい。。
— Kazunori Sato (@kazunori_279) 2014, 11月 14
送信側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側で解凍できた。
実際に使う機会はなさそうだけど…