在 Amazon Linux 2 上部署到 AWS
本指南描述了如何启动运行 Amazon Linux 2 的 AWS 实例,并将其配置为运行 Swift。这里采取的方法是通过控制台逐步进行。这是一种很好的学习方式,但对于更成熟的方法,我们建议使用基础设施即代码 (Infrastructure as Code) 工具,例如 AWS Cloudformation,并通过自动化工具(例如自动伸缩组 (Autoscaling Groups))创建和管理实例。有关使用这些工具的一种方法,请参阅此博客文章:https://aws.amazon.com/blogs/opensource/continuous-delivery-with-server-side-swift-on-amazon-linux-2/
启动 AWS 实例
使用“服务”菜单选择 EC2 服务。
在“实例”菜单中单击“实例”
单击“启动实例”,可以在屏幕顶部,或者如果这是您在该区域中创建的第一个实例,则可以在屏幕的主要部分中单击。
选择 Amazon Machine Image (AMI)。在本例中,本指南假设我们将使用 Amazon Linux 2,因此选择该 AMI 类型。
选择实例类型。较大的实例类型将具有更多的内存和 CPU,但会更昂贵。较小的实例类型足以进行实验。在本例中,我选择了 t2.micro
实例类型。
配置实例详细信息。如果您想直接从互联网访问此实例,请确保您选择的子网会自动分配公有 IP。假定 VPC 具有互联网连接,这意味着它需要具有互联网网关 (IGW) 和正确的网络规则,但默认 VPC 就是这种情况。如果您希望在私有(不可通过互联网访问)VPC 中设置此实例,则需要设置堡垒主机、AWS Systems Manager Session Manager 或其他一些机制来连接到该实例。
添加存储。AWS EC2 启动向导将默认建议某种形式的存储。对于我们的测试目的,这应该没问题,但是如果您知道您需要更多存储或不同的存储性能要求,那么您可以在此处更改大小和卷类型。
添加标签。建议您添加尽可能多的标签,以便以后正确识别此服务器。特别是如果您有很多服务器,则可能很难记住哪个服务器用于哪个目的。至少,添加一个 Name
标签,并使用一些容易记住的名称。
配置安全组。安全组是一个有状态防火墙,用于限制您的实例接受的流量。建议尽可能限制它。在本例中,我们将其配置为仅允许端口 22 (ssh) 上的流量。建议也限制来源。要将其限制为您的工作站的当前 IP,请单击“来源”下的下拉列表,然后选择“我的 IP”。
启动实例。单击“启动”,然后选择您将用于连接到实例的密钥对。如果您已经有以前使用过的密钥对,则可以在此处通过选择“选择现有密钥对”来重用它。否则,您现在可以通过选择“创建新密钥对”来创建一个密钥对。
等待实例启动。当它准备就绪时,它将在“实例状态”下显示为“正在运行”,并在“状态检查”下显示“2/2 检查通过”。单击实例以查看窗口底部窗格上的详细信息,并查找“IPv4 公有 IP”。
连接到实例。使用您在启动步骤中使用或创建的密钥对以及上一步中的 IP,运行 ssh。请务必将 -A
选项与 ssh 一起使用,以便在将来的步骤中,我们将能够使用相同的密钥连接到第二个实例。
我们有两种编译二进制文件的方法:直接在实例上编译或使用 Docker 编译。我们将在此处介绍这两种方法。
在实例上编译
在实例上有两种替代方法来编译代码,可以通过以下方式:
使用下载的工具链编译
在 SSH 终端中运行以下命令。请注意,可能存在更新版本的 swift 工具链。查看 https://swiftlang.cn/download/#releases 以获取 Amazon Linux 2 的最新可用工具链 URL。
SwiftToolchainUrl="https://swiftlang.cn/builds/swift-5.4.1-release/amazonlinux2/swift-5.4.1-RELEASE/swift-5.4.1-RELEASE-amazonlinux2.tar.gz"
sudo yum install ruby binutils gcc git glibc-static gzip libbsd libcurl libedit libicu libsqlite libstdc++-static libuuid libxml2 tar tzdata ruby -y
cd $(mktemp -d)
wget ${SwiftToolchainUrl} -O swift.tar.gz
gunzip < swift.tar.gz | sudo tar -C / -xv --strip-components 1
最后,通过运行 Swift REPL 检查 Swift 是否已正确安装:swift
。
现在让我们下载并构建一个测试应用程序。我们将使用 --static-swift-stdlib
选项,以便它可以部署到没有安装 Swift 工具链的其他服务器。这些示例将部署 SwiftNIO 的 示例 HTTP 服务器,但您可以使用自己的项目进行测试。
git clone https://github.com/apple/swift-nio.git
cd swift-nio
swift build -v --static-swift-stdlib -c release
使用 Docker 编译
确保实例上已安装 Docker 和 git
sudo yum install docker git
sudo usermod -a -G docker ec2-user
sudo systemctl start docker
您可能必须注销并重新登录才能使用 Docker。通过运行 docker ps
进行检查,并确保它运行没有错误。
下载并编译 SwiftNIO 的 示例 HTTP 服务器
docker run --rm -v "$PWD:/workspace" -w /workspace swift:5.4-amazonlinux2 /bin/bash -cl ' \
swift build -v --static-swift-stdlib -c release
测试二进制文件
使用与上述相同的步骤,启动第二个实例(但不要运行上面的任何 bash 命令!)。请务必使用相同的 SSH 密钥对。
从 AWS 管理控制台中,导航到 EC2 服务并找到您刚刚启动的实例。单击该实例以查看详细信息,并找到内部 IP。在我的示例中,内部 IP 是 172.31.3.29
从原始构建实例中,将二进制文件复制到新的服务器实例:scp .build/release/NIOHTTP1Server ec2-user@172.31.3.29
现在连接到新实例:ssh ec2-user@172.31.3.29
从新实例中,测试 Swift 二进制文件
NIOHTTP1Server localhost 8080 &
curl localhost:8080
从这里开始,选项是无限的,并且将取决于您的 Swift 应用程序。如果您希望运行 Web 服务,请务必将安全组开放到正确的端口并从正确的来源开放。当您完成 Swift 测试后,关闭实例以避免为不需要的计算付费。从 EC2 控制面板中,选择两个实例,从菜单中选择“操作”,然后选择“实例状态”,最后选择“终止”。