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

问题描述 投票:0回答:4

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

我遵循文档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

node.js amazon-web-services sequelize.js amazon-elastic-beanstalk
4个回答
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

它对我有用!


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

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

看看 Sequelize config.js

如果您收到此错误的原因与我配置 Postgres 的原因相同,那么这是由于您的生产环境的续集 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
对我的情况并没有多大帮助。


0
投票

我通过在弹性 beanstalk 服务器上(通过 SSH)安装

nodejs
npm
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 进入 Elastic beanstalk 服务器
步骤 4) 通过运行
node
确认已安装
node -v

第5步)进入应用程序目录,
cd /var/app/current

步骤 6) 通过
sequelize
安装
npm i sequelize

第 7 步) 最后,运行迁移,
./node_modules/.bin/sequelize db:migrate


0
投票

我也有类似的问题。最终我的

sequelize-cli
包作为开发依赖项包含在
devDependencies
中的
package.json
中。

当我运行

eb deploy
时,我也没有将node_modules与我的应用程序包一起发送。我让 Elastic Beanstalk 运行 npm 安装。查看 eb-engine.log,elasticbeanstalk 在安装时省略了开发依赖项
node_modules

/var/log/eb-engine.log

[INFO] Running command: /bin/su webapp -c npm --omit=dev install

所以,我所要做的就是:

  1. 将我的
    sequelize-cli
    包裹从
    devDependencies
    移出并放入我的
    dependencies
     中的 
    package.json
  2. 在本地运行
    npm install
    以更新
    package-lock.json
  3. 确认它位于我的锁定文件内
    dependencies
  4. 添加包含以下内容的
    .ebextensions/migrate.config
    文件:
container_commands:
  01_migrate_db:
    command: "npm run migrate"
    leader_only: true
  1. 将迁移脚本添加到我的
    package.json
    :
...
"migrate": "npx sequelize db:migrate",
...

一切似乎都适合该设置。

值得注意。我还在我的包中发送了一个

.env
,并且我的
.sequelizerc
运行了一个
dotenv.config()
,所以我确信 migrate 命令将具有它所需的 DATABASE_URL。我还没有通过 EB 环境变量测试过它。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.