亚马逊AWS官方博客

在 Amazon Lightsail 上创建、使用启动脚本并对其进行故障排除

此博文由 Amazon Lightsail 高级开发人员代表 Brian Graf 和 Sophia Parafina 撰写。

Amazon Lightsail 是一款虚拟专用服务器(VPS),用于部署操作系统(OS)和预先打包的应用程序,例如 WordPress、Plesk、cPanel、PrestaShop 等。部署这些实例时,您可以使用其他命令运行启动脚本,例如安装应用程序、配置系统文件或安装应用程序的必备组件。

在哪里添加启动脚本?

如果您使用 Lightsail 控制台部署实例,则可以在部署时将启动脚本添加到实例中。它们被添加到“部署实例”页面中:

Amazon Lightsail“部署实例”页面的图片

必须在部署实例之前添加启动脚本,因为启动脚本在部署后无法追溯运行。

Windows 启动脚本剖析

部署 Lightsail Windows 实例时,您可以在“启动脚本”文本框中使用批处理脚本或 PowerShell 脚本。 在这两个选项中,PowerShell 的可扩展性更强,并且在配置和控制方面的灵活性更佳。

如果您选择将启动脚本编写为批处理文件,则必须分别在代码的开头和结尾添加 <script></script> 标签。或者,PowerShell 中的启动脚本必须以类似的方式使用 <powershell></powershell> 标签。

在结束 </script></powershell> 标签之后,必须在下一行添加 <persist></persist> 标签。persist 标签用于确定该命令运行一次,还是在每次重启实例或从“停止”状态更改为“开始”状态时都运行。如果您希望脚本在每次重启或启动实例时都运行,则必须将 persist 标签设置为“true”。如果您想让启动脚本只运行一次,则可以将 persist 标签设置为“false”。

Linux 启动脚本剖析

与 Windows 启动脚本一样,Linux 启动脚本需要在文本框的第一行上添加特定代码才能在部署期间成功执行。您必须放置“#!/bin/bash”作为第一行代码,用于设置执行脚本其余部分的 Shell。在第一行代码之后,您可以继续添加其他命令来实现您想要的结果。

如何知道启动脚本是否成功运行?

尽管运行启动脚本可以方便地创建基准实例,但由于脚本错误或权限问题,您的实例可能无法达到所需的最终状态。您必须进行故障排除,才能了解启动脚本未成功完成的原因。要了解启动脚本是否成功运行,请参阅实例日志以确定启动脚本是否成功。

对于 Windows,可在以下位置找到启动日志:C:\ProgramData\Amazon\EC2-Windows\launch\Log\UserdataExecution.log。请注意,ProgramData 是一个隐藏文件夹,除非您从 PowerShell 或命令提示符访问该文件,否则必须使用 Windows 文件资源管理器(“查看”>“显示”>“隐藏的项目”)文件夹才能看到它。

对于 Linux,可以在 /var/log/cloud-init-output.log 中找到启动日志,并且可以在实例启动后通过在终端中键入以下内容来跟踪日志,从而对其进行监控:

tail -f /var/log/cloud-init-output.log

如果您想查看整个日志文件,包括在打开日志文件之前已经运行的命令,则可以在终端中键入以下内容:

less +F /var/log/cloud-init-output.log

在 Windows 实例上,监控 UserdataExecution.log 的一种简单方法是在启动脚本中添加以下代码,这将创建一个快捷方式,用于在执行命令时跟踪或监视日志:

# 创建日志监控脚本来监控启动脚本的执行进度

$monitorlogs = @"
get-content C:\ProgramData\Amazon\EC2-Windows\launch\Log\UserdataExecution.log -wait
"@

# 将日志监控脚本保存到桌面供用户使用

$monitorlogs | out-file -FilePath C:\Users\Administrator\Desktop\MonitorLogs.ps1 -Encoding utf8 -Force

</powershell>
<persist>false</persist>

如果脚本已执行,则日志的最后一行应显示“{Timestamp}: User data script completed”

但是,如果您想了解更多细节,可以在启动脚本中生成登录信息。例如,您可以为每条命令附加一个文本或日志文件,以便在易于访问的位置读取输出:

<powershell>
# 设置日志文件的位置。在本例中,
# 它将出现在您的 Lightsail 实例的桌面上
$loc = "c:\Users\Administrator\Desktop\mylog.txt"

# 将文本写入日志文件
Write-Output "Starting Script" >> $loc

# 下载并安装 Chocolatey 以对其余应用程序进行无人值守安装。
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

