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

时间:2020-01-14 18:09:03

标签: node.js amazon-web-services sequelize.js amazon-elastic-beanstalk

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

我正在遵循the documentationother 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

3 个答案:

答案 0 :(得分:1)

我通过在signup( @Field("userId") String userId, @Field("email") String email, @Field("firstName") String firstName, @Field("lastName") String lastName, @Field("password") String password, @Field("confirmPassword") String confirmPassword ); 中运行命令来解决此错误

文件:

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

.signup(firstName, lastName, email, password, confirmPassword, userId);

然后

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

.ebextension/config_file.sh

它对我有用!

答案 1 :(得分:0)

我遇到了完全相同的问题,经过数小时的调试各种日志后,我发现这是我需要实际查看的日志,以隔离后续迁移的真正问题。来自原始问题的 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 对我来说并不是很有帮助。

答案 2 :(得分:0)

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

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

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 进入弹性 beantalk 服务器
步骤 4) 通过运行 node 确认已安装 node -v
步骤 5) 进入应用目录,cd /var/app/current
步骤 6) 通过 sequelize 安装 npm i sequelize
步骤 7) 最后,运行您的迁移,./node_modules/.bin/sequelize db:migrate