এই এইচটিপি অনুরোধটি এডাব্লুএস ল্যাম্বডায় কাজ করছে না কেন?


90

আমি এডাব্লুএস ল্যাম্বদা দিয়ে শুরু করছি এবং আমি আমার হ্যান্ডলার ফাংশন থেকে একটি বাহ্যিক পরিষেবার জন্য অনুরোধ করার চেষ্টা করছি। এই উত্তর অনুসারে , এইচটিটিপি অনুরোধগুলির ঠিকঠাক কাজ করা উচিত, এবং অন্যথায় বলে এমন কোনও ডকুমেন্টেশন আমি পাইনি। (আসলে, লোকেরা এমন কোড পোস্ট করেছে যা এসএমএস প্রেরণে টোভিলিও এপিআই ব্যবহার করে ))

আমার হ্যান্ডলারের কোডটি হ'ল:

var http = require('http');

exports.handler = function(event, context) {
  console.log('start request to ' + event.url)
  http.get(event.url, function(res) {
    console.log("Got response: " + res.statusCode);
  }).on('error', function(e) {
    console.log("Got error: " + e.message);
  });

  console.log('end request to ' + event.url)
  context.done(null);
}

এবং আমি আমার ক্লাউডওয়াচ লগগুলিতে নিম্নলিখিত 4 টি লাইন দেখতে পেয়েছি:

2015-02-11 07:38:06 UTC START RequestId: eb19c89d-b1c0-11e4-bceb-d310b88d37e2
2015-02-11 07:38:06 UTC eb19c89d-b1c0-11e4-bceb-d310b88d37e2 start request to http://www.google.com
2015-02-11 07:38:06 UTC eb19c89d-b1c0-11e4-bceb-d310b88d37e2 end request to http://www.google.com
2015-02-11 07:38:06 UTC END RequestId: eb19c89d-b1c0-11e4-bceb-d310b88d37e2

আমি সেখানে অন্য লাইন আশা করব:

2015-02-11 07:38:06 UTC eb19c89d-b1c0-11e4-bceb-d310b88d37e2 Got response: 302

তবে তা অনুপস্থিত যদি আমি আমার স্থানীয় মেশিনে নোডে হ্যান্ডলার মোড়ক ছাড়াই প্রয়োজনীয় অংশটি ব্যবহার করি তবে কোডটি প্রত্যাশার মতো কাজ করে।

inputfile.txtআমি ব্যবহার করছি জন্য invoke-asyncকল, তা হল:

{
   "url":"http://www.google.com"
}

দেখে মনে হচ্ছে হ্যান্ডলার কোডটির সেই অংশটি যা অনুরোধটি পুরোপুরি বাদ দেয়। আমি অনুরোধটি lib দিয়ে শুরু করেছি এবং httpএকটি ন্যূনতম উদাহরণ তৈরি করতে প্লেইন ব্যবহার করে ফিরে এসেছি । আমি লগগুলি পরীক্ষা করতে আমার নিয়ন্ত্রণ করে এমন একটি পরিষেবার URL এর অনুরোধ করার চেষ্টা করেছি এবং কোনও অনুরোধ আসেনি।

আমি পুরো স্টম্পড। নোড এবং / বা এডাব্লুএস ল্যাম্বদা এইচটিটিপি অনুরোধটি কার্যকর না করার কোনও কারণ আছে?


আমি মনে করি যে এটি আপনার এইচটিটিপি অনুরোধে অনুপস্থিত ব্যবহারকারী-এজেন্টের কারণে হতে পারে।
মা'মুন আল-আকাশ

4
লেখার সময়, বর্তমানে ডাব্লুএস ফোরামের লাম্বদা ফোরামে এটি শীর্ষ প্রশ্ন। এটি আমাকে বাদাম এবং অন্যান্য লোকদেরও একগুচ্ছ চালাচ্ছে।
নস্ট্রেডামাস

@ নোস্ট্রাডামাস আমি কোনও অতিরিক্ত প্রতিক্রিয়া, সংশোধন এবং আপডেটগুলি প্রশংসা করি। তাদের এখানে পাঠান ;-)
aw:৩7-

4
আমি ট্যিলো উদাহরণ থেকে শুরু করে অ্যালেক্সা নোড উদাহরণ বান্ডেল এবং আপনার কনটেক্সট.ডোন () পদ্ধতিতে পাঠানো কয়েকটি ডিফল্ট উদাহরণ পর্যন্ত সবকিছু চেষ্টা করেছি। http POST কাজ করছে না। আপনার পোষ্ট অনুরোধ কোডের সম্পূর্ণ নমুনা পোস্ট করা কি সম্ভব?
শেপলো

