ngtokuの日記

主に雑記帳です。SNSではngtokuのID取れなかったんで、別のIDでやってます。

Lambda経由でEC2にJSONを飛ばしてみる

LambdaからEC2で動いているServletJSON飛ばしたつもりが、受け取れてないなーと、ちょっと手こずったので備忘メモ。
原因はContent-Lengthセットしてなかった事でござる。

const http = require('http');

exports.handler = function(event, context) {
    const postData = JSON.stringify(event);
    const options = {
        protocol: 'http:',
        host: process.env.EC2_API_HOST,
        port: process.env.EC2_API_PORT,
        path: process.env.EC2_API_PATH,
        method: 'POST',
        headers: {
          "Content-type": "application/json",
          'Content-Length': encodeURIComponent(postData).replace(/%../g,"x").length
        }
    };
    const req = http.request(options, (res) => {
        var responseBody = '';
        res.setEncoding('utf8');
        res.on('data', (chunk) => {
            responseBody += chunk;
        });
        res.on('end', () => {
            context.succeed(JSON.parse(responseBody));
        });
    })

    req.setTimeout(1000);
    req.on('timeout', function() {
      console.log('request timed out');
      var responseBody = JSON.parse(postData);
      var index = 0;
      for (var cov in responseBody["coverage"]) {
          responseBody["coverage"][cov]["prem"] = 1000 * ++index;
      }
      responseBody["resultCode"] = "999";
      var errors=[];
      errors.push("EC2落としたんで、Lambdaでタイムアウトしました。テスト用に保険料は設定しておきました。");
      responseBody["errorCode"] = errors;
      context.succeed(responseBody);
    });
  
    req.on('error', (e) => {
        console.error(`problem with request: ${e.message}`);
    });

    req.write(postData);
    req.end();
}

EC2で動いているServletAPI Gatewayにリクエストを投げるhtmlはgithubに登録しておいたので、必要に応じて参照のこと。
GitHub - eternalvirtue/JacksonTest