从 MySQL 数据库查询数据时 aws lambda 函数超时

Posted

技术标签:

【中文标题】从 MySQL 数据库查询数据时 aws lambda 函数超时【英文标题】:aws lambda function timed out when querying data from MySQL database 【发布时间】:2018-09-03 15:58:24 【问题描述】:

我有一个index.js 文件,其中包含如下代码:

const dbConfig = require('./config/dbConfig')
const mysql = require('mysql')

var con = mysql.createConnection(
  host: dbConfig.host,
  user: dbConfig.username,
  password: dbConfig.password,
  database: dbConfig.database
)

function readMessages (event, context, callback) 
  console.log('function triggered')
  con.connect((err) => 
    if (err) 
      console.error(err)
      callback(err)
     else 
      console.log('Connected!')
      con.query('SELECT * FROM Messages WHERE isDeleted = 0;', (err, result, fields) => 
        if (err) 
          console.error(err)
          callback(err)
         else 
          console.log(result)
          con.end()
          callback(null, result)
        
      )
    
  )


exports.handler = readMessages

代码正确地从 mysql 数据库中获取数据,并在我在本地机器上运行时将它们显示在屏幕上。

但是,当它在 aws-lambda 上运行时,我收到了 Task timed out after 7.01 seconds 错误。

代码及其依赖项打包在一个名为 app.zip 的文件中,然后上传到 aws-lambda。

app.zip
├── config
│   └── dbConfig.js
├── index.js
└── node_modules

我的函数打印的唯一日志消息是function triggered。我在云观察日志中找不到我的函数生成的其他日志消息。

为什么函数在 aws-lambda 上超时?

【问题讨论】:

【参考方案1】:

如果我不得不猜测这是一个权限问题,当您在本地运行时,它将从您的本地机器/环境中获取凭据 - 当您在 lambda 中运行它时,您需要为具有权限的 lambda 分配一个角色它需要访问mysql数据库。

另外,请确保 mysql 数据库可供兰巴访问 - 即您没有尝试通过 lambda 函数访问您机器本地的 mysql 数据库(我假设您使用的是 rds)。

【讨论】:

谢谢。你的猜测是对的。我没有为 lambda 函数正确设置 IAM 角色。 对了,你知道如何配置我的RDS的安全组的入站规则,使其可以被lambda函数访问吗?我不希望从任何地方都可以访问 RDS。 @Brian 您只需要允许来自您的 Lambda 安全组的入站流量到您的 RDS 实例。即,为入站规则指定一个安全组而不是 IP 地址。

以上是关于从 MySQL 数据库查询数据时 aws lambda 函数超时的主要内容,如果未能解决你的问题,请参考以下文章

从 AWS API Gateway Web 界面配置 AWS Lambda 时无法选择/查看 Lambda 函数

Lambda 在本地连接到 Aurora MySql - 部署到 AWS 时超时

从 MySQL 读取位数据类型并使用 AWS Glue 转换为 Redshift 的问题

Phonics 自然拼读法 ou ow oi oy au aw oo oo ea Teacher:Lamb

通过 EC2 连接到 AWS MySQL?

如何使用 AWS RedShift Spectrum 为 S3 存储建模以进行查询