উত্তর:


80

অবশ্যই, আমি সমস্যাটি ভুল বুঝছিলাম। এডব্লিউএস যেমন নিজেরাই লিখেছিল :

লাম্বডায় প্রথমবারের মতো নোডেজের মুখোমুখি হওয়ার জন্য, একটি সাধারণ ত্রুটি ভুলে যাচ্ছিল যে কলব্যাকগুলি অযৌক্তিকভাবে কার্যকর করা context.done()হয় এবং মূল হ্যান্ডলারে কল করা যখন আপনি সত্যিকার অর্থে অন্য কোনও কলব্যাকের জন্য অপেক্ষা করতে চেয়েছিলেন (যেমন একটি এস 3.পুট অপারেশন) ফাংশন জোর করে এর কাজ অসম্পূর্ণ সঙ্গে শেষ করতে।

আমি context.doneঅনুরোধের জন্য কোনও কলব্যাকগুলি বরখাস্ত করার আগেই ফোন করছিলাম , আমার কার্যকারিতাটি সময়ের আগেই সমাপ্তি ঘটায়।

কাজের কোডটি হ'ল:

var http = require('http');

exports.handler = function(event, context) {
  console.log('start request to ' + event.url)
  http.get(event.url, function(res) {
    console.log("Got response: " + res.statusCode);
    context.succeed();
  }).on('error', function(e) {
    console.log("Got error: " + e.message);
    context.done(null, 'FAILURE');
  });

  console.log('end request to ' + event.url);
}

আপডেট: 2017 এডাব্লুএস শুরু করে পুরানো নোডেজ 0.10 কে অবমূল্যায়ন করেছে এবং কেবলমাত্র নতুন 4.3 রান-টাইম এখন উপলব্ধ (পুরানো ফাংশনগুলি আপডেট করা উচিত)। এই রানটাইম হ্যান্ডলার ফাংশনে কিছু পরিবর্তন আনল। নতুন হ্যান্ডলারের এখন 3 টি পরামিতি রয়েছে।

function(event, context, callback)

যদিও আপনি এখনও পাবেন succeed, doneএবং failপ্রসঙ্গ পরামিতি উপর, ডেস্কটপ AWS ব্যবহার করতে সুপারিশ callbackপরিবর্তে ফাংশন বা nullডিফল্টরূপে ফিরিয়ে দেওয়া হয়।

callback(new Error('failure')) // to return error
callback(null, 'success msg') // to return ok

সম্পূর্ণ ডকুমেন্টেশন http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html এ পাওয়া যাবে


