【问题标题】:Database connection hanging on AWS Lamda挂在 AWS Lambda 上的数据库连接
【发布时间】:2018-12-04 20:06:00
【问题描述】:

我正在尝试使用 Go 在 AWS Lambda 中进行基本的数据库连接,但由于某种原因,它卡在了 db.prepare() 并且 cloudwatch 中没有显示日志。

func Handler(request Request) (Response, error) {

    db, err := sql.Open("mysql", dbUsername+":"+dbPassword+"@tcp("+dbURL+":"+dbPort+")/"+dbName)
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    stmt, err := db.Prepare("SELECT id, password FROM package_passwords WHERE password = ?")
    return Response{
        Message: "rows",
        Ok:      false,
    }, nil
}

奇怪的是,上面的代码在 AWS Lambda 中停留了至少 5 秒以上,而在普通的 go run/go build 中运行良好。

【问题讨论】:

  • 这不是回答您的问题,而是:您是否将密码以纯文本格式保存在数据库中?
  • 是的,它存储为计划文本。并且相同的 go 语法在普通 go 构建中有效,但在 AWS Lambda 中无效
  • 这又与您最初的问题无关。但我强烈建议您使用密码加密。
  • 感谢您的建议!这实际上是不好的命名,因为这些 base32 文本的目的是为了兑换某些东西,而那些应该被命名为兑换代码或其他东西。
  • 啊,好的。那么这些只是令牌。有道理。

标签: mysql go aws-lambda


【解决方案1】:

可能是 AWS 安全组

lambda 尝试连接,但安全组将其超时,因为他们永远阻止它

将 AWSLambdaVPCAccessExecutionRole 策略附加到您的 lambda 并确保 Lambda 位于 VPC 中。检查数据库安全组是否允许从 VPC 访问

这个问题还有一些指针Allow AWS Lambda to access RDS Database

【讨论】:

  • 谢谢。 VPC 正是 Lambda 被阻止并且没有登录 Lambda 端的原因。因为我还在编码,所以我将 Lambda 函数放在了我的默认 VPC 中。另一方面,RDS 已准备好并放入特定的 VPC。将我的函数添加到该数据库的 VPC 后,它工作正常。
  • 很高兴听到这个消息。希望这可以帮助其他人避免这个问题!
【解决方案2】:

如果是 RDS 操作,我认为它正在超时。 lambda 函数的默认超时为 6 秒,因此在 RDS 操作完成之前它会超时。为避免这种情况,您不必增加超时。取而代之的是,您可以将“callBackWaitsForEmptyEventLoop”设置为 false 作为 lambda 函数中的第一行代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 2017-11-26
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    相关资源
    最近更新 更多