EC2 实例终止删除 EFS 卷文件夹

EC2 实例终止删除 EFS 卷文件夹

我有一个用于 WordPress 站点的 Elastic Beanstalk 环境,配置为使用 EFS 卷作为上传文件夹,在实例创建时安装和链接(随后本指南进行设置)。但是,当实例扩展/缩小时,它会以某种方式删除 EFS 卷上的上传文件夹,让我恢复之前所做的备份(这个-未回答-似乎是相关的。)

我的efs.config文件如下:

packages:
  yum:
nfs-utils: []
jq: []
files:
  "/tmp/mount-efs.sh" :
    mode: "000755"
    content: |
      #!/usr/bin/env bash
      mkdir -p /mnt/efs
      EFS_NAME=$(/opt/elasticbeanstalk/bin/get-config environment | jq -r '.EFS_NAME')
      mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 $EFS_NAME:/ /mnt/efs || true
      mkdir -p /mnt/efs/uploads
      chown webapp:webapp /mnt/efs/uploads
commands:
  01_mount:
    command: "/tmp/mount-efs.sh"
container_commands:
  00-mv-wp-content-uploads:
    command: rsync -a /var/app/ondeck/wp-content/uploads/ /mnt/efs/uploads/
  01-rm-wp-content-uploads:
    command: rm -rf /var/app/ondeck/wp-content/uploads
  02-symlink-uploads:
    command: ln -snf /mnt/efs/uploads /var/app/ondeck/wp-content/uploads
  03-chown-uploads:
    command: chown -h webapp:webapp /var/app/ondeck/wp-content/uploads

本质上,我正在做的事情是:

移动部署上传文件夹中的所有文件,删除该文件夹并将其替换为来自 EFS 的符号链接版本,并将其所有权更改为 Apache 用户。这似乎很简单,但 EFS 文件夹将被删除并替换为部署文件的任何内容。

我在容器命令下做错了什么吗?

答案1

好吧,这是一个很久以前就被问到的问题,我也遇到了同样的问题。搜索了好久也没找到答案。我找到了解决方案。。这里记录一下 :-)

你需要使用的是平台挂钩,这就是我完成所需设置并解决问题的方式。

  1. 在您的 AWS EB 配置中,创建一个 ENV 变量:EFS_NAME以其 EFS 名称作为其值。

  2. 在项目文件夹的根目录中,使用以下命令创建文件夹:

mkdir -p .platform/hooks/{predeploy,prebuild,postdeploy}

  1. 创建下面的文件,内容如下:

nano .platform/hooks/predeploy/001-efs

#!/usr/bin/env bash
yum -y install amazon-efs-utils jq
mkdir -p /mnt/efs
EFS_NAME=$(/opt/elasticbeanstalk/bin/get-config environment | jq -r '.EFS_NAME')
mount -t efs -o tls $EFS_NAME:/ /mnt/efs || true
mkdir -p /mnt/efs/wp-uploads
chown -R webapp:webapp /mnt/efs/wp-uploads
  1. 创建下面的文件,内容如下:

nano .platform/hooks/postdeploy/001-efs

#!/usr/bin/env bash

# Make suer, uploads folder is there.. Just in case:
mkdir -p /var/app/current/wp-content/uploads

# Copy files to mounted EFS, maybe from the initial setup, or a migrated one:
rsync -av /var/app/current/wp-content/uploads /mnt/efs/wp-uploads/

# Delete the uploads folder afterward:
rm -rf /var/app/current/wp-content/uploads

# Create a symbolic link to the mounted EFS folder:
ln -snf /mnt/efs/wp-uploads /var/app/current/wp-content/uploads

# Correct ownership of the symbolic link:
chown webapp:webapp -h /var/app/current/wp-content/uploads

这是我的完整代码。虽然可能不是最好的,但它可以完美地帮助您实现目标。

答案2

正如上面的评论者暗示的那样,问题在于 mount 命令失败(在本例中是由于安全组配置不正确)并且它后面的“|| true”掩盖了错误。

确保 EC2 实例的安全组允许所有端口上的出站流量(或至少,将 EFS 的安全组设置为目标的 NFS 端口),并且 EFS 的入站流量设置为允许 TCP 的 NFS 端口。完成此操作后,mount 命令应该会成功,并且上述说明应该会起作用。

相关内容