弹性Beanstalk的配置和幂等性
要在Elastic Beanstalk中按照自己的需求进行扩展,调整.ebextensions是必不可少的,但如果写法不正确,可能会导致功能无法正常运行或者反映效率降低的问题。
使用.ebextensions这种黑魔法
弹性Beanstalk在AWS的EC2上运行,通过编写.ebextensions配置文件,可以实现在EC2上可以做任何事情。换句话说,如果配置不当,环境可能会变得一团糟。
重要的概念是「幂等性」。
这类环境构建工具共同的一点是,在使用 Elastic Beanstalk 进行第二次或以后的更新时,EC2 实例将会被直接复用。
-
- 最初の環境構築…ベースになるEC2の上にアプリケーションごとの設定を実行して反映させていく
- 2回目以降…すでにある環境に対して、設定をさらに反映していく
在写.ebextensions文件时,需要确保不论使用哪种方式执行,都能够成功执行,这就要求具备幂等性。
不需要太在意的例子。
packages:
yum:
git: []
如果使用软件包管理器来进行安装,那么软件包管理器本身将保持幂等性(即使安装两次,第二次也只是不做任何操作),因此不需要特别考虑。对于数据库的种子数据等也可以在机制上使用幂等性的方法。
commands:
01-cp-zoneinfo:
command: cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
上述内容是为了时区设置而加入的,但即使在文件复制中进行多次覆盖,(尽管存在一些浪费),执行内容并无问题,所以每次都让它继续执行。
在某些情况下需要注意
在进行类似修改设置文件的情况下,如果多次执行会出现无法正常运行的情况。我们可以通过一些方法,例如“检查是否已经被修改”或者“在某处记录已执行的标志”,来避免多次执行。
commands:
create_post_dir:
command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
ignoreErrors: true
files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/97_conf_redis.sh":
mode: "000755"
owner: root
group: root
content: |
#!/usr/bin/env bash
if grep -E '^unix' /etc/redis.conf >/dev/null; then
exit
fi
sudo sed -i -e 's/^save /#save /g' /etc/redis.conf
sudo sed -i -e 's/^# unix.*$ //g' /etc/redis.conf
echo 'unixsocket /tmp/redis.sock' | sudo tee -a /etc/redis.conf >/dev/null
echo 'unixsocketperm 777' | sudo tee -a /etc/redis.conf >/dev/null
sudo chkconfig redis on
sudo service redis restart
在这里,我们将Unix插座添加到Redis,并且将/etc/redis.conf修改为禁用保存。但是,如果已经修改过,则会退出。
你不必在意就会动起来
如果要运行类似于”从远程下载并部署文件”的任务,无论执行多少次,从幂等性的角度来看都没有问题。然而,如果每次都要下载大文件,这将浪费网络带宽和时间等资源。因此,在已经下载过文件的情况下,采取”跳过处理”的措施可以提高效率。
注意事项:更新时请注意
如果你只是修改并更新.ebextensions,那么旧服务器上会保留之前的配置。因此,仅仅通过此方法进行配置可能会有遗漏并导致不能正常工作的危险性。所以,偶尔重新构建整个环境并确认是否存在问题可能是一个不错的选择。