在 AWS ElasticBeanstalk 上部署 - 在启动服务器之前运行自定义 npm 脚本?

Posted

技术标签:

【中文标题】在 AWS ElasticBeanstalk 上部署 - 在启动服务器之前运行自定义 npm 脚本?【英文标题】:Deploy on AWS ElasticBeanstalk - run custom npm script before starting server? 【发布时间】:2018-12-29 15:29:17 【问题描述】:

我一直在尝试将我的 nuxt 通用应用程序部署到 AWS 弹性 beanstalk 上。我尝试在我的 package.json 中使用自定义 npm 脚本:

"scripts": 
 "dev": "nuxt",
 "build": "nuxt build",
 "start": "nuxt start",
 "generate": "nuxt generate",
 "precommit": "npm run lint",
 "deploy": "nuxt build && nuxt start"
,

然后在 AWS EB config 下,我添加了 Node 命令:npm run deploy

但是,它不起作用。

基本上,我需要告诉 EB 在“npm run start”之前运行“npm run build”

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

您所描述的位于 npm 领域,可以通过使用预启动脚本来解决,如下所示:

"prestart": "nuxt build"

更多详情:https://docs.npmjs.com/misc/scripts

【讨论】:

这似乎不是解决这个问题的正确方法......每当服务器重新启动时,它都必须先重建。应该有一些方法可以在 EB 部署之后和开始之前运行它【参考方案2】:

到目前为止,这对我有所帮助,它似乎适用于通用模式下的默认 nuxt 项目(nuxt create)。 我正在使用 Elastic Beanstalk、CodePipeline 和 Bitbucket。 CodePipeline 会从 Bitbucket 获取代码,一旦它被推送并构建在 Elastic Beanstalk 上。

对我有帮助的是添加到 package.json:

"deploy": "npm run build && npm run start"

 "deploy": "npm run install && npm run build && npm run start"

在项目根目录创建Procfile,Pocfile的content/command触发package.json文件中的部署脚本

web: npm run deploy

【讨论】:

【参考方案3】:

以前有“钩子”,但现在它们几乎已被弃用 https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/custom-platform-hooks.html

现在您可以使用此处描述的 Buildfile 和 Procfile https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/platforms-linux-extend.html

【讨论】:

您是否发现 AWS Linux 2 Node.js 平台支持 Buildfile?我们一直在努力解决与 OP 相同的问题,发现 Procfile 受支持,但是,在文档中并不清楚,Buildfile 似乎不受支持。来自文档:“如果平台支持,每个单独的平台主题都会特别提到 Buildfile 和/或 Procfile。” Node.js 平台只特别提到了 Procfile。我们发现钩子并不令人满意,因为它们不会在环境更新时再次被调用,即使应用程序似乎已取消部署。 似乎“自定义平台挂钩”已被弃用,但“平台挂钩”并非如此。 docs.aws.amazon.com/elasticbeanstalk/latest/dg/… 和 Node.js 环境似乎不支持 Buildfile。【参考方案4】:

尝试将“source_compile.config”文件添加到您的 .ebextensions 中,如下所示:

# source_compile.config
container_commands:
  compile:
    command: "./node_modules/.bin/nuxt build"
    env:
      PATH: /opt/elasticbeanstalk/node-install/node-v12.16.3-linux-x64/bin/

从部署到 Elastic Beanstalk 之前预编译 typescript nodejs 服务器的同样需要中得到这个想法 :) 这里有一个参考:

https://medium.com/@lhviet88/deploy-a-typescript-expressjs-into-elasticbeanstalk-nodejs-server-8381e00e7e52

【讨论】:

以上是关于在 AWS ElasticBeanstalk 上部署 - 在启动服务器之前运行自定义 npm 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

AWS::ElasticBeanstalk::ConfigurationTemplate 的 AWS CloudFormation 模板失败

在 AWS 上使用 ElastiCache 和 ElasticBeanstalk 配置 Redis

从在 ElasticBeanstalk 中运行的 Flask 应用程序使用 AWS

如何在 AWS elasticbeanstalk 上部署 symfony 3 项目

强制 https aws elasticbeanstalk

如何在 Elasticbeanstalk 环境中运行的 docker 容器中承担 AWS 角色?