4
সুতরাং, আপনি কীভাবে আপনার হ্যান্ডলার কোডটিকে কাজ করবেন? আমার বুঝতে হবে আপনাকে কনটেক্সট.ডোন () সরিয়ে ফেলতে হবে যাতে কলব্যাক ফাংশনটি কল করা হবে। তবে আপনার কোডটি এখনও আমার পক্ষে কাজ করে না। :(
মাবেইই

4
context.done()কল callbacks (সাফল্য এবং ত্রুটি ক্ষেত্রে জন্য) স্থানান্তরিত করা প্রয়োজন।
অজেন্ডেট

4
আপনার সমস্যাটি এখনও আসে নি তবে লাম্বদা নিয়ে এগিয়ে যাওয়ার সাথে সাথে মনে রাখা ভাল।
ডেভিড

ল্যাম্বডা থেকে আমি কীভাবে আমার স্থানীয় সিস্টেমে এপিআই ডাকতে পারি?
অমিত কুমার ঘোষ

4
২০১৫ সালের আপডেটের সাথে 2015 সালের প্রশ্ন আপডেট করার জন্য প্রপসগুলি!
টেক্কা

21

নোড ব্যবহার করে এইচটিটিপি অনুরোধের সাধারণ কাজের উদাহরণ।

const http = require('https')
exports.handler = async (event) => {
    return httprequest().then((data) => {
        const response = {
            statusCode: 200,
            body: JSON.stringify(data),
        };
    return response;
    });
};
function httprequest() {
     return new Promise((resolve, reject) => {
        const options = {
            host: 'jsonplaceholder.typicode.com',
            path: '/todos',
            port: 443,
            method: 'GET'
        };
        const req = http.request(options, (res) => {
          if (res.statusCode < 200 || res.statusCode >= 300) {
                return reject(new Error('statusCode=' + res.statusCode));
            }
            var body = [];
            res.on('data', function(chunk) {
                body.push(chunk);
            });
            res.on('end', function() {
                try {
                    body = JSON.parse(Buffer.concat(body).toString());
                } catch(e) {
                    reject(e);
                }
                resolve(body);
            });
        });
        req.on('error', (e) => {
          reject(e.message);
        });
        // send the request
       req.end();
    });
}

এই জন্য আপনাকে ধন্যবাদ. 2019 এ এই পৃষ্ঠায় আমি দেখতে পাই এটি সেরা উত্তর, এখন যে ল্যাম্বদা প্রতীক্ষিত বাক্য গঠনটি ব্যবহার করছে।
তনিম টি

4
node-fetch requestল্যাম্বডায় ডিফল্টরূপে ল্যাব ইত্যাদি পাওয়া যায় না বলে আমাকে উত্তর দিতে এবং সেরা উত্তর পেতে এক ঘন্টা সময় নিয়েছে ।
অ্যালেক্স সি

প্রচুর নমুনা কোড এখন ভেঙে গেছে বলে মনে হচ্ছে। এটি 2020 সালের মার্চ মাসের মধ্যে নমুনা কোডটি কাজ করছে, এডাব্লুএস লাম্বদাটি নোড.জেএস 12.x এর সাথে ব্যবহার করছে
মুহাম্মদ ইউসুফ

ল্যাম্বডা ফাংশনের ভিতরে ডেটা দিয়ে কীভাবে পোষ্ট অনুরোধ করা যায় তা কেউ ব্যাখ্যা করতে পারেন?
পবিন্দু

11

হ্যাঁ, উত্তর উত্তর সঠিক answer আমি কেবল আমার ওয়ার্কিং কোডটি দেখাব ... আমার প্রসঙ্গ ছিল ceed সাফল্য ('ব্লাহ'); রেকপোস্ট.েন্ডের পরে ডানদিকে (); লাইন আমি যেখানে নীচে দেখাব সেদিকে নিয়ে যাওয়া সমস্ত সমস্যার সমাধান করে।

console.log('GW1');

var https = require('https');

exports.handler = function(event, context) {

    var body='';
    var jsonObject = JSON.stringify(event);

    // the post options
    var optionspost = {
        host: 'the_host',
        path: '/the_path',
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        }
    };

    var reqPost = https.request(optionspost, function(res) {
        console.log("statusCode: ", res.statusCode);
        res.on('data', function (chunk) {
            body += chunk;
        });
        context.succeed('Blah');
    });

    reqPost.write(jsonObject);
    reqPost.end();
};

4

আমি নোড 10. এক্স সংস্করণে এই সমস্যার মুখোমুখি হয়েছি। নীচে আমার ওয়ার্কিং কোড।

const https = require('https');

exports.handler = (event,context,callback) => {
    let body='';
    let jsonObject = JSON.stringify(event);

    // the post options
    var optionspost = {
      host: 'example.com', 
      path: '/api/mypath',
      method: 'POST',
      headers: {
      'Content-Type': 'application/json',
      'Authorization': 'blah blah',
    }
    };

    let reqPost =  https.request(optionspost, function(res) {
        console.log("statusCode: ", res.statusCode);
        res.on('data', function (chunk) {
            body += chunk;
        });
        res.on('end', function () {
           console.log("Result", body.toString());
           context.succeed("Sucess")
        });
        res.on('error', function () {
          console.log("Result Error", body.toString());
          context.done(null, 'FAILURE');
        });
    });
    reqPost.write(jsonObject);
    reqPost.end();
};

3

আমার খুব একই সমস্যা ছিল এবং তখন আমি বুঝতে পারি যে নোডজেএসে প্রোগ্রামিংটি জাভাস্ক্রিপ্টের উপর ভিত্তি করে পাইথন বা জাভা থেকে আসলে আলাদা। আমি সাধারণ ধারণাটি ব্যবহার করার চেষ্টা করব কারণ সেখানে কয়েকটি নতুন ভাবেন যা আগ্রহী বা এই প্রশ্নটিতে আসতে পারে।

আসুন নীচের কোডটি দেখুন:

var http = require('http'); // (1)
exports.handler = function(event, context) {
  console.log('start request to ' + event.url)
  http.get(event.url,  // (2)
  function(res) {  //(3)
    console.log("Got response: " + res.statusCode);
    context.succeed();
  }).on('error', function(e) {
    console.log("Got error: " + e.message);
    context.done(null, 'FAILURE');
  });

  console.log('end request to ' + event.url); //(4)
}

