在 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 服务。

Select EC2 service

在“实例”菜单中单击“实例”

Select Instances

单击“启动实例”,可以在屏幕顶部,或者如果这是您在该区域中创建的第一个实例,则可以在屏幕的主要部分中单击。

Launch instance

选择 Amazon Machine Image (AMI)。在本例中,本指南假设我们将使用 Amazon Linux 2,因此选择该 AMI 类型。

Choose AMI

选择实例类型。较大的实例类型将具有更多的内存和 CPU,但会更昂贵。较小的实例类型足以进行实验。在本例中,我选择了 t2.micro 实例类型。

Choose Instance type

配置实例详细信息。如果您想直接从互联网访问此实例,请确保您选择的子网会自动分配公有 IP。假定 VPC 具有互联网连接,这意味着它需要具有互联网网关 (IGW) 和正确的网络规则,但默认 VPC 就是这种情况。如果您希望在私有(不可通过互联网访问)VPC 中设置此实例,则需要设置堡垒主机、AWS Systems Manager Session Manager 或其他一些机制来连接到该实例。

Choose Instance details

添加存储。AWS EC2 启动向导将默认建议某种形式的存储。对于我们的测试目的,这应该没问题,但是如果您知道您需要更多存储或不同的存储性能要求,那么您可以在此处更改大小和卷类型。

Choose Instance storage

添加标签。建议您添加尽可能多的标签,以便以后正确识别此服务器。特别是如果您有很多服务器,则可能很难记住哪个服务器用于哪个目的。至少,添加一个 Name 标签,并使用一些容易记住的名称。

Add tags

配置安全组。安全组是一个有状态防火墙,用于限制您的实例接受的流量。建议尽可能限制它。在本例中,我们将其配置为仅允许端口 22 (ssh) 上的流量。建议也限制来源。要将其限制为您的工作站的当前 IP,请单击“来源”下的下拉列表,然后选择“我的 IP”。

Configure security group

启动实例。单击“启动”,然后选择您将用于连接到实例的密钥对。如果您已经有以前使用过的密钥对,则可以在此处通过选择“选择现有密钥对”来重用它。否则,您现在可以通过选择“创建新密钥对”来创建一个密钥对。

Launch instance

等待实例启动。当它准备就绪时,它将在“实例状态”下显示为“正在运行”,并在“状态检查”下显示“2/2 检查通过”。单击实例以查看窗口底部窗格上的详细信息,并查找“IPv4 公有 IP”。

Wait for instance launch and view details

连接到实例。使用您在启动步骤中使用或创建的密钥对以及上一步中的 IP,运行 ssh。请务必将 -A 选项与 ssh 一起使用,以便在将来的步骤中,我们将能够使用相同的密钥连接到第二个实例。

Connect to instance

我们有两种编译二进制文件的方法:直接在实例上编译或使用 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

Invoke REPL

现在让我们下载并构建一个测试应用程序。我们将使用 --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 控制面板中,选择两个实例,从菜单中选择“操作”,然后选择“实例状态”,最后选择“终止”。

Terminate Instance