[英]AWS Lambda with RDS Postgresql - Unknown Issue
我已經為這個問題苦苦掙扎了 3 天,無法弄清楚出了什么問題。 我在我的 Lambda function 中將我所有的登錄憑據設置為環境變量。我的 RDS 實例對公眾開放,安全組也打開傳入和傳出端口。
我的 PostgresQL 代碼有很多變體,最新的一個來自這個AWS Lambda NodeJS 連接到 RDS Postgres 數據庫
我當前的 lambda 代碼
const pg = require('pg')
const pool = new pg.Pool()
async function query (q) {
const client = await pool.connect()
let res
try {
await client.query('BEGIN')
try {
res = await client.query(q)
await client.query('COMMIT')
} catch (err) {
await client.query('ROLLBACK')
throw err
}
} finally {
client.release()
}
return res
}
exports.handler = async (event, context, callback) => {
try {
const { rows } = await query("select 'thaison' as ")
console.log(JSON.stringify(rows[0]))
var response = {
"statusCode": 200,
"headers": {
"Content-Type" : "application/json"
},
"body": JSON.stringify(rows),
"isBase64Encoded": false
};
callback(null, response);
} catch (err) {
console.log('Database ' + err)
callback(null, 'Database ' + err);
}
};
我可以在pool.connect()
之前和之后成功執行console.log
。 我也可以在client.query()
之前但不能在之后使用console.log
。 問題出在client.query()
之后,什么也沒有發生。 我檢查了 Cloudwatch 日志和指標,日志上沒有任何內容,也沒有任何錯誤報告。 代碼必須在某處失敗,但我無法弄清楚在哪里。 響應是 null,查詢后我無法記錄任何內容,甚至在catch(err)
塊中也沒有。 我做的最后一件事是將 PG 端點更改為甚至不存在的東西,但我仍然沒有收到任何錯誤。 這東西就這么默默的失敗了。
我究竟做錯了什么?
由於您使用的是Publicly Available = Yes
,數據庫的 DNS 名稱將解析為公共地址 IP 。 這意味着 Lambda function需要 Inte.net 訪問。
這可以通過不將 Lambda function 附加到 VPC 或通過將 Lambda function 附加到私有 su.net然后使用公共 su.net 中的NAT 網關提供對 Inte.net 的訪問來完成。 安全組應允許從0.0.0.0/0
進行訪問(這對安全性非常不利)。
配置此類系統的更“安全”的方法是:
Publicly Available = No
,這只會將 RDS 數據庫的 DNS Name 解析為私有地址 IPLambda-SG
),允許默認“允許所有”出站訪問RDS-SG
),允許在端口 5432 (PostgreSQL) 上進行入站訪問, Source = Lambda-SG
也就是說, RDS-SG
Lambda-SG
。 這將允許 Lambda function 訪問 RDS 數據庫。
但是,請注意,RDS 數據庫只能從 VPC 內部訪問。 您將無法從您自己的計算機在 Inte.net 上連接到它(因為它現在更安全)。 如果需要,您可以使用帶有端口轉發的跳轉盒進行連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.