7

我正在尝试利用 AWS Elastic Beanstalk 的工具来自定义它创建的 EC2 实例。这需要在 .ebextensions 目录中创建一个 .config 文件

您可以指定在将应用程序部署到实例时应执行的一些命令。我使用它来安装一些 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 的系统上,有touchand命令(在这个答案test中提到,询问 Unix 系统的等效问题)。在这种情况下,Windows 中的等效项是什么?

4

3 回答 3

4

I think the problem lies in the fact that you are rebooting the machine before you can write the initialized file. You should be able use a bat file which first writes the semaphore, then reboots the instance, and run that .bat file contingently on the existence of semaphore.

You can either download the .bat file with a files:source: directive or compose it in the .config with a files:content: directive.

Otherwise, your test: lines look good (I tested them locally, without a reboot).

于 2013-09-04T23:05:06.153 回答
3

本质上,没有。Elastic Beanstalk 是一种抽象,负责为您管理底层基础架构。您放弃了很多环境控制并获得了更轻松的部署。如果您研究 CloudFormation - 特别是元数据和 cfn-init / cfn-hup,您会在 beanstalkfilescommands http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide周围看到一个非常相似的结构/aws-resource-init.html

如果您需要在应用程序定制之外进行实例定制 - 那么您可能使用了错误的工具,并且不得不使用笨拙的解决方法(直到触摸/测试从 AWS 到达)Cloud Formation 脚本可能更适合。

我写了关于如何通过 cloudformation 配置 Windows 实例的文章,并且亚马逊本身也有大量文档。

鉴于您已经围绕命令完成了所有艰苦的工作,我认为转移到 Cloud Formation 脚本并将一次性启动代码插入 userdata 会很容易。

**编辑 - 我认为如果你使用弹性豆茎,你可以这样做 command: dir initialised || powershell.exe -ExecutionPolicy Bypass -File "C:\\Users\\Public\\EnableEc2SetComputerName.ps1"

于 2013-09-04T11:53:21.707 回答
1

我最近遇到了一个非常相似的问题,并利用上面 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
于 2015-10-27T11:17:06.930 回答