通过Terraform管理的ElasticBeanstalk环境中如何为EC2自动挂载EFS?
解决方案核心思路
ElasticBeanstalk原生支持通过.ebextensions目录下的配置文件定义实例启动时执行的自定义操作,完全适配EB自主管理EC2生命周期的场景,弹性扩容新生成的实例也会自动执行该配置,无需单独声明EC2资源、也不需要使用remote-exec。
具体实现步骤
- 首先在你的应用部署包根目录创建
.ebextensions文件夹,新增efs-mount.config配置文件,配置内容可自定义安装NFS依赖、执行EFS挂载、写入fstab实现开机自动挂载的全流程逻辑 - Terraform侧不需要修改EB资源的核心定义,只需保证你部署的应用版本包包含上述
.ebextensions目录即可,也可以通过Terraform的aws_elastic_beanstalk_application_version资源直接关联包含该配置的应用版本 - 额外需要配置EB实例的安全组放行EFS的NFS端口(2049)入站规则,同时保证EC2和EFS网络可达(同VPC或者已配置跨VPC访问)
.ebextensions配置文件示例
.ebextensions/efs-mount.config的yaml配置参考如下,替换对应参数即可直接使用:
files: "/opt/ebextensions/mount_efs.sh": mode: "000755" owner: root group: root content: | #!/bin/bash EFS_ID="替换为你的EFS文件系统ID" MOUNT_POINT="替换为你要挂载的目标路径,比如/data/efs" AWS_REGION="替换为你的资源所属区域,比如cn-north-1" # 安装nfs客户端,Amazon Linux 2023请将yum替换为dnf yum install -y nfs-utils # 创建挂载目录 mkdir -p ${MOUNT_POINT} # 执行挂载 mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 ${EFS_ID}.efs.${AWS_REGION}.amazonaws.com:/ ${MOUNT_POINT} # 写入fstab实现开机自动挂载 echo "${EFS_ID}.efs.${AWS_REGION}.amazonaws.com:/ ${MOUNT_POINT} nfs4 nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 0 0" >> /etc/fstab commands: 01_mount_efs: command: "/opt/ebextensions/mount_efs.sh" ignoreErrors: false
Terraform侧配套配置参考
需要补充安全组规则放行EFS访问,示例代码:
resource "aws_security_group_rule" "eb_access_efs" { type = "ingress" from_port = 2049 to_port = 2049 protocol = "tcp" security_group_id = aws_efs_file_system.your_efs_sec_group.id # 替换为你的EFS绑定的安全组ID source_security_group_id = aws_elastic_beanstalk_environment.your_env.instance_security_group # 替换为你的EB环境实例安全组ID }
内容的提问来源于stack exchange,提问作者user3454396
相关产品推荐
相关产品推荐