যখনই আপনি HTTP প্যাকেজ (1) এর কোনও পদ্ধতিতে কল করেন, এটি ইভেন্ট হিসাবে তৈরি হয় এবং এই ইভেন্টটি এটি পৃথক ইভেন্ট পায়। 'Get' ফাংশন (2) আসলে এই পৃথক ইভেন্টের সূচনা পয়েন্ট।

এখন, (3) এ ফাংশনটি একটি পৃথক ইভেন্টে সম্পাদন করবে এবং আপনার কোডটি এটি চালুর পথে চালিয়ে যাবে এবং সরাসরি (4) এ চলে যাবে এবং এটি শেষ করবে, কারণ আর কিছুই করার নেই।

কিন্তু (২) এ নিক্ষিপ্ত হওয়া ইভেন্টটি এখনও কোথাও চালাচ্ছে এবং এটি শেষ করতে এটির নিজস্ব মিষ্টি সময় লাগবে। বেশ উদ্ভট, ঠিক? ভাল, না এটা না। এভাবেই নোডজেএস কাজ করে এবং এর ধারণাটি গুরুত্বপূর্ণ যে আপনি এই ধারণাটি নিয়ে আপনার মাথাটি জড়িয়ে রাখুন। এটি সেই জায়গা যেখানে জাভাস্ক্রিপ্ট প্রতিশ্রুতি সাহায্য করতে আসে।

আপনি এখানে জাভাস্ক্রিপ্ট প্রতিশ্রুতি সম্পর্কে আরও পড়তে পারেন । সংক্ষেপে, আপনার কোডটি কার্যকর রাখতে হবে না এমন একটি জাভাস্ক্রিপ্ট প্রতিশ্রুতি দরকার এবং নতুন / অতিরিক্ত থ্রেড তৈরি করা হবে না।

বেশিরভাগ সাধারণ নোডজেএস প্যাকেজগুলিতে তাদের এপিআইয়ের প্রতিশ্রুতিবদ্ধ সংস্করণ পাওয়া যায় তবে ব্লুবার্ডজেএসের মতো অন্যান্য পন্থাগুলিও একই ধরণের সমস্যার সমাধান করে।

আপনি উপরে যে কোডটি লিখেছেন তা নীচে আলগাভাবে পুনরায় লেখা যেতে পারে।

'use strict';
console.log('Loading function');
var rp = require('request-promise');
exports.handler = (event, context, callback) => {    

    var options = {
    uri: 'https://httpbin.org/ip',
    method: 'POST',
    body: {

    },
    json: true 
};


    rp(options).then(function (parsedBody) {
            console.log(parsedBody);
        })
        .catch(function (err) {
            // POST failed... 
            console.log(err);
        });

    context.done(null);
};

দয়া করে নোট করুন যে উপরের কোডটি সরাসরি কাজ করবে না যদি আপনি এডাব্লুএস ল্যাম্বডায় এটি আমদানি করেন। লাম্বদা-র জন্য, আপনাকে কোড বেস সহ মডিউলগুলি প্যাকেজ করতে হবে।


হ্যাঁ, প্রতিশ্রুতি! যদিও আমি context.done()কলটিকে একটি শৃঙ্খলিত finallyপদ্ধতিতে স্থানান্তরিত করার বিষয়টি বিবেচনা করব ।
crftr

3

আমি অনুরোধটি করার বিভিন্ন উপায়ে ওয়েবে জুড়ে প্রচুর পোস্ট পেয়েছি, তবে এমন কোনও কিছুই যা এডাব্লুএস ল্যাম্বডায় প্রতিক্রিয়াটিকে সিঙ্ক্রোনালিভাবে প্রক্রিয়া করতে হবে তা দেখায় না।

এখানে একটি নোড 10.১০.৩ ল্যাম্বদা ফাংশন যা একটি https অনুরোধ ব্যবহার করে, প্রতিক্রিয়াটির পুরো শরীর সংগ্রহ করে এবং প্রদান করে এবং processBodyফলাফলগুলি সহ একটি তালিকাভুক্ত ফাংশনে নিয়ন্ত্রণ দেয় । আমি বিশ্বাস করি যে এই কোডটিতে এইচটিপি এবং https আন্তঃবঙ্গ হতে পারে।

আমি অ্যাসিঙ্ক ইউটিলিটি মডিউলটি ব্যবহার করছি যা নবাবিদের পক্ষে বোঝা সহজ। এটি ব্যবহারের জন্য আপনাকে এটি আপনার AWS স্ট্যাকের দিকে ঠেলাতে হবে (আমি সার্ভারলেস কাঠামোর প্রস্তাব দিই )।

