Go-Ethereum
無法從 AWS Lambda 連接到 EC2 乙太坊節點
我試圖繼續討論這個類似的問題: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); }