在弹性 beantalk 部署上的 ec2 微型实例上创建交换文件/驱动器

Posted

技术标签:

【中文标题】在弹性 beantalk 部署上的 ec2 微型实例上创建交换文件/驱动器【英文标题】:creating a swap file/drive on ec2 micro instance on elastic beanstalk deploy 【发布时间】:2014-02-23 09:34:26 【问题描述】:

所以我的应用程序安装和部署都很好,只要我把它放在比 micro 更大的实例上。

当我在 composer 尝试安装时在 micro 上部署时,我收到一个关于无法分配足够内存的 php 错误。所以我做了一些谷歌搜索,似乎您可以在启动/创建实例时创建交换文件/磁盘这里有两个教程onetwo

这些可能已经过时了,所以第一个问题是这还能做吗?

第二个问题是如何创建 .ebextensions 文件以在部署时实现这一点?

这是我的尝试,但并不令人惊讶,因为我对此知之甚少。

commands:
command:dd if=/dev/zero of=/swapfile bs=1M count=3072
command:mkswap /swapfile
command:swapon /swapfile

【问题讨论】:

切向相关:确保将 composer.lock 文件与您的应用程序一起部署。这将减少 Composer 所需的内存量。 【参考方案1】:

您可以创建一个预部署挂钩以通过 ebextensions 设置交换。 在您的项目根目录中创建一个.ebextensions 文件夹。在该文件夹中,创建一个文件0001_setup_swap.config,其内容如下:

commands:
  create-pre-dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/pre"
    ignoreErrors: true

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/pre/0001_setup_swap.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash

      SWAPFILE=/var/swapfile
      SWAP_MEGABYTES=2048

      if [ -f $SWAPFILE ]; then
        echo "Swapfile $SWAPFILE found, assuming already setup"
        exit;
      fi

      /bin/dd if=/dev/zero of=$SWAPFILE bs=1M count=$SWAP_MEGABYTES

      /sbin/mkswap $SWAPFILE
      /sbin/swapon $SWAPFILE

      echo 10 | sudo tee /proc/sys/vm/swappiness
      echo vm.swappiness = 10 | sudo tee -a /etc/sysctl.conf

      /bin/chown root:root $SWAPFILE
      /bin/chmod 600 $SWAPFILE

有关更多信息,请参阅:https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-12-04、http://steinn.org/post/elasticbeanstalk-swap/

【讨论】:

【参考方案2】:

在机器上运行 Composer 需要相当多的资源,尤其是 RAM。

我了解到,在 EC2 微型实例上使用交换空间会适得其反,因为 a) 它是缓慢的交换空间,并且 b) 使用它会计入 IO,而 IO 也必须支付,这会导致下个月出现意外账单.

使用 Composer 部署任何东西的正确方法是在将代码部署到机器之前安装所有依赖项,然后一次性同步。这样你就可以独立于实例的有限资源,因为你可以使用一些强大的部署机器(我打赌你的开发机器可以做到)。您还可以防止由于某些所需库的托管已关闭(曾经经历过 Github 停机时间?)而导致站点损坏,因为您会在部署服务器上检测到这一点,而不是在实时机器上。此外,Composer 会缓存任何下载的内容,这也可能超出微型实例上的有限资源 - 或者至少将其用于非生产性的事情。

【讨论】:

Re "b) 使用它计入 IO 也必须付费" - 我似乎无法找到将实例存储用于交换空间的情况,有什么想法吗?我的印象是 Instance Store IO 是免费的,因为它“位于物理连接到主机的磁盘上” 我对 AWS 及其账单明细一无所知。 考虑到答案是 2 岁,我想我用来回答的来源已经提到了。现在做一些谷歌搜索,我发现很多“向 EC2 添加交换”的引用表明存在“正确”的方式和错误的方式,我想说我当时可能只读到了错误的方式。跨度> 我可能已经找到了这样的答案:***.com/a/22247782/1627406 Ok: "交换应该在实例存储(临时)磁盘而不是 EBS 设备上进行。交换会导致大量 IO 并会增加 EBS 的成本。EBS 也比实例慢存储和实例存储随 EC2 实例免费提供。”通过***.com/a/22247782/1627406 - 有道理,感谢您的发现,Sven【参考方案3】:

没有尝试创建交换,所以我无法回答您的第一个问题。但请注意,.ebextensions 文件是 YAML 文件。这意味着空格和语法对于事情的正常工作极其很重要......

您的示例的语法有点偏离。应该类似于(参见here):

commands:
    000_dd:
        command: dd if=/dev/zero of=/swapfile bs=1M count=3072
    001_mkswap:
        command: mkswap /swapfile
    002_swapon:
        command: swapon /swapfile

命令按字母顺序执行,因此最好在它们前面加上一个数字。

确保您能够登录到您的 EC2 实例,并密切关注 /var/log/cfn-init.log 文件。这会告诉你会发生什么。什么没有按预期工作...... ;-)

祝你好运!

【讨论】:

以上是关于在弹性 beantalk 部署上的 ec2 微型实例上创建交换文件/驱动器的主要内容,如果未能解决你的问题,请参考以下文章

我的 ec2 实例中乘客日志文件的位置(弹性 beantalk + rails)

由弹性 beantalk 生成的 ec2 实例的默认用户名

Jenkins 部署到弹性 beantalk

如何将自签名证书分配给 AWS 弹性 beantalk 应用程序

在 AWS 弹性 beantalk 上部署 Flask 应用程序

通过弹性 beantalk 部署的 Node 应用程序的问题