# 您可以运行如下命令,将进度输出到日志文件:

# 安装 vscode 和所有依赖项
choco install -y vscode --force --force-dependencies --verbose >> $loc

# 安装 git 和所有依赖项
choco install -y git --force --force-dependencies --verbose >> $loc

# 已完成
Write-Output "Completed" >> $loc
</powershell>
<persist>false</persist>

此代码创建日志文件,输出数据,并持续追加数据。如果存在问题,则可以看到日志停止的位置或出现错误的位置。

对于 Ubuntu 和 Amazon Linux 2

如果 cloud-init-output.log 不够全面,则您可以将命令的输出重定向到您选择的日志文件。在此示例中,我们在 /tmp/ 目录中创建了一个日志文件,并将命令的所有输出推送到该文件中。

# 创建日志文件
touch /tmp/launchscript.log

# 如果您愿意,可以向日志文件中添加文本
echo 'Starting' >> /tmp/launchscript.log

# 更新包索引
sudo apt update >> /tmp/launchscript.log

# 安装软件以管理独立软件供应商来源
sudo apt -y install software-properties-common >> /tmp/launchscript.log

# 为所有 PHP 版本添加存储库
sudo add-apt-repository -y ppa:ondrej/php >> /tmp/launchscript.log

# 安装 Web 服务器、MySQL 客户端、PHP(和软件包)、unzip 和 curl
sudo apt -y install apache2 mysql-client-core-8.0 php8.0 libapache2-mod-php8.0 php8.0-common php8.0-imap php8.0-mbstring php8.0-xmlrpc php8.0-soap php8.0-gd php8.0-xml php8.0-intl php8.0-mysql php8.0-cli php8.0-bcmath php8.0-ldap php8.0-zip php8.0-curl unzip curl >> /tmp/launchscript.log

# 您想要包含的任何最后文本
echo 'Completed' >> /tmp/launchscript.log

可以在启动脚本完成执行之前检查日志。一种方法是“跟踪”日志文件。这使您可以在所有更新发生时流式传输更新。您可以使用以下方式监控日志:

‘tail -f /tmp/launchscript.log’. </code>

使用来自 AWS 命令行界面(AWS CLI)的启动脚本

您可以从 AWS 命令行界面(AWS CLI)而不是 Lightsail 控制台部署他们的 Lightsail 实例。您可以通过使用脚本创建变量并引用该变量,或者将启动脚本保存为文件并引用计算机上的本地文件位置,将启动脚本作为参数添加到 AWS CLI 命令中。

启动脚本的编写方式仍与前面的示例相同。对于具有 PowerShell 启动脚本的 Windows 实例,您可以使用以下代码部署具有启动脚本的 Lightsail 实例:

# 保存在“下载”文件夹中的 PowerShell 脚本:

$loc = "c:\Users\Administrator\Desktop\mylog.txt"

# 将文本写入日志文件

Write-Output "Starting Script" >> $loc

# 下载并安装 Chocolatey 以对其余应用程序进行无人值守安装。

iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

# 您可以运行如下命令,将进度输出到日志文件:

# 安装 vscode 和所有依赖项

choco install -y vscode --force --force-dependencies --verbose >> $loc

# 安装 git 和所有依赖项

choco install -y git --force --force-dependencies --verbose >> $loc

# 已完成

Write-Output "Completed" >> $loc

用于在 us-west-2a 可用区部署 Windows Server 2019 中型实例的 AWS CLI 代码:

aws lightsail create-instances \

--instance-names "my-windows-instance-1" \

--availability-zone us-west-2a \

--blueprint-id windows_server_2019 \

--bundle-id medium_win_2_0 \

--region us-west-2 \

--user-data file://~/Downloads/powershell_script.ps1

清理

记得在使用完资源后将其删除,以免将来产生费用。

结论

现在,您已经了解了如何通过 Lightsail 控制台和 AWS CLI 创建 Lightsail 启动脚本并对其进行故障排除,并了解了相关示例。如本博客所示,使用启动脚本可以提高工作效率,减少应用程序的部署时间和配置。有关使用启动脚本的更多示例,请查看 aws-samples GitHub 存储库。现在,您已经拥有了成功编写自动实例配置脚本所需的全部基础构建块。要了解有关 Lightsail 的更多信息,请访问 Lightsail 服务页面。


Original URL: https://aws.amazon.com/id/blogs/compute/create-use-and-troubleshoot-launch-scripts-on-amazon-lightsail/