Es kann keine Verbindung zum EC2 Ethereum-Knoten von AWS Lambda hergestellt werden

Ich habe versucht, die Diskussion zu dieser ähnlichen Frage fortzusetzen: Verbindungsfehler – Verbindung zum Ethereum-Knoten auf AWS unter http://xx.xxx.xx.xxx:8545 konnte nicht hergestellt werden . Mods sagten mir, ich solle ein neues erstellen, also los geht's.

Ich habe eine EC2-Instanz, auf der ein Ethereum-Knoten ausgeführt wird (in meinem Fall Parität). Die Instanz ist für die Welt öffentlich. Ich kann zu Hause einen einfachen Code auf meinem lokalen Computer ausführen und eine Verbindung zur AWS-Instanz herstellen:

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

Dies funktioniert problemlos von jedem Computer, der eine Verbindung zum Internet herstellen kann.

Ich möchte eine Lambda-Funktion einrichten, die eine Web3-Verbindung zu diesem Knoten herstellen kann. Ich habe eine einfache Funktion wie diese ausprobiert:

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
    })
  )
}

Wenn ich das ausführe, bekomme ich immer den Fehler:

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

Ich habe alles versucht und verifiziert, dass Lambda mit dem EC2 kommunizieren kann, indem es eine HTTP-Anforderung bedient (sie befinden sich in derselben VPC). Ich habe versucht, die private IP anstelle der öffentlichen, DNS anstelle der IP-Adresse, alles zu verwenden.

Ich habe gelesen, dass die Leute in der Lage waren, Verträge mit Lambda-Funktionen aufzurufen, also denke ich, dass dies möglich sein muss.

Irgendwelche Ideen, was wir ausprobieren können?

Antworten (2)

Ich habe auf das neueste Web3 (1.0.0 Beta) aktualisiert und irgendwie wurde das Problem gelöst.

Bitte beachten Sie, dass web3 zwischen 0.20 und 1.0.0-beta31 von synchron zu asynchron geändert wurde.

So habe ich es mit web3@1.0.0-beta.31 zum Laufen gebracht

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