我在 AWS 上设置了一台 Web 服务器(WS-1)和一台 NFS 服务器(NFS-1)。WS-1 由弹性负载均衡器管理,并且可自动缩放。它还在 /var/www 上安装了一个 EBS,其中包含所有应用程序代码。
在自动缩放期间,如果启动了另一个 WS-X,/var/www 挂载的 EBS 是否也会被克隆并附加到该卷?如果没有,除了在根 EBS 卷上托管代码外,我还有什么选择?
NFS 内部的访问是根据 IP 定义的,例如 10.0.0.1/32(rw,...)。在自动扩展期间,将启动更多实例,我如何允许它们连接到 NFS 服务器并挂载共享目录?我不想使用 NFS 授予对私有 IP 子网的访问权限,而在安全组级别,我已将对 NFS 服务器的访问权限授予 0.0.0.0/0。NFS 服务器使用固定端口,例如 111、2049、4000-4002。
答案1
在扩展时,EBS 卷及其数据不会被“克隆”。要实现此行为,您需要在启动时自动执行此操作。
- 获取 WS-1 EBS 卷的最新快照
- 创建并附加卷
另一种方法是将其从 S3 中拉下来,具体取决于 EBS 上的数据量。
使用安全组,您可以允许 app_security_group 中的任何服务器访问 nfs_server_group 中的任何服务器。这将允许您动态更新安全组。
希望这是有意义的。
答案2
仅当您最近为实例拍摄了 AMI(Amazon Machine Image)时,您的实例才会被“克隆”。自拍摄快照以来,您的文件系统可能会发生一些变化,因此最好使用AWS 用户数据创建一个 Bash/CloudInit 脚本,它将触发对将要发生变化的区域(例如代码库、媒体等)的更新。
更新某些区域的选项可以是以下任一项(列出优点和缺点):
- S3 上的中央存储点
- 访问存储桶的权限通过您分配给实例的 IAM 角色进行管理
- AWS 服务之间的快速 I/O 带宽
- 持续正常运行
- 缺点:除非你使用存储桶版本控制,您无法获得源代码控制提供的修订灵活性
- 用于引导数据的源代码控制(Git、Subversion)存储库:
- 允许您通过源代码控制动态更新引导脚本,并拥有贡献和历史记录等
- 缺点:需要与 Git 主机建立(潜在的)外部连接,并需要权限和安全组配置才能实现这一点
- 缺点:可能比 S3 慢一点
以下是引导脚本的示例,您可以将其应用于启动配置,以触发它动态执行引导任务。请注意,用户数据脚本以 root 用户身份执行。
#!/bin/bash
# Update your packages
yum update -y
# Get/execute bootstrapping
cd /tmp
git clone ssh://your-git-server/bootstrapping-repo.git
chmod +x /tmp/your-repo/bootstrapping.sh
# Execute it
/tmp/your-repo/bootstrapping.sh
# Remove the bootstrapping script remnants
rm -rf /tmp/your-repo
此方法使您可以灵活地根据需要随时更新“bootstrapping-repo”,而无需定期创建新的 AMI。
在背景中,我使用用户数据中的 S3 来获取相关的 SSH 密钥、主机文件等,并使用 Git 作为引导存储库。
尽可能定期更新 AMI 并将其保存到启动配置中也是一个好主意,这样启动的新实例就不必花太长时间进行自我更新。您是时不时手动执行此操作还是编写脚本通过 API 或 CLI 执行此操作取决于您。
供参考:实例启动时调用的用户数据和后续脚本的输出将记录到文件中/var/log/cloud-init-output.log