Windows上的Beanstalk:如何防止重新部署时运行命令?

Windows上的Beanstalk:如何防止重新部署时运行命令?,windows,amazon-web-services,amazon-elastic-beanstalk,Windows,Amazon Web Services,Amazon Elastic Beanstalk,我试图利用AWS Elastic Beanstalk的功能来定制它创建的EC2实例。这需要创建一个新的 您可以指定在将应用程序部署到实例时应执行的许多命令。我使用它来安装一些msi文件,并配置EC2为实例分配一个唯一的名称。然后需要重新启动 我的问题是,我只希望在第一次部署实例时运行这些命令。当我仅将代码更改部署到现有实例时,不应运行这些实例 我尝试过使用“test”参数,这会阻止命令运行。我创建一个文件作为最后一个命令,然后在“test”参数中检查该文件是否存在。但它似乎不起作用 我的配置文件

我试图利用AWS Elastic Beanstalk的功能来定制它创建的EC2实例。这需要创建一个新的

您可以指定在将应用程序部署到实例时应执行的许多命令。我使用它来安装一些msi文件,并配置EC2为实例分配一个唯一的名称。然后需要重新启动

我的问题是,我只希望在第一次部署实例时运行这些命令。当我仅将代码更改部署到现有实例时,不应运行这些实例

我尝试过使用“test”参数,这会阻止命令运行。我创建一个文件作为最后一个命令,然后在“test”参数中检查该文件是否存在。但它似乎不起作用

我的配置文件如下所示:

# File structure documented at http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-windows-ec2.html
files:
  "C:\\Users\\Public\\EnableEc2SetComputerName.ps1":
    source: "[File Source]"
commands:
  init-01-ec2setcomputername-enable:
    test: cmd /c "if exist C:\\Users\\Public\\initialised (exit 1) else (exit 0)"
    command: powershell.exe -ExecutionPolicy Bypass -File "C:\\Users\\Public\\EnableEc2SetComputerName.ps1"
    waitAfterCompletion: 0
  init-05-reboot-instance:
    test: cmd /c "if exist C:\\Users\\Public\\initialised (exit 1) else (exit 0)"
    command: shutdown -r # restart to enable EC2 to set the computer name
    waitAfterCompletion: forever
  init-06-mark-initialised:
    test: cmd /c "if exist C:\\Users\\Public\\initialised (exit 1) else (exit 0)"
    command: echo initialised > C:\\Users\\Public\\initialised
    waitAfterCompletion: 0
有没有其他方法可以实现这一点?还是我在做傻事


在基于Unix的系统上,有
touch
test
命令(在询问Unix系统的等效问题时提到)。在Windows中,在这种情况下最有效的等价物是什么?

基本上,不是。Elastic Beanstalk是一种抽象,为您提供底层基础设施。您放弃了大量的环境控制,获得了更轻松的部署。如果您研究CloudFormation,特别是元数据和cfn init/cfn hup,您会看到beanstalk
文件和
命令的结构非常相似

如果您需要在应用程序定制之外进行实例定制,那么您可能使用了错误的工具,并且必须使用笨拙的变通方法(直到AWS提供触摸/测试)云形成脚本可能更合适

我写了关于如何去做,还有它本身

考虑到您已经完成了所有与命令相关的艰苦工作,我认为转换为云形成脚本并将一次性启动代码链接到用户数据是非常容易的

**编辑-我想如果你选择弹性豆茎,你可以这样做
command:dir initialized | | powershell.exe-ExecutionPolicy Bypass-File“C:\\Users\\Public\\EnableEc2SetComputerName.ps1”

我认为问题在于,您在写入初始化文件之前正在重新启动机器。您应该能够使用一个bat文件,该文件首先写入信号量,然后重新启动实例,并在信号量存在时临时运行该.bat文件

您可以使用
files:source:
指令下载.bat文件,也可以使用
files:content:
指令在.config中编写它


否则,您的
测试:
行看起来不错(我在本地测试了它们,没有重新启动)。

我最近遇到了一个非常类似的问题,并利用上面Jim Flanagan的答案创建了一个PowerShell脚本来完成这项工作

#  restarts the server if this is not the first deployment
 param (

 )


$strFileName="C:\Users\Public\fwinitialised.txt"
If (Test-Path $strFileName){
  #This file was created on a previous deployment, reboot now.
  Restart-Computer -Force
}Else{
  # this is a new instance, no need to reboot.
  New-Item $strFileName -type file 
}
在.ebextensions文件中

6-reboot-instance:
    command: powershell.exe -ExecutionPolicy Bypass -File "C:\\PERQ\\Deployment\\RestartServerOnRedeployment.ps1" 
    waitAfterCompletion: forever

可能是@JimFlanagan的重复谢谢,但您的答案似乎是Unix特有的:我尝试了您概述的方法,但在Windows上失败了。我更新了我的问题,强调这是Windows特有的。我喜欢(cmd/c“如果存在的话)技巧非常有用,也使用了我的部署脚本事实上-我认为这是一个比我更好的答案。仔细观察-如果你添加waitAfterCompletion,你可以确保它在重新启动之前完成-这可能能够避免批处理文件,并且不会太多地更改你的脚本。从我可以告诉亚马逊正在朝着这个方向发展为了提供这种定制,Beanstalk需要提供更多的云形成功能对不起,速度太慢了,但是你能解释一下“dir initialized | | powershell.exe…”语法应该做什么吗?dir initialized搜索“initialized”文件。如果找不到,则执行powershell.exe脚本。(如果确实找到了,您可以使用&&而不是| |)了解更多信息