处理实例用户数据 - Amazon Elastic Compute Cloud

处理实例用户数据

您可以使用实例用户数据来自定义您的实例。启动实例时,您可以将参数或脚本存储为用户数据。用户数据中的所有脚本将在您启动实例时运行。您可以将用户数据作为实例属性进行查看。您还可以通过实例元数据服务(IMDS)查看来自实例的用户数据。

注意事项
  • 用户数据会被视为非透明数据;您指定什么数据就会在检索时得到什么数据。由实例来解释用户数据并对其进行操作。

  • 用户数据必须采用 base64 编码。根据您使用的工具或 SDK,可能会为您执行 base64 编码。例如:

    • Amazon EC2 控制台可以为您执行 base64 编码或接受 base64 编码的输入。

    • 默认情况下,AWS CLI 版本 2 会为您执行二进制参数的 base64 编码。AWS CLI 版本 1 会为您执行 --user-data 参数的 base64 编码。

    • AWS SDK for Python (Boto3) 会为您执行 UserData 参数的 base64 编码。

  • 用户数据在进行 base64 编码之前的原始格式的大小限制为 16 KB。长度为 n 的字符串在进行 base64 编码之后的大小为 ceil(n/3)*4。

  • 在检索用户数据时,必须对其进行 base64 解码。如果您使用实例元数据或控制台检索数据,则会自动对数据进行解码。

  • 如果您停止实例,修改用户数据,然后启动实例,则在启动实例时,不会自动运行更新后的用户数据。对于 Windows 实例,您可以配置设置,这样更新后的用户数据脚本在您启动实例时运行一次,或者在每次重启或启动实例时运行。

  • 用户数据是一种实例属性。如果您从实例创建 AMI,则实例用户数据不包含在该 AMI 中。

启动时指定实例用户数据

您可在启动实例时指定用户数据。有关控制台说明,请参阅 启动时指定实例用户数据。有关使用 AWS CLI 的 Linux 示例,请参阅 用户数据和 AWS CLI。有关使用 Tools for Windows PowerShell 的 Windows 示例,请参阅 用户数据和 Tools for Windows PowerShell

修改实例用户数据

您可以修改具有 EBS 根卷的实例的用户数据。该实例必须处于已停止状态。有关控制台说明,请参阅 查看和更新实例用户数据。有关使用 AWS CLI 的 Linux 示例,请参阅 modify-instance-attribute。有关使用 Tools for Windows PowerShell 的 Windows 示例,请参阅 用户数据和 Tools for Windows PowerShell

从实例检索实例用户数据

要从实例中检索用户数据,请使用以下 URI 之一。要使用 IPv6 地址检索用户数据,必须将其启用,并且实例必须是在支持 IPv6 的子网中的 AWS Nitro 系统上构建的实例

IPv4

http://169.254.169.254/latest/user-data

IPv6

http://[fd00:ec2::254]/latest/user-data

请求用户数据时,按原样返回数据 (内容类型 application/octet-stream)。如果该实例没有任何用户数据,则请求将返回 404 - Not Found

示例:检索以逗号分隔的文本

该示例检索以逗号分隔文本形式指定的用户数据。

cURL

IMDSv2

[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data 1234,john,reboot,true | 4512,richard, | 173,,,

IMDSv1

[ec2-user ~]$ curl http://169.254.169.254/latest/user-data 1234,john,reboot,true | 4512,richard, | 173,,,
PowerShell

IMDSv2

PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data 1234,john,reboot,true | 4512,richard, | 173,,,

IMDSv1

PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} ` -Method PUT -Uri http://169.254.169.254/latest/api/token} -Method GET -uri http://169.254.169.254/latest/user-data 1234,john,reboot,true | 4512,richard, | 173,,,
示例:检索脚本

该示例检索以脚本形式指定的用户数据。

cURL

IMDSv2

[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/user-data #!/bin/bash yum update -y service httpd start chkconfig httpd on

IMDSv1

[ec2-user ~]$ curl http://169.254.169.254/latest/user-data #!/bin/bash yum update -y service httpd start chkconfig httpd on
Powershell

IMDSv2

PS C:\> [string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
PS C:\> Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/user-data <powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>

IMDSv1

PS C:\> Invoke-RestMethod -uri http://169.254.169.254/latest/user-data <powershell> $file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm") New-Item $file -ItemType file </powershell> <persist>true</persist>

从您自己的计算机检索实例用户数据

您可以从您自己的计算机检索示实例的用户数据。有关控制台说明,请参阅 查看和更新实例用户数据。有关使用 AWS CLI 的示例,请参阅 用户数据和 AWS CLI。有关使用 Tools for Windows PowerShell 的示例,请参阅 用户数据和 Tools for Windows PowerShell