Не удается подключиться к узлу EC2 Ethereum из AWS Lambda

Я попытался продолжить обсуждение этого похожего вопроса: Ошибка подключения — не удалось подключиться к узлу ethereum на AWS по адресу http://xx.xxx.xx.xxx:8545 . Моды сказали мне создать новый, так что вот.

У меня есть экземпляр EC2, на котором работает узел Ethereum (в моем случае Parity). Экземпляр общедоступен для всего мира. Я могу запустить простой код на своей локальной машине дома и подключиться к экземпляру AWS:

const Web3 = require('web3')
let web3 = new Web3(
  new Web3.providers.HttpProvider('http://<EC2_PUBLIC_IP>:8545')
)
console.log(web3.eth.blockNumber)

Это прекрасно работает с любого компьютера, который может подключиться к Интернету.

Я хочу настроить функцию Lambda, которая может установить соединение web3 с этим узлом. Я пробовал простую функцию, подобную этой:

const Web3 = require('web3')

module.exports.hello = (event, context, callback) => {
  let web3 = new Web3(
    new Web3.providers.HttpProvider(
      'http://<EC2_PUBLIC_IP>:8545'
    )
  )
  callback(
    null,
    success({
      blockNumber: web3.eth.blockNumber
    })
  )
}

Когда я запускаю это, я всегда получаю сообщение об ошибке:

Error: CONNECTION ERROR: Couldn't connect to node http://<EC2_PUBLIC_IP>:8545.

Я перепробовал все и убедился, что Lambda может общаться с EC2, обрабатывая HTTP-запрос (они находятся в одном и том же VPC). Я пытался использовать частный IP-адрес вместо общедоступного, DNS вместо IP-адреса и все такое.

Я читал, что люди могли иметь контракты вызова функций Lambda, поэтому я думаю, что это должно быть возможно.

Любые идеи о том, что мы можем попробовать?

Ответы (2)

Я обновился до последней версии Web3 (бета-версия 1.0.0), и каким-то образом проблема была решена.

Обратите внимание, что web3 изменился между 0.20 и 1.0.0-beta31 с синхронного на асинхронный.

Вот как я запустил его с web3@1.0.0-beta.31

exports.handler = (event, context, callback) => {
  let ip = '123.123.123.123';
  let web3 = new Web3(
  new Web3.providers.HttpProvider(
      'http://' + ip + ':8545'
    )
  )

  function s1(res) {
    console.log("SUCC: " + res);
    callback(null, res);
  }

  function f1(err) {
    console.log("ERR: " + err);
    callback(err, null);
  }

  web3.eth.getBlockNumber().then(s1, f1);
}