在使用 EC2 命令行 API 创建新的 AWS EC2 实例时,我将一些用户数据传递给了新实例。
我如何知道该用户数据是否执行?
在使用 EC2 命令行 API 创建新的 AWS EC2 实例时,我将一些用户数据传递给了新实例。
我如何知道该用户数据是否执行?
您可以使用以下步骤进行验证:
/var/log/cloud-init.log
和/var/log/cloud-init-output.log
你可以看到你的用户数据脚本的所有日志,它也会创建/etc/cloud
文件夹。
在实例的引导过程中查看用户数据在执行时的样子可能对您也很有用。如果您从 CloudFormation 模板传入环境变量或标志,则尤其如此。您可以看到 UserData 如何以两种不同的方式执行:
1. 从实例内部:
# Get instance ID
INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
# Print user data
sudo cat /var/lib/cloud/instances/$INSTANCE_ID/user-data.txt
2. 从实例外部
注意:这仅在您配置 UserData shell 以输出其运行的命令时才有效。对于 bash,您可以按如下方式执行此操作:
"#!/bin/bash\n",
"set -x\n",
从 EC2 控制台右键单击 EC2 实例 -> 监控和故障排除 -> 获取系统日志。下载日志文件并查找如下所示的部分:
ip-172-31-76-56 login: 2021/10/25 17:13:47Z: Amazon SSM Agent v3.0.529.0 is running
2021/10/25 17:13:47Z: OsProductName: Ubuntu
2021/10/25 17:13:47Z: OsVersion: 20.04
[ 45.636562] cloud-init[856]: Cloud-init v. 21.2-3...
[ 47.749983] cloud-init[896]: + echo hello world
如果 UserData 配置如下:
"#!/bin/bash\n",
"set -x\n",
"echo hello world"
在Amazon EC2上调试用户数据脚本确实有点尴尬,因为通常没有办法主动挂钩该过程,因此理想情况下希望获得对用户数据脚本输出的实时访问权限,正如 Eric Hammond 的文章Logging user中所总结的那样EC2 实例上的 -data 脚本输出:
最近的 Ubuntu AMI 仍将用户数据脚本发送到控制台输出,因此您可以远程查看它,但它在实例的 syslog 中不再可用。控制台输出仅在实例启动、重新启动或终止后几分钟更新,这迫使您等待查看用户数据脚本的输出,并且不捕获快照后可能出现的输出。
根据您的设置,您可能希望立即将日志发送到像Loggly这样的远程日志记录工具,但是尽早安装它显然是一种鸡/蛋问题(尽管如果 AMI 恰好配置为所以已经)。
为您的用户数据启用日志记录
Eric Hammond 在“记录 EC2 实例上的用户数据脚本输出 (2010, Hammond) ”中建议:
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
注意> >
在语句开头的两个字符之间放置一个空格。
这是一个完整的用户数据脚本作为示例:
#!/bin/bash -ex
exec > >(tee /var/log/user-data.log|logger -t user-data -s 2>/dev/console) 2>&1
echo BEGIN
date '+%Y-%m-%d %H:%M:%S'
echo END
Have your user data create a file in your ec2's /tmp directory to see if it works:
bob.txt:
#!/bin/sh
echo 'Woot!' > /home/ec2-user/user-script-output.txt
Then launch with:
ec2-run-instances -f bob.txt -t t1.micro -g ServerPolicy ami-05cf5c6d -v
把它放在用户数据中
touch /tmp/file2.txt
实例启动后,您可以检查文件是否已创建。基于此,您可以判断用户数据是否已执行。