在 Elastic Beanstalk 中运行时出现 Sequelize 迁移错误

Posted

技术标签:

【中文标题】在 Elastic Beanstalk 中运行时出现 Sequelize 迁移错误【英文标题】:Sequelize migrations error while running in Elastic Beanstalk 【发布时间】:2020-05-01 12:21:50 【问题描述】:

我正在尝试让 Sequelize 迁移在每次部署到 Elastic Beanstalk 时运行。

我正在听从 the documentation、other answers on Stack Overflow 的建议,甚至是我过去参与过的另一个项目,并且正在我的 /.ebextensions 文件夹中使用一个 .config 文件:

container_commands:
    00_node_binary:
        command: "ln -sf `ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin/node /bin/node"
    01_npm_binary:
        command: "ln -sf `ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin/npm /bin/npm"
    03_db_migrate:
        command: ./node_modules/.bin/sequelize db:migrate
        leader_only: true

当我尝试运行它时,我得到了这个错误:

ERROR   [Instance: i-06991b5ec3283038a] Command failed on instance. Return code: 127 Output: /bin/sh: ./node_modules/.bin/sequelize: No such file or directory.

我还需要做什么(在 .extensions、.elasticbeanstalk 文件或 EB 的软件配置设置中)以便 EB 可以找到此模块并运行此命令?

注意:上面的 ls -td 命令在我之前的项目中产生了这个结果:

/opt/elasticbeanstalk/node-install/node-v6.9.1-linux-x64

这导致我在当前项目中遇到问题:

/opt/elasticbeanstalk/node-install/node-v10.17.0-linux-x64

【问题讨论】:

【参考方案1】:

我通过运行.ebextension/config_file.sh中的命令解决了这个错误

文件:

“/opt/elasticbeanstalk/hooks/appdeploy/pre/config_file.sh”:

mode: "000755"
owner: root
group: root
content: |
  #!/bin/bash
  
  curl --silent --location https://rpm.nodesource.com/setup_12.x | sudo bash -
  
  sudo yum -y install nodejs

然后

在您的应用目录中的终端上运行命令:

./node_modules/.bin/sequelize db:migrate

它对我有用!!

【讨论】:

【参考方案2】:

我遇到了同样的问题,经过数小时的调试各种日志后,我发现这是我需要真正查看的日志,以隔离 sequelize 迁移的真正问题。原始问题中的 container_commands 脚本实际上是正确的,并且错误位于您的应用程序的其他地方。 (至少在我的情况下)

假设您已经使用 .elasticbeanstalk 和 .ebextensions 文件夹配置了 Elastic Beanstalk,其中 .ebextensions 文件夹包含一个名为 01_run_migrations.config 的文件,其中包含以下这些 container_commmands:

container_commands:
    00_node_binary:
        command: "ln -sf `ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin/node /bin/node"
    01_npm_binary:
        command: "ln -sf `ls -td /opt/elasticbeanstalk/node-install/node-* | head -1`/bin/npm /bin/npm"
    03_db_migrate:
        command: ./node_modules/.bin/sequelize db:migrate
        leader_only: true

调试日志

如果在运行 eb deploy 后部署失败,请尝试使用项目文件夹中的 eb ssh 来调试各种服务器日志。这里有两个日志有助于我查看 ssh 进入环境后的情况。

cat /var/log/cfn-init.log

cat /var/log/cfn-init-cmd.log

第二个导致我找到错误的确切堆栈跟踪源,结果证明是我的 sequelize config.js 文件配置错误。我正在使用 Postgres 并且错误地设置了我的生产配置。

看看 Sequelize config.js

如果您因为与配置 Postgres 相同的原因而收到此错误,那么这是由于您的生产环境的 sequelize config.js 文件配置错误。

没用



  database: process.env.RDS_DB_NAME,
  username: process.env.RDS_USERNAME,
  password: process.env.RDS_PASSWORD,
  host: process.env.RDS_HOSTNAME,
  logging: false,
  dialect: "postgres",
  dialectModule: require("pg"),
  port: process.env.RDS_PORT,
  maxConcurrentQueries: 100,
  dialectOptions: 
       ssl: "Amazon RDS",
       multipleStatements: true
  ,
  pool:  maxConnections: 5, maxIdleTime: 30 ,
  language: "en",

成功了


 database: process.env.RDS_DB_NAME,
 username: process.env.RDS_USERNAME,
 password: process.env.RDS_PASSWORD,
 host: process.env.RDS_HOSTNAME,
 logging: false,
 dialect: "postgres",
 port: process.env.RDS_PORT,
 maxConcurrentQueries: 100,
 ssl: "Amazon RDS",
 pool:  maxConnections: 5, maxIdleTime: 30 ,
 language: "en",

虽然,我不知道这是否会解决您的确切问题,但我希望分享这将帮助其他人更轻松地隔离和调试 Elastic Beanstalk container_commands 的问题。哦,我还应该注意,运行 eb logs 对我的情况并没有太大帮助。

【讨论】:

【参考方案3】:

我通过在弹性 beanstalk 服务器(通过 SSH)上安装 nodejsnpmsequelize 手动解决了这个问题(这对于生产部署来说不是最好的,但足以用于测试),由于某些奇怪的原因,我的项目中没有安装 sequelize。

第 1 步) 在您的本地环境中,在 .ebextensions 文件夹中编写一个 config_file.sh,并包含以下内容。

mode: "000755"
owner: root
group: root
content: |
  #!/bin/bash
  
  curl --silent --location https://rpm.nodesource.com/setup_12.x | sudo bash -
  
  sudo yum -y install nodejs

第 2 步) 运行 eb deploy 第 3 步) SSH 进入弹性 beanstalk 服务器 步骤 4) 通过运行 node -v 确认已安装 node 第 5 步) 进入应用目录,cd /var/app/current 第 6 步) 通过 npm i sequelize 安装 sequelize 第 7 步) 最后,运行迁移,./node_modules/.bin/sequelize db:migrate

【讨论】:

以上是关于在 Elastic Beanstalk 中运行时出现 Sequelize 迁移错误的主要内容,如果未能解决你的问题,请参考以下文章

推送到 Elastic Beanstalk 时出现 Rails 捆绑错误

上传 Flask 应用程序时出现 AWS Elastic Beanstalk 错误

部署到 Amazon Elastic Beanstalk 时出现信号量 CI 错误

将 asp.net core web api 部署到 aws elastic beanstalk 时出现错误 404

部署到 Elastic Beanstalk 时出现 JavaAgentDetector 错误

Spring Boot版本升级-在aws elastic beanstalk中部署时出现mysql错误