AWS EC2 用户数据 - 如何调试失败的 EFS 挂载失败

Posted

技术标签:

【中文标题】AWS EC2 用户数据 - 如何调试失败的 EFS 挂载失败【英文标题】:AWS EC2 user data - how to debug failed EFS mount failure 【发布时间】:2018-08-30 03:21:22 【问题描述】:

我在我的 EC2 实例 (Amazon linux AMI) 上使用 EFS 卷。如果我进入服务器并运行类似的内容,我可以毫无问题地安装卷:

sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 fs-xxxxxxxxx.efs.ap-southeast-2.amazonaws.com:/efs

但是如果我在我的实例的用户数据部分添加一个 shell 脚本并启动它,我什么也得不到,我该如何调试它?我可以查看文件系统中的一些日志或其他内容吗?我没有收到错误,只是没有安装驱动器。任何帮助表示赞赏。

我正在使用以下 shell 脚本:

#!/bin/bash
# Make sure all packages are up-to-date
yum update -y

# Make sure that NFS utilities and AWS CLI utilities are available
yum install -y jq nfs-utils python27 python27-pip awscli
pip install --upgrade awscli

# Name of the EFS filesystem (match what was created in EFS)
EFS_FILE_SYSTEM_NAME="xxxx.efs.ap-southeast-2.amazonaws.com"

# Gets the EC2 availability zone for the current ECS instance

EC2_AVAIL_ZONE="ap-southeast-2b"
# Gets the EC2 region for the current ECS instance

EC2_REGION="Asia Pacific (Sydney)"

# Creates the mount-point for the EFS filesystem
DIR_TGT="efs"
mkdir "$DIR_TGT"

# Get the EFS filesystem ID.
EFS_FILE_SYSTEM_ID="$(/usr/local/bin/aws efs describe-file-systems --region "$EC2_REGION" | jq '.FileSystems[]' | jq "select(.Name==\"$EFS_FILE_SYSTEM_NAME\")" | jq -r '.FileSystemId')"

if [ -z "$EFS_FILE_SYSTEM_ID" ]; then
    echo "ERROR: variable not set" 1> /etc/efssetup.log
    exit
fi

# Create the mount source path
DIR_SRC="$EC2_AVAIL_ZONE.$EFS_FILE_SYSTEM_ID.efs.$EC2_REGION.amazonaws.com"

# Actually mount the EFS filesystem
mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,soft,timeo=600,retrans=2 "$DIR_SRC:/" "$DIR_TGT"

# Create a backup of the existing /etc/fstab
cp -p "/etc/fstab" "/etc/fstab.back-$(date +%F)"

# Add the new mount point to /etc/fstab
echo -e "$DIR_SRC:/ \t\t $DIR_TGT \t\t nfs \t\t nfsvers=4.1,rsize=1048576,wsize=1048576,soft,timeo=600,retrans=2 \t\t 0 \t\t 0" | tee -a /etc/fstab

【问题讨论】:

DIR_TGT="efs" 需要是现有目录的绝对路径,例如DIR_TGT="/srv/efs" 【参考方案1】:

您可以在cloud-init-output.log 找到UserData 日志

/var/log/cloud-init.log and
/var/log/cloud-init-output.log

您的 EC2_REGION 应该是 ap-southeast-2 而不是 Asia Pacific (Sydney),由于您已经提到了端点名称,因此您不需要构造 EFS 端点。

mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,soft,timeo=600,retrans=2 "$EFS_FILE_SYSTEM_NAME:/" "$DIR_TGT"

如果要构造它,请使用以下EFS DNS Endpoint convention:

file-system-id.efs.aws-region.amazonaws.com

所以,应该是

DIR_SRC="$EFS_FILE_SYSTEM_ID.efs.$EC2_REGION.amazonaws.com"

【讨论】:

感谢您的全面回答。我现在正在编写代码来调试它。 嗨@Sudharsan,我在日志中看不到任何与未挂载的文件系统相关的内容。它似乎没有给我一个错误。只是驱动没有安装。还有哪里可以找到这些东西? 你看到你的echo了吗?您可以尝试手动运行脚本一次,看看是否有任何错误。

以上是关于AWS EC2 用户数据 - 如何调试失败的 EFS 挂载失败的主要内容,如果未能解决你的问题,请参考以下文章

如何调试在 AWS EC2 中运行的 Django 应用程序

启动 AWS EC2 实例时如何使用 bash 脚本运行 postgres?

如何在 AWS EC2 实例上预安装 sbt(通过用户数据)?

AWS EC2 向 RDS 发送 mysql_query 失败

AWS CodeDeploy Blue/Green with ASG - 失败的部署不断重启 EC2 实例

AWS EC2 Auto Scaling 同步如何自动工作?