Axios always time out on AWS Lambda for a particular API

Viewed 5248

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

  • Axios Version: 0.19.2
  • Runtime: nodejs12x

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.

  • curl from local -> 403 access denied
  • curl from local with User-Agent header -> success
  • curl from cloud server -> 403 access denied

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

3 Answers

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

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();

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.

Related