Amazon ec2用户数据,它是如何工作的?

我们正在启动实例,并访问我们放置的用户数据。但是有人了解这个操作的内部原理吗(从亚马逊的角度) ?当我们传入用户数据时,数据在什么时候传输到 VM (这是 Xen 特性吗) ,它存储在哪里?

我首先想到的是,它被设置为 USER _ DATA env var,但是我们也可以将它作为文件传递。文件存放在哪里?它是通用于所有实例,还是根据 AMI 的不同而有所不同?

这本身不是问题,只是想知道亚马逊是如何做到这一点的。

用户数据截图: http://d.pr/GZlY

120938 次浏览

用户数据对实例来说是可用的,只需要在这个 URL 处发出一个简单的 HTTP 请求:

http://169.254.169.254/latest/user-data

Amazon EC2并不直接将这个用户数据放到实例上,尽管许多 AMI 都有指示实例自动下载和处理用户数据的代码。

参见:

AWS userdata 是您可以在启动时提供给实例的一组命令/数据。例如,如果您正在启动一个 ec2实例,并希望在新启动的 ec2上安装 docker,那么可以在 awsec2配置页的 userdata 字段中提供一组 bash 命令。

用例

这里 是一个很好地解释了 AWS 用户数据的例子,带有 < strong > < a href = “ https://www.youtube.com/watch? v = ZMgbBmlgA7k”rel = “ nofollow noReferrer”> 视频教程

为了大家的理解 很简单的例子

如果希望在计算机启动时创建文件 /tmp/testfile.txt,只需在 User data字段中添加以下两行。

#!/bin/bash
touch /tmp/testfile.txt

记住在你的命令之前把 #!/bin/bash放在顶部。

当您运行实例(LinuxAMI)时,您可以看到 /var/lib/cloud/instance/user-data.txt处的 User data字段内容

很抱歉提出这样一个老问题,但是这里似乎是提供这些额外信息的最佳地点。

大多数 AWS 文档都将用户数据描述为一个属性,用于放置实例生命周期启动脚本,也就是说,只有在实例首次启动时才需要运行的东西。

通常情况是这样的,但是除了我之外,至少还有一个人希望在重启时执行不同的脚本,比如修复一个坏掉的密钥之类的。你猜怎么着... 你可以用用户数据做到这一点。

这是密码和 链接到 AWS 文档..。

Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0


--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"


#cloud-config
cloud_final_modules:
- [scripts-user, always]


--//
Content-Type: text/x-shellscript; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="userdata.txt"


#!/bin/bash
/bin/echo "Hello World." >> /tmp/sdksdfjsdlf
--//

我找不到任何关于这种用户数据格式的文档来允许这种情况发生。我试过了,很管用。我试过看看它是否能在每个创业公司上运行,它确实可以。

所以,如果你认为你需要这样做,我建议你备份。确保您有原始用户数据的副本,并使用修改后的代码,并在下次停止实例时删除代码(以避免脚本的多次运行)。

#!/bin/bash
yum update -y
yum install httpd -y
echo "<html><h1>webpage 1(whatever you want, give the page name here)</h1></html>"
/var/www/html/index.html
service httpd start
chkconfig httpd on

免责声明: 本答案中所有内容均为公开信息。

根据他们关于用户数据的文档 ,AWS 在内部使用 Cloud-init。如果在用户数据脚本仍在运行时运行 ps aux | grep cloud-init,您可以看到一些有趣的进程和实际的命令(您可以通过检查 tail -F /var/log/cloud-init-output.txt的输出来验证这一点)。完成后,最后一行对我说“ Cloud-init v. 19.3-44。Amzn2完成于2021年12月23日星期四02:16:48 + 0000。数据源 DataSourceEc2。上升111.63秒”)。

root      3689  3.6  3.2 149792 32692 ?        Ss   02:15   0:00 /usr/bin/python /usr/bin/cloud-init modules --mode=final
root      3705  0.0  0.2  13640  2548 ?        S    02:15   0:00 /bin/sh -c (umask 0026; tee -a /var/log/cloud-init-output.log)
root      3706  0.0  0.0  13640   208 ?        S    02:15   0:00 /bin/sh -c (umask 0026; tee -a /var/log/cloud-init-output.log)
root      3707  0.0  0.0   4236   736 ?        S    02:15   0:00 tee -a /var/log/cloud-init-output.log
ec2-user  3725  0.0  0.0 119420   916 pts/0    S+   02:15   0:00 grep --color=auto cloud-init

cat /usr/bin/cloud-init显示

#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'cloud-init==19.3','console_scripts','cloud-init'
__requires__ = 'cloud-init==19.3'
import re
import sys
from pkg_resources import load_entry_point


if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
sys.exit(
load_entry_point('cloud-init==19.3', 'console_scripts', 'cloud-init')()
)