vab2609
vab2609

Reputation: 41

Axios always time out on AWS Lambda for a particular API

Describe the issue

I'm not really sure if this is an Axios issue or not. The following code runs successfully on my local development machine but always time out whenever I run it from the cloud (e.g. AWS Lambda). Same thing happens when I run on repl.it.

I can confirm that AWS Lambda has internet access and it works for any other API but this:

https://www.target.com.au/ws-api/v1/target/products/search?category=W95362

Example Code

https://repl.it/repls/AdeptFluidSpreadsheet

const axios = require('axios');

const handler = async () => {
  const url = 'https://www.target.com.au/ws-api/v1/target/products/search?category=W95362';

  const response = await axios.get(url, { timeout: 10000 });

  console.log(response.data.data.productDataList);
}

handler();

Environment

Update 1

I tried the native require('https') and it times out on both localhost and cloud server. Please find sample code here: https://repl.it/repls/TerribleViolentVolume

const https = require('https');

const url = 'https://www.target.com.au/ws-api/v1/target/products/search?category=W95362';

https.get(url, res => {
  var body = '';

  res.on('data', chunk => {
    body += chunk;
  });

  res.on('end', () => {
    var response = JSON.parse(body);
    console.log("Got a response: ", response);
  });
}).on('error', e => {
  console.log("Got an error: ", e);
});

Again, I can confirm that same code works on any other API.

Update 2

I suspect that this is something server side as it also behaves very weirdly with curl.

It must be server side validation, something related to AkamaiGHost.

Upvotes: 4

Views: 9669

Answers (3)

Chris Yeung
Chris Yeung

Reputation: 2723

You have probably placed your Lambda function in a VPC without Internet access to the outside world. Try check the VPC section in your lambda configuration, and setup an internet gateway accordingly

Upvotes: 11

Akshay Bande
Akshay Bande

Reputation: 2587

You should try by wrapping axios call into try/catch maybe that will catch the issue.

const axios = require('axios');

const handler = async () => {
    try {
        const url = 'https://www.target.com.au/ws-api/v1/target/products/search?category=W95362';

        const response = await axios.get(url, { timeout: 10000 });
        console.log(typeof (response));
        console.log(response);

    } catch (e) {
        console.log(e, "error api call");
    }
}

handler();

Upvotes: 3

Deep Kakkar
Deep Kakkar

Reputation: 6305

As suggested by Akshay you can use try and catch block to get the error. Maybe it helps you out.

Have you configured Error Handling for Asynchronous Invocation?

To configure error handling follow the below steps:

  • Open the Lambda console Functions page.

  • Choose a function.

  • Under Asynchronous invocation, choose Edit.

  • Configure the following settings.

  • Maximum age of event – The maximum amount of time Lambda retains an event in the asynchronous event queue, up to 6 hours.

  • Retry attempts – The number of times Lambda retries when the function returns an error, between 0 and 2.

  • Choose Save.

axios is only Promise based HTTP client for the browser and node.js and as you set timeout: 10000 so I believe timeout issue is not from its end.

Although your API

https://www.target.com.au/ws-api/v1/target/products/search?category=W95362

is working fine on the browser and rendering JSON data.

and Function timeout of lambda is by default 15 minutes, which I believe is enough for the response. There may be another issue. Make sure you have set other configurations like permissions etc. as suggested in the documentation. Here you can check the default limits for AWS lambda.

Upvotes: 0

Related Questions