Go-Ethereum

無法從 AWS Lambda 連接到 EC2 乙太坊節點

  • March 18, 2018

我試圖繼續討論這個類似的問題:Connection Error - Couldn’t connect to ethereum node on AWS at http://xx.xxx.xx.xxx:8545。Mods告訴我要創建一個新的,所以就這樣吧。

我有一個執行乙太坊節點的 EC2 實例(在我的例子中是 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 可以通過提供 HTTP 請求與 EC2 對話(它們在同一個 VPC 中)。我嘗試使用私有 IP 而不是公共 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);
}

引用自:https://ethereum.stackexchange.com/questions/27391