AWS Elastic Beanstalk - .ebextensions

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk - .ebextensions【英文标题】: 【发布时间】:2018-06-05 19:14:40 【问题描述】:

我的应用当前使用位于应用根目录中的名为“Documents”的文件夹。这是它存储支持文档、临时文件、上传文件等的地方。我正在尝试将我的应用程序从 Azure 移动到 Beanstalk,但我不知道如何授予此文件夹和子文件夹的权限。我认为应该使用 .ebextensions 来完成,但我不知道如何格式化配置文件。有人可以建议这个配置文件的外观吗?这是一个在 Windows/IIS 上运行的 ASP.NET 应用程序。

【问题讨论】:

您可能需要重新考虑这种方法。 Beanstalk 应用程序应该在 S3 服务中存储“文件”。他们提供 .NET SDK。看看:docs.aws.amazon.com/AmazonS3/latest/dev/… 【参考方案1】:

很遗憾,您不能使用 .ebextensions 来设置部署目录中文件/文件夹的权限。

如果您查看弹性 beanstalk 部署的事件挂钩: https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customize-containers-windows-ec2.html#windows-container-commands

您会发现commands 运行之前 ec2 应用程序和网络服务器设置,并且 container_commands 运行 ec2 应用程序和 Web 服务器设置完成,但您的应用程序版本部署之前。

解决方案是使用 wpp.targets 文件来设置必要的 ACL。 以下SO帖子最有用 Can Web Deploy's setAcl provider be used on a sub-directory?

【讨论】:

【参考方案2】:

下面给出的是示例 .ebextensions 配置文件,用于创建目录/文件并修改权限并向文件添加一些内容

====== .ebextensions/custom_directory.config ======

commands:
  create_directory:
    command: mkdir C:\inetpub\AspNetCoreWebApps\backgroundtasks\mydirectory
    command: cacls C:\inetpub\AspNetCoreWebApps\backgroundtasks\mydirectory /t /e /g username:W
files:
 "C:/inetpub/AspNetCoreWebApps/backgroundtasks/mydirectory/mytestfile.txt":
   content: |
     This is my Sample file created from ebextensions

ebextensions 通过名为 .ebextensions 的目录进入应用程序源代码的根目录。有关如何使用 ebextensions 的更多信息,请查看文档here

【讨论】:

什么是“用户名:W”? W 是通用 IIS 用户吗? 我正在尝试使用 .ebextensions 让我的应用程序访问站点的根目录:命令:1_set_iuser_permissions:命令:cacls C:\\inetpub\\wwwroot /t /e /g DefaultAppPool: f 这在我发布时不起作用。如果我 RDP 并手动授予权限,一切正常。有什么建议吗?【参考方案3】:

将文件01_fix_permissions.config 放入.ebextensions 文件夹中。

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/49_change_permissions.sh":
mode: "000755"
owner: root
group: root
content: |
  #!/usr/bin/env bash
  sudo chown -R ec2-user:ec2-user tmp/

之后,您可以根据需要设置文件夹权限。

【讨论】:

【参考方案4】:

在 Serverfault 上查看 this answer。

您可以使用 platform hooks 在部署期间的不同点运行脚本,从而解决 Napoli 描述的 .ebextension 命令和平台命令的缺点。

官方是否支持这种设置似乎存在一些争议,但从AWS github上的cmets来看,似乎没有明确禁止。

我可以看到那不勒斯的回答可能是更标准的 MS 做事方式,但 wpp.targets 看起来像热垃圾 IMO。

该答案的一般方案是使用命令/平台命令将脚本文件复制到适当的平台挂钩目录(/opt/elasticbeanstalk/hooks 或 C:\Program Files\Amazon\ElasticBeanstalk\hooks\ )以运行在您想要的部署阶段。

我认为值得注意的是平台和版本之间存在差异,例如 Amazon Linux 1 和 Linux 2。

我希望这对某人有所帮助。我花了一天的时间来收集这些信息以及此页面上的内容,然后挑选出我最喜欢的内容。

编辑 11/4 - 我想指出,在重复部署期间尝试将脚本直接放入平台挂钩目录时,我发现文件 .ebextension 指令存在一些不一致之处。具体来说,File 指令未能正确移动名为 .bak/.bak1/etc 的备份副本。我建议使用容器命令将覆盖从另一个目录复制到所需的挂钩目录以解决此问题。

【讨论】:

以上是关于AWS Elastic Beanstalk - .ebextensions的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk CLI 安装错误

text AWS Elastic Beanstalk

HTTPS Elastic Beanstalk (AWS) 到 Android

AWS Elastic Beanstalk 无法担任角色

AWS Elastic Beanstalk

AWS Elastic Beanstalk chown PythonPath 错误