Я попытался продолжить обсуждение этого похожего вопроса: Ошибка подключения — не удалось подключиться к узлу 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, поэтому я думаю, что это должно быть возможно.
Любые идеи о том, что мы можем попробовать?
Я обновился до последней версии 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);
}