নোট করুন যে তথ্যগুলি আবার বিশ্বে ফিরে আসে, যা বিশ্বব্যাপী ভেরিয়েবলে সংগ্রহ করা হয় এবং শেষ পর্যন্ত ডেটাটি সম্পাদনা করার পরে কলব্যাক বলা হয় end

'use strict';

const async = require('async');
const https = require('https');

module.exports.handler = function (event, context, callback) {

    let body = "";
    let countChunks = 0;

    async.waterfall([
        requestDataFromFeed,
        // processBody,
    ], (err, result) => {
        if (err) {
            console.log(err);
            callback(err);
        }
        else {
            const message = "Success";
            console.log(result.body);
            callback(null, message);
        }
    });

    function requestDataFromFeed(callback) {
        const url = 'https://put-your-feed-here.com';
        console.log(`Sending GET request to ${url}`);
        https.get(url, (response) => {
            console.log('statusCode:', response.statusCode);
            response.on('data', (chunk) => {
                countChunks++;
                body += chunk;
            });
            response.on('end', () => {
                const result = {
                    countChunks: countChunks,
                    body: body
                };
                callback(null, result);
            });
        }).on('error', (err) => {
            console.log(err);
            callback(err);
        });
    }
};

0

এখানে চিত্র বর্ণনা লিখুন

জিইটি-ইন্টিগ্রেশন রিকোয়েস্টেস> ম্যাপিং বিভাগের আওতায় উপরের কোডটি এপিআই গেটওয়েতে যুক্ত করুন।


-14

হ্যাঁ, আপনি এডাব্লুএস ল্যাম্বদা লাইক এবং এইচটিটিপি এন্ডপয়েন্টে অ্যাক্সেস করতে পারবেন এমন অনেক কারণ রয়েছে।

এডাব্লুএস ল্যাম্বদার আর্কিটেকচার

এটি একটি মাইক্রোসারভাইস। আমাজন লিনাক্স এএমআই (সংস্করণ 3.14.26–24.46.amzn1.x86_64) এর সাথে ইসি 2 এর অভ্যন্তরে চলছে এবং নোড.জেএস দিয়ে চলছে স্মৃতিটি বেটউইন 128 এমবি এবং 1 জিবি হতে পারে। যখন ডেটা উত্স ইভেন্টটি ট্রিগার করে, বিশদটি প্যারামিটার হিসাবে ল্যাম্বডা ফাংশনে প্রেরণ করা হয়।

কি হল?

এডাব্লুএস ল্যাম্বদা একটি পাত্রে চলেছে এবং কোডটি সরাসরি পাত্রে বা মডিউলগুলির সাথে এই ধারকটিতে আপলোড করা হয়। উদাহরণস্বরূপ, আমরা আপনার ল্যাম্বদা ফাংশনটি চালাচ্ছে লিনাক্স মেশিনের জন্য এসএসএইচ করতে পারি না। ক্লাউডওয়াচলোগগুলি সহ লগগুলি এবং রানটাইম থেকে আসা ব্যতিক্রমগুলি কেবলমাত্র আমরা পর্যবেক্ষণ করতে পারি।

এডাব্লুএস আমাদের জন্য পাত্রে প্রবর্তন এবং সমাপ্তির যত্ন নেয় এবং কেবল কোড চালায়। সুতরাং, এমনকি আপনার প্রয়োজনীয় ব্যবহারের জন্য ('এইচটিপি') এটি কার্যকর হবে না, কারণ এই কোডটি যে জায়গাতে চালিত হয়, সেটির জন্য তৈরি করা হয়নি।


4
আপনি আমার সমস্যা ভুল বুঝতে পারে। আমি জানি যে ল্যাম্বদা কোডটি একটি ধারকটিতে চালিত হচ্ছে এবং আমি জানি যে আমি অন্তর্নিহিত মেশিনটি অ্যাক্সেস করতে পারি না। আমি ভিতরে .োকার চেষ্টা করছি না, আমার কোডটি বেরিয়ে আসার চেষ্টা করছে, অর্থাত্ বাহ্যিক শেষ পয়েন্টগুলি অ্যাক্সেস করতে এবং ল্যাম্বদা এটি বেশ ভালভাবে করতে পারে। আমি আমার নিজের উত্তরে ইঙ্গিত করেছি বলে সমস্যাটি পুরোপুরি অন্য কিছু ছিল।
এভেন্ডেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.