在使用 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 的文章在 EC2 实例上记录用户数据脚本输出:
最近的 Ubuntu AMI 仍然将用户数据脚本发送到控制台 输出,因此您可以远程查看它,但它不再可用 实例上的系统日志。控制台输出仅更新了一些 实例启动、重新启动或终止后几分钟,这会强制 您要等待查看用户数据脚本的输出,而不是 捕获快照后可能出现的输出。
根据您的设置,您可能希望立即将日志发送到像 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
将其放入用户数据中
touch /tmp/file2.txt
实例启动后,您可以检查文件是否创建。据此你可以判断用户数据是否被执行。
让您的用户数据在 ec2 的 /tmp 目录中创建一个文件以查看其是否有效:
鲍勃.txt:
#!/bin/sh
echo 'Woot!' > /home/ec2-user/user-script-output.txt
然后启动:
ec2-run-instances -f bob.txt -t t1.micro -g ServerPolicy ami-05cf5c6d -v
在 Amazon Linux 3 (2023) 上,EC2 用户数据执行日志位于
/var/log/cloud-init-output.log
运行:
猫
/var/log/cloud-init-output.log