面向-IOS-开发者的-AWS-和-DevOps-入门指南-一-

179 阅读11分钟

面向 IOS 开发者的 AWS 和 DevOps 入门指南(一)

原文:Beginning DevOps on AWS for iOS Development

协议:CC BY-NC-SA 4.0

一、iOS 应用开发基础

本章面向 iOS 应用开发初学者。如果你是 iOS 开发者或者有开发 iOS 应用的经验,可以跳过。

为了开发 iOS 应用,苹果提供了几种工具和资源。iOS 应用可以用原生编程语言开发,如 Swift 或 Objective-C 等跨平台语言。

在本章中,我将介绍 iOS 应用开发的要求和基本构建模块,同时通过使用 Swift 构建一个示例应用并在 iOS 设备和 iOS 模拟器上测试该应用,引导您完成整个过程。

开发要求

作为一名 iOS 开发者,你需要一台 macOS 设备和一个苹果开发者账号才能开始开发。

苹果个人计算机

要开始 iOS 开发,需要一台 Mac。它有笔记本和台式机两种版本。目前的笔记本版本有 MacBook Air 和 MacBook Pro,台式机版本有 iMac、Mac Pro、Mac mini。在图 1-1 中可以看到一些 Mac 型号。

图 1-1

比较各种 Mac 型号

苹果开发者账户

你可以免费注册成为苹果开发者。你只需要一个苹果 ID。有了免费的开发者账户,你就可以在你的 Mac 上安装 Xcode(我们将在下一节介绍)、iOS 开发文档、样本代码、苹果开发者论坛和错误报告。你也可以在设备上测试你的应用。免费的苹果开发者账号足够本地测试和开发。但是,要分发应用,您需要注册苹果开发者计划。

苹果开发者计划是一个付费会员计划,按年计费。如果您对创建应用并在 App Store 上发布感兴趣,这是必需的。关于苹果开发者计划的更多细节可以在苹果网站上找到,如图 1-2 所示。

图 1-2

苹果开发者计划

迅速发生的

Swift 是苹果公司在 2014 年开发的一种编程语言。开发 Swift 的目的是找到 C、C++和 Objective-C 等基于 C 的语言的替代品。凭借其语法的表达性质,Swift 拥有开发人员想要的现代功能,并使 iOS 应用开发更容易。

有各种资源可用于学习 Swift 然而,苹果公司开发的应用 Swift Playgrounds 可以让你以有趣和互动的方式学习 Swift。目前该应用适用于 iPad 和 Mac,可以从 App Store 下载,如图 1-3 所示。

图 1-3

斯威夫特游乐场

Xcode 简介

除了支持在 MacOS 系统上开发之外,Xcode 还是由 Apple 开发的集成开发环境(IDE ),它拥有您在所有 Apple OS 平台上开始 iOS 开发所需的一切。它包括代码编辑器、调试器等功能。它还附带了一个模拟器,使您能够在真实的 iOS 设备上构建和测试您的应用,而不需要物理 iOS 设备。

在接下来的几节中,我将向您展示如何安装 Xcode 并使用它来构建和部署 iOS 应用。

安装 Xcode 12

我将在 macOS Big Sur 上安装 Xcode 12,这两个版本目前分别是 Xcode 和 macOS 的最新版本。要安装,去 Mac 上的 App Store 搜索 Xcode,如图 1-4 所示。

图 1-4

App Store 上的 Xcode 搜索结果

单击安装图标,等待安装完成。

  • 如果您收到类似“Xcode 不能安装在“Macintosh HD”上,因为需要 macOS X 版本或更高版本”的错误,请在尝试安装之前更新您的 MAC OS。

安装后,启动 Xcode,你应该会看到一个欢迎页面,如图 1-5 所示。

图 1-5

启动 Xcode

接下来,我将通过创建一个示例应用向您展示如何使用 Xcode 创建应用。

创建应用

安装 Xcode 后,您就可以开始构建 iOS 应用了。我将从使用 Xcode 提供的应用模板开始,然后添加自定义代码来定制应用。

iOS 应用模板

Xcode 提供了样本模板,可以轻松开始构建应用。这些模板可以通过创建一个新的 Xcode 项目来访问(图 1-5 ),并显示不同的可用模板。对于我正在构建的样例 app,我会选择 iOS 和 App,如图 1-6 所示。

图 1-6

为 Xcode 项目选取模板

如果这是你第一次使用 Xcode,会有提示用 Apple ID 登录,如图 1-7 所示。

图 1-7

苹果登录新 Xcode 项目

登录并将 Apple ID 链接到 Xcode 后,将会提示您配置新 Xcode 项目的详细信息。示例如图 1-8 所示。

图 1-8

填写新 Xcode 项目的详细信息

创建之前,必须选择工作站上保存应用的文件夹位置。一旦完成,就创建了一个应用,如图 1-9 所示。

图 1-9

已创建示例应用项目模板

如图 1-9 所示,由于在图 1-8 中创建项目时选择了 Swift 语言,所以应用模板是用 Swift 语言编写的。

让我们看看现成的 Swift 代码,看看它在做什么。

import SwiftUI

struct ContentView: View {
    var body: some View {
        Text("Hello, world!")
            .padding()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Listing 1-1ContentView.swift

清单 1-1 中的代码片段负责显示在 iOS 设备上的视图;正如所见,这个 iOS 应用模板简单地打印出 “你好,世界!”

import SwiftUI

@main
struct SampleAppApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

Listing 1-2SampleAppApp.swift

清单 1-2 显示了应用的入口点,如图所示,它通过调用 ContentView() (在不同的文件 ContentView.swift 中定义)来运行应用,如清单 1-1 所示。

Xcode 实时预览

在配置项目时选择 SwiftUI 界面,可以在代码中对内容视图进行更改时实时预览应用。

让我们来看一个默认应用的预览。从运行目标菜单中,选择您想要使用的 iOS 模拟器,如图 1-10 所示。

图 1-10

选择 iOS 模拟器

选择 iPhone 11 模拟器,预览显示在模拟的 iPhone 11 上,如图 1-11 所示。如图所示,实时预览让您能够在运行构建之前查看应用视图的外观。当在代码中对应用视图进行更改时,预览也会更新。

图 1-11

iPhone 11 模拟器上的默认应用预览

与 Swift 一起发展

至此,您已经使用了创建 Xcode 项目时作为所选模板的一部分提供的默认应用,现在让我们添加一个自定义 Swift 代码。

用清单 1-3 中的代码替换content view . swift?? 的内容。

import SwiftUI

struct ContentView: View {
    @State private var date = Date()

    let dateRange: ClosedRange<Date> = {
        let calendar = Calendar.current

        let startComponents = DateComponents(year: 2021, month: 1, day: 1)
        let endComponents = DateComponents(year: 2021, month: 12, day: 31, hour: 23, minute: 59, second: 59)
        return calendar.date(from:startComponents)!
            ...
            calendar.date(from:endComponents)!
    }()

    var body: some View {
        DatePicker(
            "Start Date",
            selection: $date,
            in: dateRange,
            displayedComponents: [.date, .hourAndMinute]
        )
        .padding(.all)
        .datePickerStyle(GraphicalDatePickerStyle())
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Listing 1-3Sample Application Code

示例应用是一个简单的虚拟日历应用,允许您选择日期和该日期内的时间。接下来,您将为此应用添加一个图标。

添加应用图标

应用图标是应用的可视化表示,显示在主屏幕、App Store 和各种其他位置,如设置和搜索结果。由于用途多样,苹果要求应用图标有不同的大小。

进入 Assets.xcassets ,拖动图标到各自的槽位,即可添加 App 图标,如图 1-12 所示。

图 1-12

添加应用图标

构建应用

我们已经创建了一个定制的示例应用代码,并为该应用添加了一个图标。我们已经准备好了应用的所有基本构件。现在我们将构建应用并在 iOS 设备上运行它。

基于物理 iPhone 构建

让我们看看这个应用在物理 iOS 设备上是什么样子的,比如 iPhone。

要在物理 iPhone 上构建应用,必须将其插入用于开发的 Mac 工作站。一旦将设备插入工作站,就可以选择它作为构建目标。示例如图 1-13 所示。

图 1-13

选择用于构建的物理 iOS 设备

要在已连接的物理 iOS 设备上开始构建,请单击设备选项左侧的播放标志按钮(图 1-13 )。可能会显示 iOS 钥匙圈提示,如图 1-14 所示。这需要 Mac 工作站密码(不是你的 Apple ID 密码)。

图 1-14

Apple 钥匙串登录提示

  • 您需要在 Xcode ➤偏好设置下将您的 Apple 帐户添加到 Xcode,以建立 Apple 开发团队。

  • 请确定您的 iPhone 已解锁,以便 Xcode 连接到它并安装示例应用。如果这是你第一次将你的 iPhone 插入 Mac 工作站,你会得到一个提示来信任工作站。

  • 您可能还需要通过设置➤通用➤设备管理来信任 iPhone 上的应用开发人员。

构建完成后,带有图标的新应用就会安装在 iPhone 上。

图 1-15 显示了在物理 iPhone 上启动应用时的用户界面示例。

图 1-15

在物理 iPhone 上启动示例应用

基于 iOS 模拟器构建

就像在物理设备上构建和运行应用一样,让我们在模拟器上运行应用。

要在模拟器上构建,应该像选择物理 iOS 设备一样选择目标设备模拟器,并开始构建,单击设备选择左侧的播放符号按钮,如图 1-13 所示。

一旦构建完成,模拟器将显示安装了应用的模拟 iPhone。使用光标滚动模拟 iPhone 的页面,并启动已安装的应用。图 1-16 显示了应用的图标以及在 iPhone 11 模拟器上启动时的样子。

图 1-16

在 iPhone 11 模拟器上启动示例应用

Xcode 命令行工具

到目前为止,我已经向您展示了如何使用 Xcode 用户界面构建应用;但是,您也可以通过命令行界面使用 Xcode 的命令行工具 xcodebuild 与 Xcode 进行交互。

xcodebuild 允许您从命令行对 Xcode 项目执行构建、测试和归档等任务。有了它,您可以在命令行上从用户界面执行我们之前执行的所有任务,这为自动化打开了大门。

它预装了 Xcode,所以在 macOS 工作站上安装它不需要额外的操作。在您的工作站上运行xcodebuild -usage命令来查看一些基本的使用信息,如清单 1-4 所示。

$ xcodebuild -usage
Usage: xcodebuild [-project <projectname>] [[-target <targetname>]...
       xcodebuild [-project <projectname>] -scheme <schemeName> [-destination <destinationspecifier>]...
       xcodebuild -workspace <workspacename> -scheme <schemeName> [-destination <destinationspecifier>]...
       xcodebuild -version [-sdk [<sdkfullpath>|<sdkname>] [-json] [<infoitem>] ]
       xcodebuild -list [[-project <projectname>]|[-workspace <workspacename>]] [-json]
       xcodebuild -showsdks [-json]

Listing 1-4xcodebuild -usage truncated output

要查看包括所有可用选项在内的更多使用细节,运行xcodebuild -help并查看输出,如清单 1-5 所示。

$ xcodebuild -help
Usage: xcodebuild [-project <projectname>] [[-target <targetname>]...
...
       xcodebuild -version [-sdk [<sdkfullpath>|<sdkname>] [-json] [<infoitem>] ]
       xcodebuild -list [[-project <projectname>]|[-workspace <workspacename>]] [-json]
       xcodebuild -showsdks [-json]
...

Options:
    -usage                        print brief usage
    -help                         print complete usage
    -verbose                      provide additional status output
    -license                      show the Xcode and SDK license agreements
    -checkFirstLaunchStatus       Check if any First Launch tasks need to be performed
    -runFirstLaunch               install packages and agree to the license
    -project NAME                 build the project NAME
    -target NAME
...

Listing 1-5xcodebuild -help truncated output

您可以使用 xcodebuild 在前面几节创建的示例应用中导航,如清单 1-6 和 1-7 所示。

首先,您可以列出关于示例应用项目的所有信息。

  • 您必须在项目和工作区目录中才能运行以下命令。
$ xcodebuild -list -project SampleApp.xcodeproj
Command line invocation:
    /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -list -project SampleApp.xcodeproj

User defaults from command line:
    IDEPackageSupportUseBuiltinSCM = YES

Information about project "SampleApp":
    Targets:
        SampleApp
        SampleAppTests
        SampleAppUITests

    Build Configurations:
        Debug
        Release

    If no build configuration is specified and -scheme is not passed then "Release" is used.

    Schemes:
        SampleApp

Listing 1-6Listing all the information about a project

接下来,您可以在工作区中列出方案。

$ xcodebuild -list -workspace project.xcworkspace
Command line invocation:
    /Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -list -workspace project.xcworkspace

User defaults from command line:
    IDEPackageSupportUseBuiltinSCM = YES

Information about workspace "SampleApp":
    Schemes:
        SampleApp

Listing 1-7Listing all schemes in your workspace

摘要

本章向您展示了 iOS 应用开发的基本构件;通过构建自己的应用并将其部署到实际的 iOS 设备和 iOS 模拟器上,您获得了实践经验。

在下一章中,我们将更进一步,探索如何将构建的应用提交到 App Store Connect 进行分发和/或最终提交到 Apple 的 App Store。

二、从 Xcode 到 App Store Connect

本章面向 iOS 应用开发初学者;如果你是 iOS 开发者或者有开发 iOS 应用的经验,可以跳过。

在前一章中,我们看到了如何使用 Xcode 在物理 iPhone 设备和模拟器上构建和运行应用。我们将进一步探索如何通过上传到 App Store Connect 来分发之前构建的应用。

  • 第 1 (图 1-2 )章中涵盖的苹果开发者计划账户需要执行本章中的步骤。

标识符

在将应用版本上传到 App Store Connect 之前,必须为应用注册一个标识符。标识符用于唯一地标识一个应用,以便没有两个应用共享一个标识符。

可以从苹果开发者计划门户创建新的标识符。从门户可以进入证书、标识&简介页面,如图 2-1 所示。

图 2-1

应用开发者计划门户

可以创建一个新的标识符,如图 2-2 所示。

图 2-2

创建新的标识符

用户可以创建不同类型的标识符,如图 2-3 所示。应该创建一个应用 ID。

图 2-3

选择标识符类型

目前有两种类型的应用 id。选择如图 2-4 所示的类型。

图 2-4

选择应用 ID 类型

应该提供描述和 ID 名称。示例如图 2-5 所示。

图 2-5

提供 ID 名称和描述

  • 记下您在这里使用的 ID 名称。

应用商店连接

App Store Connect 是一个平台,用于管理 App Store 上应用的所有信息。最重要的是,应用通过 App Store Connect 提交到苹果的 App Store。您可以通过 Apple 开发者计划帐户访问 App Store Connect。入口如图 2-6 所示。

图 2-6

应用商店连接

必须先创建应用,然后才能将应用内容上传到 App Store Connect。这将作为应用在 App Store 上的占位符,并且可以在此配置应用的所有信息。

要创建应用,请导航至 App Store 连接应用页面并创建一个应用,如图 2-7 所示。

图 2-7

创建新应用

要创建应用,选择之前在图 2-5 中创建的包 ID,并提供应用详细信息。图 2-8 显示了我提供的申请细节。

图 2-8

提供新的应用详情

  • 您的应用名称必须是唯一的,并且不能已经存在于 App Store 中。

一旦创建了应用,就会显示一个登录页面,如图 2-9 所示,在这里你可以配置更多关于你的应用的细节,比如截图和其他元数据信息。

图 2-9

App Store Connect 中的新应用

截图和应用详细信息

现在应用已经创建,您可以继续添加将在 App Store 上显示的应用截图以及应用的其他相关信息。

尽可能多地添加应用的详细信息。为应用输入的一些信息是截图、应用类别、定价和可用性、应用隐私、版本发布等。正如我们将在下图中看到的那样。

虽然有各种工具可以创建屏幕截图,但当应用在模拟器上运行时,iOS 模拟器可以用于截图。图 2-10 显示了在 App Store Connect 上添加截图的位置。

图 2-10

在 App Store Connect 中添加新应用的屏幕截图

图 2-11 显示了如何配置应用类别的示例。通过从左侧菜单中选择常规➤应用信息,可以访问应用类别。

图 2-11

为您的应用配置类别

图 2-12 显示了如何配置应用的价格和可用性。

图 2-12

为您的应用配置价格和可用性

图 2-13 显示了如何配置应用的隐私策略。

图 2-13

为您的应用添加隐私策略

图 2-14 显示了发布应用新版本的配置示例。

图 2-14

为应用添加版本发布设置

从 Xcode 上传构件

此时,您已经在 App Store Connect 中创建了一个应用,并配置了所有应用元数据。现在您可以从 Xcode 上传构建到 App Store Connect 了。

为此,您需要创建一个完整的应用归档。我们通过从模拟器列表中选择任何 iOS 设备来实现,如图 2-15 所示。

图 2-15

为完整的应用档案选择模拟器

在创建归档之前,验证 Xcode 上配置的捆绑包标识符是否与 App Store Connect 上配置的捆绑包 ID 相匹配,如图 2-5 所示。这一点可以在 Xcode 上 app 的通用设置中验证,如图 2-16 。

图 2-16

验证捆绑 ID

一旦验证了包 ID,就可以创建完整的归档文件了。创建档案时,选择产品档案,如图 2-17 所示。

图 2-17

创建完整的应用归档

归档完成后,会弹出一个新窗口,如图 2-18 所示,显示已创建的归档。还将列出多个归档文件(如果可用),以及该归档文件的版本和创建日期。

接下来选择分发 App ,如图 2-18 所示。

图 2-18

要分发的应用归档

要分发应用,您必须选择分发方式。由于这里的目标是上传到 App Store,你选择 App Store Connect ,如图 2-19 所示。

图 2-19

将应用上传到 App Store Connect

若要将 iOS 应用上传到 App Store Connect,需要 Apple 分发证书。如果 Xcode 找不到证书,例如,如果您是第一次上传应用,它会尝试为您创建一个新的,您会得到如图 2-20 所示的提示。

图 2-20

创建 Apple 分发证书

Xcode 生成证书后,它会将证书储存在 Keychain 中,但也让您有机会导出证书 p12 文件以便安全保管。你会得到如图 2-21 所示的提示。

图 2-21

导出 Apple 分销证书

  • 导出证书不是必需的,但建议导出。如果您选择不导出证书,可以单击“下一步”跳过。

上传开始前,会提示你 App Store 分发选项,比如包含 iOS 内容的位代码,上传 App 符号;选择这些选项。

此外,系统会提示您选择签名选项。选择让 Xcode 自动管理签名的选项。

  • 如果您已经有要使用的证书和预置描述文件,您可以手动管理签名。

一旦应用上传开始,你应该会看到一个进度条,如图 2-22 所示。

图 2-22

正在上传应用

一旦上传完成并且没有错误,您将会看到上传成功消息,如图 2-23 所示。

图 2-23

应用上传完成

既然上传成功,请等待一段时间让应用在 App Store Connect 上可见,当您的构建在 App Store Connect 上就绪时,您通常会收到电子邮件通知。

接下来,我们将探讨如何对上传的新应用进行测试,最后,如何提交应用进行审查。

测试和发布

当上传的版本在 App Store Connect 上可用时,您可以在最终提交到 App Store 之前对应用进行可选的测试。让我们来探索一下如何在苹果的 App Store Connect 上完成这些。

TestFlight 软件

测试版测试不是 iOS 应用开发流程中的必要步骤。然而,苹果提供了一个名为 TestFlight 的工具,可以用于 beta 测试。通过 TestFlight,你可以邀请实际用户下载并安装你的应用到他们的设备上,以便在公开发布之前收到反馈。

要为 beta 测试添加测试人员,您可以转到 TestFlight 选项卡并选择 build。您可以选择添加单个测试人员或一组测试人员,并向测试人员提供信息,如图 2-24 所示。

图 2-24

添加生成测试信息

如果您选择添加单个测试人员的选项,您将得到一个弹出窗口,如图 2-25 所示,您应该在这里提供测试人员的姓名和联系方式。

图 2-25

向构建中添加测试人员

添加测试人员后,添加测试信息并提交测试进行审核,如图 2-26 所示。

图 2-26

提交 beta 测试以供审查

应用提交

该流程的最后一步是提交应用进行审核。滚动到 App Store Connect 上的 Build 部分,要提交你的应用进行审核,首先选择一个已经上传到 App Store Connect 的 Build,如图 2-27 所示。

图 2-27

选择上传的版本

一旦选择并添加了一个构件,提交审查按钮被激活,如图 2-28 所示。

图 2-28

提交应用进行审核

在此提交应用会在应用可用之前启动 Apple 的审查。

摘要

本章在前一章的基础上总结了 iOS 开发的基础知识,并向您展示了如何与 App Store Connect 进行交互,以便从您的工作站上传应用版本、执行 beta 测试以及提交供审查。

在下一章中,我们将通过回顾 DevOps、AWS 云的基础知识来了解 DevOps,您将了解不同的 AWS DevOps 产品。

三、亚马逊网络服务(AWS)上的 DevOps

业界对 DevOps 有不同的定义,但所有这些定义大多指向相同的原则。AWS 对 DevOps 的定义如下:

DevOps 是文化哲学、实践和工具的结合,它提高了组织高速交付应用和服务的能力:以比使用传统软件开发和基础设施管理流程的组织更快的速度发展和改进产品

DevOps 概念的主要目标是改进软件开发生命周期。为了实现这一点,它引入了不同的方法、工具、过程等。

AWS 为 DevOps 的各个方面提供了丰富的工具,它还与第三方工具集成,为用户在 AWS 上实践 DevOps 提供了广泛的选择。在这一章中,我将介绍一些基本的 AWS 云概念,然后我们将探索 AWS 上用于实践 DevOps 的主要工具和技术。我将介绍这些服务,并演示如何在 AWS 管理控制台上开始使用这些服务。我们还将介绍一些与第三方工具的常见集成。

AWS 上的持续集成

持续集成的概念是让开发人员在源代码控制管理工具中定期合并代码,并频繁运行自动化测试。这允许您快速检测软件问题,从而提高软件交付的整体质量。

让我们在接下来的章节中探索 AWS 提供的不同的持续集成工具。

AWS 代码提交

简而言之,AWS CodeCommit 是一个托管的私有 git 存储库服务。作为托管 AWS 服务,您不需要管理底层硬件或配置来支持托管私有 git 存储库,因此它是安全的和高度可伸缩的。作为一个 git 存储库,它支持标准的 git 功能,因此它可以与现有的基于 git 的工具一起工作,比如 git cli、GUI 客户端等。

使用 AWS 代码提交的好处

使用 AWS CodeCommit 作为您的私有 git 存储库有很多好处;所有这些都可以归纳为以下五个要点:

  1. 它具有高可用性和耐用性。

  2. 数据受到保护和安全,静态和传输中的数据都经过加密。

  3. 可以定义细粒度的访问控制。

  4. 团队成员之间协作的便利性。

  5. 与其他 AWS 自动化工具集成以扩展其功能。

创建代码提交存储库

创建 CodeCommit 存储库有多种方式,例如通过 AWS 管理控制台、AWS CLI、AWS SDKs 等。;然而,我将展示开始使用 AWS 管理控制台界面的最简单方法。

首先登录 AWS 管理控制台,在搜索栏中搜索 CodeCommit,如图 3-1 所示。

图 3-1

AWS 管理控制台上的 AWS 代码提交搜索

启动 CodeCommit 页面的另一个选项是从 AWS 管理控制台的开发者工具部分选择 CodeCommit,如图 3-2 所示。

图 3-2

从开发人员工具部分选择 CodeCommit

启动 CodeCommit 网页后,创建一个引用图 3-3 的存储库。

图 3-3

开始代码提交存储库创建

提供库名,可选描述,选择创建,如图 3-4 所示。

图 3-4

创建代码提交存储库

创建存储库之后,下一步是连接到您的存储库并开始使用它,如图 3-5 所示。要进行连接,您需要使用现有的基于 git 的工具。

图 3-5

连接到代码提交存储库

  • 我们将在第六章中更详细地介绍代码提交连接。

AWS 代码构建

AWS CodeBuild 是云上的托管构建服务器。它提供了一个计算环境来编译代码,运行测试和产品工件。CodeBuild 从源代码提供者处获取源代码,并执行 YAML 规范文件(通常称为 Buildspec)中定义的操作。对于源代码提供者,CodeBuild 目前支持亚马逊 S3、AWS CodeCommit、GitHub、Bitbucket 和 GitHub Enterprise。

创建代码构建项目

从 AWS 管理控制台,在搜索栏中搜索 CodeBuild,如图 3-6 所示。

图 3-6

AWS 管理控制台上的 AWS 代码构建搜索

  • CodeBuild 项目也可以从 AWS CLI、AWS SDKs 和其他基础设施作为代码工具创建。

您也可以在 AWS 管理控制台的开发者工具部分选择 CodeBuild,如图 3-2 所示。

在 CodeBuild 页面上,创建一个构建项目,如图 3-7 所示。

图 3-7

开始创建代码构建项目

一个 CodeBuild 项目支持不同的源代码。将由 CodeBuild 编译或构建的源代码将存储在这个源代码库中。对于不需要源代码的构建,不需要配置源代码。这种构建的一个例子是当构建被配置为连接到外部位置以获取构建所需的资源时。

如图 3-8 所示,没有为我将要创建的项目配置任何源。

图 3-8

正在配置代码生成项目的源代码

如前所述,CodeBuild 项目提供了一个使用容器映像执行构建操作的计算环境。您可以选择使用托管 AWS 代码构建映像或提供自定义 docker 映像。如图 3-9 所示,我将使用托管代码构建映像。

图 3-9

代码构建项目计算环境

CodeBuild 项目需要生成规范。当使用项目的源代码提供者时,YAML 构建规范文件可以存储在代码存储库中,并且在项目中配置名称和位置,默认情况下 CodeBuild 将查找文件名 buildspec.yaml 。构建规范命令也可以直接提供给项目,如果项目没有配置任何源代码,这是特别需要的,我们正在创建的 CodeBuild 项目就是这种情况。

下面的清单显示了一个示例构建规范。定义的每个阶段按顺序执行,每个阶段中的命令也按顺序执行。

version: 0.2
phases:
  install:
    commands:
      - echo Entered the install phase...
      - apt-get update -y
      - apt-get install -y maven
  pre_build:
    commands:
      - echo Entered the pre_build phase...
  build:
    commands:
      - echo Entered the build phase...
      - echo Build started on `date`
  post_build

:
    commands:
      - echo Entered the post_build phase...
      - echo Build completed on `date`

Listing 3-1CodeBuild build specification

复制此示例,并作为构建规范提供,如图 3-10 所示。

图 3-10

代码构建构建规范

  • 您可能需要切换到编辑器模式来查看页面,以输入构建规范。

将其余设置保留为默认设置,创建 CodeBuild 项目,如图 3-11 所示。图 3-11 中选中的 CloudWatch 日志选项确保构建日志流至 Amazon CloudWatch 以方便访问,并为进一步的日志处理打开大门。

图 3-11

创建代码构建项目

AWS 程式码人工因素

AWS CodeArtifact 是一个工件存储库,用于存储、发布和共享软件开发过程中使用的软件包。这是一项全面管理的服务;因此,不需要管理基础架构和许可证。

使用 AWS CodeArtifact,您可以发布私有包供开发人员使用,也可以将其配置为从公共工件存储库中获取。当配置为从公共工件库中获取时,使用 AWS CodeArtifact 的额外优势是定义访问控制和验证软件包的能力。它与常见的包管理器一起工作,如 Maven、Gradle、npm、yarn、twine、pip 和 NuGet。

创建代码工件存储库

让我们看看如何创建 AWS 代码工件库。我将在 AWS 管理控制台的开发者工具部分选择 CodeArtifact ,如图 3-2 所示,然后开始创建库,如图 3-12 所示。

图 3-12

开始创建 CodeArtifact 仓库

  • AWS CodeArtifact 也可以作为代码工具从 AWS CLI、AWS SDKs 和其他基础设施中创建。

您将看到如图 3-13 所示的页面,在这里您可以填写存储库名称。如果要配置该库连接上游公共库,也可以在这里配置上游库,如图 3-13 所示。

图 3-13

提供存储库详细信息

CodeArtifact 中有一个域的概念。这是存储库的逻辑分组,每个 CodeArtifact 存储库必须是域的一部分。一个域也可以在另一个 AWS 帐户中,这使得在多帐户 AWS 环境中管理大量代码工件存储库变得容易。可以创建或选择一个域,如图 3-14 所示。

图 3-14

创建存储库域

创建域后,下一步是检查和创建存储库,如图 3-15 所示。

图 3-15

审查和创建 CodeArtifact 存储库

对于初始连接,会显示不同通用软件包管理器的连接说明,例如,创建后的 npm。

AWS 上的连续交付

正如上一节所讨论的,持续集成涵盖了开发人员如何在源代码控制管理工具中定期合并代码,并运行频繁的自动化测试。连续交付通过部署代码变更而更进一步。代码变更可以被部署到开发和/或测试环境中,这确保您总是拥有一个已经被构建和测试的生产就绪的工件。

AWS 代码部署

AWS CodeDeploy 是一项自动化软件部署服务。借助 CodeDeploy,您可以自动部署到在 Amazon Elastic Compute Cloud(Amazon EC2)实例、Amazon Elastic Container Service(Amazon ECS)、本地服务器和 AWS Lambda 功能上运行的应用。

要使用 CodeDeploy,您需要在一个 YAML 规范文件中定义应用应该如何部署,这个文件通常被称为app spec . YAML;CodeDeploy 使用这个规范文件来完成应用部署。对于 Amazon EC2 和内部部署,CodeDeploy 代理必须安装在应用服务器上,以便 CodeDeploy 管理部署,但对于 Amazon ECS 和 AWS Lambda 等其他计算平台,CodeDeploy 代理不使用,因为它们是托管的 AWS 服务。

应用规范文件根据目标计算平台采用不同的形式,例如 Amazon EC2、AWS Lambda 等。让我们看看不同计算平台的规范文件示例。

  • 清单 3-3 和 3-4 中的钩子部分只有在您运行带有 AWS Lambda 函数的验证脚本作为部署的一部分时才需要。在这些例子中,我引用的 AWS lambda 函数应该已经存在于具有 CodeDeploy 的同一个 AWS 帐户和 AWS 区域中。

清单 3-2 显示了部署到 Amazon EC2 或本地服务器的示例规范文件。

version: 0.0
os: linux
files:
  - source: Config/config.txt
    destination: /webapps/Config
  - source: source
    destination: /webapps/myApp
hooks:
  BeforeInstall:
    - location: Scripts/UnzipResourceBundle.sh
    - location: Scripts/UnzipDataBundle.sh
  AfterInstall:
    - location: Scripts/RunResourceTests.sh
      timeout: 180

  ApplicationStart:
    - location: Scripts/RunFunctionalTests.sh
      timeout: 3600
  ValidateService:
    - location: Scripts/MonitorService.sh
      timeout: 3600
      runas: codedeployuser

Listing 3-2Example appspec for Amazon EC2 or on-premises deployment

清单 3-3 显示了一个 AWS Lambda 功能部署的示例规范文件

version: 0.0
Resources:
  - myLambdaFunction:
      Type: AWS::Lambda::Function
      Properties:
        Name: "myLambdaFunction"
        Alias: "myLambdaFunctionAlias"
        CurrentVersion: "1"
        TargetVersion: "2"
Hooks:
  - BeforeAllowTraffic: "ValidateBeforeTrafficShift"
  - AfterAllowTraffic: "ValidateAfterTrafficShift"

Listing 3-3Example appspec for AWS Lambda deployment

清单 3-4 显示了一个 AWS Lambda 功能部署的示例规范文件。

version: 0.0
Resources:
  - TargetService:
      Type: AWS::ECS::Service
      Properties:
        TaskDefinition: "arn:aws:ecs:us-east-1:111222333444:task-definition/my-task-definition-family-name:1"
        LoadBalancerInfo:
          ContainerName: "SampleApplicationName"
          ContainerPort: 80
Hooks:
  - BeforeInstall: "ValidateBeforeInstall"
  - AfterInstall: "ValidateAfterInstall"
  - AfterAllowTestTraffic: "ValidateAfterTestTraffic"
  - BeforeAllowTraffic: "ValidateBeforeProdTraffic"
  - AfterAllowTraffic: "ValidateAfterProdTraffic"

Listing 3-4Example appspec for Amazon ECS deployment

AWS 代码管道

使用 AWS CodePipeline,您可以按照阶段和操作的顺序编排和自动化组成软件发布过程的所有步骤和操作。CodePipeline 集成了各种 AWS 服务和第三方工具,使您能够创建从源代码到部署的整个软件交付过程自动化的管道。

使用 AWS 代码管道创建 CICD 管道

要开始创建管道,我将在 AWS 管理控制台的开发者工具部分选择代码管道,如图 3-2 所示,然后开始创建管道,如图 3-16 所示。

图 3-16

开始创建管道

  • AWS 代码管道也可以通过 AWS CLI、AWS SDKs 和其他基础设施作为代码工具来创建。

因为管道将代表您执行操作,所以它需要一个 service IAM 角色来定义管道在 AWS 帐户中拥有的权限。在 AWS 管理控制台上创建管道时,可以为您创建所需的 IAM 角色,或者您可以选择现有的 IAM 角色,如图 3-17 所示。

图 3-17

创建代码管道服务角色

现在,您开始定义管道的结构。管道的第一级是源级,它将定义应用源代码的存储位置。对于源代码阶段,AWS CodePipeline 支持亚马逊 ECR、AWS CodeCommit、亚马逊 S3 和第三方工具,如 Bitbucket 和 GitHub。在图 3-18 中,AWS CodeCommit 被配置为管道的源。

图 3-18

将 AWS 代码提交配置为管道源阶段

  • 此处提供的分支名称应该与 CodeCommit 存储库中的有效分支相匹配;否则管道将会失败。

接下来,我们配置一个构建阶段。对于构建阶段,CodePipeline 支持 AWS CodeBuild、CloudBees、Jenkins 和 TeamCity。图 3-19 显示了在构建阶段使用 AWS CodeBuild。

图 3-19

将 AWS 代码构建配置为管道构建阶段

构建阶段之后是部署阶段。在部署阶段,从构建阶段检索构建的工件,然后进行部署。您可以有多个代表不同环境的部署阶段。

CodePipeline 集成了各种 AWS 服务和工具,以支持您的应用部署。

图 3-20 显示了在 AWS 管理控制台上创建部署阶段时支持的部署提供者。

图 3-20

代码管道部署提供程序

虽然代码管道在初始创建期间至少需要两个阶段,但部署阶段不是必需的,可以在管道初始创建期间跳过。参见图 3-21 了解如何跳过部署阶段。

图 3-21

跳过添加部署阶段

在配置完所有阶段并与所需工具集成之后,就可以创建管道了。如图 3-22 所示,您可以查看并创建管道。

图 3-22

查看和创建管道

创建管道后,它将首次运行并执行所有已配置的阶段。如图 3-23 所示,配置了两个阶段(Source 和 Build);管道从 AWS CodeCommit 获取源工件,并使用 AWS CodeBuild 构建它。

图 3-23

成功的管道运行

基础设施作为代码

DevOps 的一个关键原则是部署自动化,但这个自动化概念不仅适用于应用,也适用于基础架构自动化。将基础架构定义为类似代码的应用,可以实现自动化的基础架构部署,从而大大减少部署时间,限制人为错误,并允许重用。通过将基础设施定义为代码,源代码控制也可以用于管理基础设施的生命周期。

我们将探讨 AWS 的基础设施即代码(IaC)产品,这将帮助您了解如何轻松地在 AWS 上自动配置资源。

AWS 云阵

AWS CloudFormation 是一项允许您在模板中定义 AWS 资源的服务,该模板可以用 jSON 或 YAML 语言编写。在 CloudFormation 中,您定义您的目标架构和模板中所有不同组件的集成,然后创建一个堆栈来提供资源。

可以在 AWS 控制台上评估 AWS 云的形成,如图 3-24 所示。

图 3-24

从 AWS 控制台访问 CloudFormation 服务

要创建 CloudFormation 堆栈,您必须有一个模板来定义您将供应的资源。CloudFormation 具有不同的部分和必须遵守的定义的剖析,以确保当使用模板创建堆栈时,CloudFormation 知道如何处理一个或多个资源的生命周期。

清单 3-5 中给出的模板显示了启用版本控制的 S3 存储桶的定义。此外,S3 存储桶的名称是在运行时动态生成的,它由 AWS 帐号和将在其中创建堆栈的 AWS 区域组成,然后存储桶名称作为 CloudFormation 堆栈的输出进行传递。

AWSTemplateFormatVersion: '2010-09-09'
Description: 'Sample S3 Bucket with Versioning Enabled'
Resources:
  S3Bucket:
    Type: AWS::S3::Bucket
    Properties:
      BucketName: !Sub ${AWS::AccountId}-${AWS::Region}-bucket
      VersioningConfiguration:
        Status: Enabled
    DeletionPolicy: Retain
Outputs:
  BucketName:
    Value: !Ref S3Bucket
    Description: S3 Bucket Name

Listing 3-5CloudFormation template

从搜索栏或 AWS 管理控制台主页访问 CloudFormation 控制台后,要从定义的模板创建 CloudFormation 堆栈,请选择创建堆栈选项,如图 3-25 所示。

图 3-25

创建云形成堆栈

  • AWS CloudFormation 堆栈也可以通过 AWS CLI、AWS SDKs 和其他基础设施作为代码工具来创建。

  • 图 3-25 显示了在账户和区域中没有现有的云形成堆栈的情况。如果存在现有的 CloudFormation 堆栈,它们将被列出,但“创建堆栈”按钮仍将被启用。

  • 当创建堆栈动作为您提供堆栈创建选项来创建新的现有的资源时,选择创建新的资源

这将启动创建工作流,第一步是提供您想要启动的模板。图 3-26 显示了如何上传已经创作的模板。

图 3-26

提供云形成模板

  • 清单 3-5 中显示的模板保存在一个名为 s3.yaml 的文件中,用于创建堆栈。

在提供这个模板并选择下一个的之后,CloudFormation 处理模板并解析错误和无效条目。一旦模板被验证,你就可以配置栈名和参数(如果有的话),如图 3-27 所示。

图 3-27

配置堆栈详细信息

理想情况下,下一步也是最后一步是创建堆栈。然而,在 CloudFormation 中有一个称为变更集的概念,它允许您可视化和检查将对 CloudFormation 堆栈中的资源进行的变更,即,将被添加、删除或只是修改的资源。图 3-28 显示了继续创建堆栈或创建变更集的选择。

图 3-28

创建变更集

如果你只是选择创建堆栈,CloudFormation 就会开始创建你的资源。如果您选择创建变更集,则在创建变更集之前,将需要其他配置,如变更集名称。图 3-29 显示了使用变更集配置的默认值。

图 3-29

配置变更集

更改集将允许您查看将要进行的配置更改的详细信息。图 3-30 显示只添加一个资源,一个 S3 存储桶。这是因为这是一个初始的栈创建,而清单 3-5 中的云形成模板只定义了一个 S3 资源。

图 3-30

用于堆栈创建的更改集

如果您对更改不满意,您可以删除更改集,并且不会发生任何操作。当执行变更集时,资源创建或更新开始。图 3-31 显示了根据图 3-30 中执行的变更集创建的云形成堆栈。

图 3-31

堆栈创建完成

AWS 云开发套件(CDK)

CDK 是一个作为代码框架的开源基础设施,允许您用熟悉的编程语言(如 TypeScript、JavaScript、Python、Java 和 C#)定义 AWS 资源。这使得开发人员更容易将基础设施供应集成到现有的软件开发生命周期中。

当在 CDK 定义和部署基础设施时,CDK 使用 CloudFormation 来部署资源,因此它负责将 CDK 脚本转换为相应的 CloudFormation 模板来部署资源。

自动气象站 CDK 安装

AWS CDK 工具包可以与节点程序包管理器(npm)一起安装。清单 3-6 显示了 AWS CDK 工具包的安装示例。

$ sudo npm install -g aws-cdk
/usr/bin/cdk -> /usr/lib/node_modules/aws-cdk/bin/cdk

> aws-sdk@2.932.0 postinstall /usr/lib/node_modules/aws-cdk/node_modules/aws-sdk
> node scripts/check-node-version.js

+ aws-cdk@1.110.0
added 181 packages from 216 contributors in 8.404s

Listing 3-6AWS CDK toolkit installation

安装 CDK 之后,您可以使用命令cdk --version检查 CDK 版本来测试安装。

  • 根据安装时间的不同,版本可能有所不同。
与 CDK 一起部署基础设施

正确安装 CDK 后,您可以开始用任何受支持的 CDK 语言创建您的基础设施。在清单 3-7 中,我展示了如何用 Python 初始化一个 CDK 应用和一个输出片段。

$ mkdir hello-cdk
$ cd hello-cdk
$ cdk init app --language python
Applying project template app for python

# Welcome to your CDK Python project!

This is a blank project for Python development with CDK.

The `cdk.json` file tells the CDK Toolkit how to execute your app.

This project is set up like a standard Python project. The initialization process also creates a virtualenv within this project, stored under the `.venv` directory. To create the virtualenv it assumes that there is a `python3` (or `python` for Windows) executable in your path with access to the `venv` package. If for any reason the automatic creation of the virtualenv fails, you can create the virtualenv manually.

To manually create a virtualenv on MacOS and Linux:

$ python3 -m venv .venv


Listing 3-7Initialize CDK Application

当一个 Python CDK 项目被初始化时,它会创建一个 Python 虚拟环境,如清单 3-7 所示。它还会创建一个 requirement.txt 文件,您可以在其中定义应用依赖关系。我将激活 Python 虚拟环境并安装依赖项,如清单 3-8 所示。

$ source .venv/bin/activate
(.venv) $ python -m pip install -r requirements.txt

Listing 3-8Installing CDK project dependencies

在 CDK,基础设施是以堆栈的形式定义的,一个 CDK 应用必须至少包含一个堆栈,才能部署资源。当 CDK 将其脚本转换为 CloudFormation 时,它会为每个 CDK 堆栈创建一个 CloudFormation 堆栈。

当我初始化 CDK 应用时,创建了一个示例栈 HelloCdkStack ,你可以通过运行命令cdk ls来查看 CDK 栈的列表,如清单 3-9 所示。

(.venv) $ cdk ls
HelloCdkStack

Listing 3-9CDK Stack List

对于部署资源的 CDK,您必须用选择的编程语言定义这些资源。到目前为止,初始化的 CDK 应用没有做任何事情,因为没有定义任何资源。我将向您展示如何通过在以下步骤中创建 S3 时段来定义资源。

首先,清单 3-10 展示了如何从 AWS 构造库中安装亚马逊 S3 CDK 包。必须首先安装将要创建的每个 AWS 资源的 CDK 包。安装 CDK 不会安装资源级软件包;这些必须单独安装。

(.venv) $ pip install aws-cdk.aws-s3

Listing 3-10Installing Amazon S3 Package

安装完所有必需的包后,您可以开始在代码中定义资源及其属性。清单 3-11 显示了 CDK 堆栈中 S3 资源的定义。

  • 由于清单 3-7 中 CDK 应用被命名为 hello-cdk,定义堆栈的 Python 文件位置将是 hello_cdk/hello_cdk_stack.py
#hello_cdk/hello_cdk_stack.py

from aws_cdk import core as cdk
from aws_cdk import aws_s3 as s3

class HelloCdkStack(cdk.Stack):

    def __init__(self, scope: cdk.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        bucket = s3.Bucket(self, "MyFirstBucket",
            versioned=True,)

Listing 3-11Amazon S3 CDK stack

在 CDK 定义资源后,应用就可以部署了。在部署之前,您可以合成并查看为定义的 CDK 资源生成的 CloudFormation 模板,如清单 3-12 所示。

(.venv) $ cdk synth
Resources:
  MyFirstBucketB8884501:
    Type: AWS::S3::Bucket
    Properties:
      VersioningConfiguration:
        Status: Enabled
    UpdateReplacePolicy: Retain
    DeletionPolicy: Retain
    Metadata:
      aws:cdk:path: HelloCdkStack/MyFirstBucket/Resource

Listing 3-12CDK synth output snippet

对于部署 CDK 应用,命令是cdk deploy。示例部署见清单 3-13 。

(.venv) $ cdk deploy
HelloCdkStack: deploying...
HelloCdkStack: creating CloudFormation changeset...

 ✅  HelloCdkStack

Stack ARN:
arn:aws:cloudformation:us-east-1:xxxxxxxxxxxx:stack/HelloCdkStack/36fb9a60-d6dc-11eb-8377-0ab7c9206afb

Listing 3-13CDK app deployment

当部署 CDK 应用时,它会创建一个 CloudFormation 堆栈,该堆栈也可以在 AWS 管理控制台上访问,如图 3-32 所示。

图 3-32

已部署的 CDK 应用的云结构堆栈

CDK CLI 也可用于删除已部署的资源。当 cdk 应用被删除时,底层的 CloudFormation 栈也被删除。清单 3-14 显示了在清单 3-13 中创建的单个 CDK 堆栈的删除。

(.venv) $ cdk destroy
Are you sure you want to delete: HelloCdkStack (y/n)? y
HelloCdkStack: destroying...

   HelloCdkStack: destroyed

Listing 3-14Deleting CDK app

监控和记录

监控是 DevOps 的重要组成部分。了解已部署应用的性能并记录应用活动,可以让您主动识别问题和模式,从而进一步提高软件质量。

让我们从 AWS CloudWatch 开始,探索可以帮助您满足应用中的日志记录和监控需求的 AWS 产品。

亚马逊云观测

Amazon CloudWatch 是用于监控和记录应用性能和活动的 AWS 产品。由于监控和日志记录有不同的组件,CloudWatch 根据功能分为不同的子服务。图 3-33 显示了 CloudWatch 控制台。左窗格中显示了 CloudWatch 的不同产品。

图 3-33

AWS 云观察服务控制台

让我们探讨一下 AWS CloudWatch 的一些常见用例。

云观察指标

大多数 AWS 服务原生地将指标数据发布到 CloudWatch 指标。当您创建一个与 CloudWatch 本机集成的 AWS 资源时,无需额外的操作,您就可以查看该资源的指标以监视该资源的不同方面。AWS 为每种资源类型提供了现成的指标支持;但是,您也可以发布自定义指标来监控 CloudWatch 本身不支持的组件。

可以在 AWS 控制台的图表中查看发布的指标,如图 3-34 所示。

图 3-34

可用的 CloudWatch 指标

CloudWatch 日志

这是 AWS CloudWatch 的日志聚合功能。存储在 AWS CloudWatch 中的日志可以来自运行在内部或云上的应用。一些 AWS 服务与 CloudWatch 日志进行了本机集成,并在那里存储它们的日志,几乎不需要额外配置。这种服务的例子是无服务器产品,如 AWS Lambda,这是一种允许您在云上执行代码而无需提供资源的服务,以及 AWS CodeBuild,它提供了一个编译代码、运行测试和产品工件的计算环境。

CloudWatch Logs 还有一个功能 **CloudWatch Logs Insights,**可以让您轻松查询和分析您的日志数据,以快速响应运营问题。

CloudWatch 警报

根据 CloudWatch 中的指标数据,您可以基于该数据创建警报,以便在达到特定阈值时执行操作。例如,您可以创建一个 CloudWatch 警报,以便在 CPU 利用率指标超过阈值时执行扩展操作。可以从 CloudWatch 日志数据事件中创建指标,因此这也提供了基于存储在 CloudWatch 日志中的应用日志中的事件来配置警报的能力。

AWS 云跟踪

您通过 AWS 控制台、CLI 或 SDK 工具在 AWS 上执行的所有活动都是由 AWS CloudTrail 监控和记录的 API 调用。CloudTrail 日志存储在亚马逊 S3 桶中。CloudTrail 存储的信息提供了 AWS 帐户中活动的审计跟踪,这使得审计用户的操作或代表用户执行操作的 AWS 服务变得更加容易。

摘要

在这一章中,我谈到了针对持续集成、持续交付、基础设施即代码和监控的不同 AWS DevOps 产品。我们探讨了基本细节、它们的用例,并在 AWS 管理控制台上演示了这些资源的示例供应。

在下一章,我们将详细介绍在 AWS 上配置 macOS 服务器,这将为在 AWS 上本地开发 iOS 提供基础。

四、AWS 上的 macOS 服务器

传统上,iOS 应用开发人员必须购买硬件 macOS 工作站或服务器来开发 iOS 应用,因为这些应用只能在 iOS 操作系统上构建、测试和部署。这限制了开发人员将云原生解决方案集成到他们的开发过程中的能力,从而无法利用云的力量。

Amazon EC2 Mac 实例消除了这些限制,在这一章中,我们将深入研究部署它的不同选项,开始使用它来开发您的 iOS 应用。

Amazon EC2 Mac 服务器

Amazon EC2 Mac 释放了在云上运行按需 macOS 工作负载的能力,因此允许 iOS 开发人员受益于 AWS 云提供的灵活性、可扩展性、敏捷性和成本优势。

它由 Mac mini 硬件提供支持,目前由 3.2 GHz 英特尔第八代(咖啡湖)酷睿 i7 处理器提供支持。您可以使用 EC2 Mac 实例为 Apple 设备(如 iPhone、iPad、iPod、Mac、Apple Watch 和 Apple TV)开发、构建、测试和签署应用。

要连接到 EC2 Mac 实例,您可以使用 SSH 进行命令终端访问,或者使用支持虚拟网络计算(VNC)协议的客户端来获得完整的用户界面(UI)体验。

EC2 限额和定价

因为每个 EC2 Mac 实例都是由实际的 Mac mini 硬件在幕后驱动的,所以默认情况下,AWS 会对提供 Mac 实例的帐户进行限制。这是为了防止滥用并为真实用户保留容量。

在您尝试部署之前,请查看您的 EC2 限额,以确保您有配额为您打算使用的区域中的帐户进行部署。要检查您的配额,请从 AWS 管理控制台转到 EC2 服务,如图 4-1 所示。

图 4-1

从 AWS 管理控制台访问 EC2

从 EC2 控制台,到达如图 4-2 所示的极限。

图 4-2

从 EC2 控制台访问限制页面

在那里可以搜索 Mac 专用主机限制,如图 4-3 所示。该限制表示您可以供应多少 Mac EC2 实例。如果适用,您可以从门户网站提出限额增加请求,并提供您的使用案例。

图 4-3

客户和地区的 EC2 Mac 限额

Mac 实例只能作为专用主机上的裸机实例,因为 Amazon EC2 Mac 实例和 Mac mini 服务器之间存在一对一的映射。您可以为每个专用主机启动一个 Mac 实例,并且可以与 AWS 组织内的 AWS 帐户或组织单位或整个 AWS 组织共享该专用主机。

EC2 Mac 实例不符合免费层的条件,按分配的专用主机计费,而不是按实例计费,专用主机在您可以释放之前有 24 小时的最短分配期。

部署 Amazon EC2 Mac 服务器

像大多数 AWS 服务一样,您可以使用各种选项来提供 EC2 Mac 实例。在这一节中,我将通过创建和提供示例代码向您展示可用的主要选项。

使用 AWS 管理控制台部署

AWS 管理控制台是开始提供 AWS 服务的最简单方法。要配置 EC2 Mac 服务器,首先要配置一台专用主机。参见图 4-4 了解如何从 EC2 控制台访问专用主机。

图 4-4

从 EC2 控制台访问专用主机

在专用主机控制台上,选择选项开始分配,如图 4-5 所示。

图 4-5

开始分配专用主机

如图 4-6 所示填写分配参数,分配专用主机。主要参数字段描述如下:

图 4-6

专用主机设置

  • 名称标签–为专用主机提供一个名称。

  • 实例系列–指定专用主机支持的实例系列。在这里,从下拉列表中选择实例族**“MAC 1”**。

  • 支持多种实例类型–如果启用对多种实例类型的支持,主机可以支持所选实例系列中的不同实例类型。

    默认情况下,对于 Mac 实例族,此选项将灰显,因为当前只有一种实例类型。

  • 实例类型–主机支持的实例类型。如果不将主机配置为支持多种实例类型,则必须选择要支持的特定实例类型。在这里,你选择 mac1.metal

  • 可用区–分配主机的可用区;您可以选择列出的任何可用性区域,具体取决于您选择的数据中心。

  • 实例自动放置–启用自动放置以允许主机接受与其主机配置相匹配的无目标实例启动。禁用自动放置以允许主机仅接受目标实例启动。默认情况下,它不会被启用。

  • 主机恢复–主机恢复使用主机级运行状况检查来评估主机的可用性并检测底层系统故障。如果在主机上检测到故障,主机恢复会自动将故障主机上正在运行的实例重新启动到新的替代主机上。默认情况下,它不会被启用,并且不支持实例类型 mac1.metal。

  • 数量–您希望为此配置购买的专用主机数量。

    您在此选择的数量不能大于您的配额限制。

  • 一些可用性区域可能没有能力供应专用主机,这将导致分配失败;通过选择不同的可用性区域,再次尝试分配。

在分配之后,它可以立即在其上启动一个实例。图 4-7 显示了如何在专用主机上启动 EC2 Mac 实例的供应。

图 4-7

在专用主机上启动 Mac 实例

此操作将启动 EC2 实例创建过程。如图 4-8 所示,您选择 macOS Amazon 机器映像(AMI)用于启动 Mac EC2 实例。

图 4-8

为实例启动选择 macOS Amazon 机器映像(AMI)

下一步是选择实例类型。非灰色选项是所选 AMI 的可用实例类型。在图 4-9 中,已经选择了 mac1.metal 实例类型。

图 4-9

选择 macOS 实例类型

实例细节可以如图 4-10 所示进行配置。在这里,您可以配置 VPC、子网、主机配置等。

图 4-10

配置 EC2 Mac 详细信息

  • 此次启动不需要 IAM(身份访问管理)角色,因此为 IAM 角色选项选择“无”并继续。

对于实例存储,现在可以配置默认存储,如图 4-11 所示。默认存储足以进行初始部署和连接。

图 4-11

默认 Mac 实例存储

为了在启动后允许入站网络连接到 Mac 实例,定义了安全组规则,以允许从特定 IP 连接到适用的端口。如图 4-12 所示,允许从我的 IP 地址到 TCP 端口 22(安全外壳(SSH)协议端口)和 TCP 端口 5900(虚拟网络计算(VNC)协议端口)的连接。

图 4-12

为入站连接配置安全组规则

配置安全组规则后,检查输入的所有配置详细信息的准确性,并继续启动实例。

此外,对于到 Mac 实例的入站用户 SSH 连接,需要 EC2 密钥对。您可以使用您在帐户中创建的现有密钥对,也可以创建一个新的密钥对。图 4-13 显示了在启动实例之前创建新密钥对的过程。

图 4-13

在启动实例之前创建新的 EC2 密钥对

实例一旦启动,就会出现在专用主机下的运行实例选项卡下,如图 4-14 所示。

图 4-14

运行实例的专用主机

您还可以通过选择实例来查看有关运行实例的更多详细信息。这会将您重定向到 EC2 实例控制台,如图 4-15 所示。

图 4-15

Mac EC2 实例详细信息

使用 AWS CLI 部署

EC2 Mac 实例也可以从 AWS 命令行界面(CLI)提供。要使用 AWS CLI,必须先将其安装在工作站上,并使用适当的身份访问管理(IAM)凭据配置工作站。

要提供 EC2 Mac 实例,首先要分配一个专用主机,如清单 4-1 所示。

aws ec2 allocate-hosts --region us-east-1 --instance-type mac1.metal --availability-zone us-east-1c --auto-placement "on" --quantity 1

Listing 4-1Allocating dedicated host

一旦分配了专用主机,就可以创建一个 Mac 实例,如清单 4-2 所示。您将获得一个包含实例 ID 的响应,该实例 ID 可用于后续的 CLI 命令。

aws ec2 run-instances --region us-east-1 --instance-type mac1.metal --placement Tenancy=host --image-id ami-059ff882c04ebed21 --key-name my-key-pair

Listing 4-2Provisioning EC2 Mac instance on the dedicated host

通过描述清单 4-3 中所示的状态来验证创建的实例。使用在创建过程中从 CLI 响应中检索到的实例 ID。

aws ec2 describe-instance-status --instance-ids <Instance ID>

Listing 4-3Verifying Instance creation status

使用 AWS CloudFormation 部署

AWS CloudFormation 是一个基础设施即代码服务,它允许您对要在 jSON 或 YAML 模板中部署的资源进行建模。然后,该模板被传递给 AWS CloudFormation,以提供定义的资源。

要使用 CloudFormation 部署 EC2 Mac 实例,您将定义模板中所需的所有组件,如清单 4-4 所示。

Parameters:
  VpcId:
    Type: AWS::EC2::VPC::Id
    Description: VPC to launch the EC2 Mac Instance
  SubnetId:
    Type: AWS::EC2::Subnet::Id
    Description: |
      Subnet to launch the EC2 Mac Instance............
  MacEc2Host:
    Type: String
    Default: h-xxxxxxxxxxxxxx
    Description: The Host ID of the Allocated.........
  SourceIp:
    Type: String
    Default: 1.2.3.4/32

    Description: |
      Source IP address and subnet mask...............
  Ec2KeyPairName:
    Type: AWS::EC2::KeyPair::KeyName
    Description: Already existing EC2 keypair............
  MacOSAmi:
    Type: AWS::EC2::Image::Id
    Default: ami-059ff882c04ebed21
    Description:latest AMI ID for the Mac OS instance
Resources:
  Ec2MacSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      VpcId: !Ref VpcId
      GroupDescription: Enable SSH and VNC access.........
      SecurityGroupIngress:
      - CidrIp: !Ref SourceIp
        FromPort: 22
        IpProtocol: tcp
        ToPort: 22
      - CidrIp: !Ref SourceIp
        FromPort: 5900
        IpProtocol: tcp
        ToPort: 5900
  MacEc2Instance:
    Type: AWS::EC2::Instance
    Properties:
      Affinity: host
      ImageId: !Ref MacOSAmi
      KeyName: !Ref Ec2KeyPairName
      InstanceType: mac1.metal
      HostId: !Ref MacEc2Host
      SubnetId: !Ref SubnetId
      SecurityGroupIds:
        - !Ref Ec2MacSecurityGroup
      BlockDeviceMappings:
        - DeviceName: /dev/sda1
          Ebs:
            VolumeType: gp2
            VolumeSize: '200'
            DeleteOnTermination: 'true'

Listing 4-4AWS CloudFormation template for EC2 Mac

模板的参数部分包含用户将提供的输入运行时参数,这些参数将在资源部分用于资源创建。

如清单 4-4 所示,模板中定义的两个资源是 EC2 Mac 安全组和 Mac 实例。要启动 CloudFormation 模板,从 AWS CloudFormation 控制台创建一个栈,选择文件,点击 next,如图 4-16 所示。

图 4-16

选择 EC2 Mac Cloudformation 模板以创建堆栈

接下来,您将输入模板中定义的用户参数,如图 4-17 所示。有些示例值已经作为默认值输入,应该用特定于您的环境和 AWS 帐户的信息覆盖这些值。

图 4-17

输入云形成堆栈参数

要在创建之前检查将要创建的资源,您可以创建一个变更集。改变设置如图 4-18 所示。

图 4-18

EC2 Mac 创建的云信息更改集

使用 Terraform 部署

Terraform 是一个开源基础设施,作为编码软件工具,允许您对模板中要提供的资源进行建模。Terraform 由 HashiCorp 创建,它使用一种称为 HashiCorp 配置语言(HCL)的声明式配置语言,文件扩展名为. tf。它还支持在 JSON 中声明资源。

清单 4-5 显示了 terraform HCL 模板中 EC2 Mac 资源的定义。

provider "aws" {
    region = "us-east-1"
}

variable "awsprops" {
    type = map(string)
    default = {
        vpcid = "vpc-937e84ee"
        subnetid = "subnet-c10c6fcf"
        ami = "ami-059ff882c04ebed21"
        keyname = "my-key-pair"
        hostid = "h-xxxxxxxxxxxx"
        sourceip = "1.2.3.4/32"
    }
}

resource "aws_security_group" "ec2-mac-instance-sg" {

  description = "Enable SSH and VNC access to Mac Instance"
  vpc_id = lookup(var.awsprops, "vpcid")

  // To Allow SSH Transport
  ingress {
    from_port = 22
    protocol = "tcp"
    to_port = 22
    cidr_blocks = [lookup(var.awsprops, "sourceip")]
  }

  // To Allow Port VNC Transport
  ingress {
    from_port = 5900
    protocol = "tcp"
    to_port = 5900
    cidr_blocks = [lookup(var.awsprops, "sourceip")]
  }
}

resource "aws_instance" "ec2-mac-instance" {
  ami = lookup(var.awsprops, "ami")
  key_name = lookup(var.awsprops, "keyname")
  host_id = lookup(var.awsprops, "hostid")
  instance_type = "mac1.metal"
  subnet_id = lookup(var.awsprops, "subnetid")
  vpc_security_group_ids = [
      aws_security_group.ec2-mac-instance-sg.id
  ]
  root_block_device {
    delete_on_termination = true
    volume_type = "gp2"
    volume_size = "200"
  }
}

Listing 4-5Terraform definition for EC2 Mac resources

与 AWS CloudFormation 一样,terraform 模板包含需要定制的输入变量和定义 EC2 安全性和 EC2 Mac 实例资源的资源部分。

要使用 Terraform,必须在工作站上安装软件,并且必须配置目标 AWS 帐户的身份访问管理(IAM)凭据。

部署 Terraform 中定义的资源。tf 文件,初始化您的工作目录,如清单 4-6 所示,使其成为 Terraform 工作目录,并安装所有的依赖项。

terraform> terraform init

Initializing the backend...

Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v3.49.0...
- Installed hashicorp/aws v3.49.0 (signed by HashiCorp)

Listing 4-6Initializing Terraform

在尝试部署以修复任何语法问题之前,您还可以验证您的 Terraform 文件,如清单 4-7 所示。

terraform> terraform validate
Success! The configuration is valid.

Listing 4-7Validating Terraform files in directory

要预览像 CloudFormation 变更集一样将被提供的所有资源,您可以执行一个terraform plan命令。这向您显示了有关要调配的资源及其关系的详细信息。清单 4-8 显示了这个命令的输出片段。

terraform> terraform plan

Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
  + create

Terraform will perform the following actions:

  # aws_instance.ec2-mac-instance will be created
  + resource "aws_instance" "ec2-mac-instance" {
      + ami                           = "ami-059ff882c04ebed21"
      + arn                           = (known after apply)
      + associate_public_ip_address   = (known after apply)
.
.
.
.
Plan: 2 to add, 0 to change, 0 to destroy.

-----------------------------------------------------------------------------------------------
Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.

Listing 4-8Viewing Terrform plan before resource creation

在查看了所有要创建的资源之后,要开始创建,您需要应用清单 4-9 中所示的配置。

terraform> terraform apply

Listing 4-9Applying terraform configuration

现在我已经展示了如何部署 EC2 Mac 服务器,接下来我们将探索如何连接到它。

连接到 Amazon EC2 Mac 服务器

对于每个新的 EC2 Mac 服务器,默认情况下禁用密码验证。第一次的默认访问方法是使用 SSHec2 用户帐户被配置用于 SSH 远程登录。要使用 SSH 进行连接,实例必须已经使用密钥对启动,并且其安全组允许从 SSH 连接发起的工作站进行 SSH 访问。

使用 SSH 连接后,可以配置密码验证,以允许使用虚拟网络计算(VNC)客户端进行连接。

使用 SSH 连接

为了使用 SSH 进行连接,本节讨论了各种选项,以适应您的操作系统和/或偏好。

Linux 或 Windows 上的命令终端

在 Windows 和 Linux 操作系统上,最常见的连接方法是通过命令终端并使用内置的 SSH 客户端。清单 4-10 中的示例显示了使用命令终端的 SSH 命令。

  • 如果你得到一个关于你的钥匙太开放和无保护的错误,用chmod 400 /path/my-key-pair.pem改变钥匙的许可。
ssh -i /path/my-key-pair.pem ec2-user@ec2-12-23-45-67.compute-1.amazonaws.com

Listing 4-10SSH on command terminal

窗户油灰

Putty 是一个用于 windows 的免费开源 telnet 和 SSH 客户端,也可用于连接 EC2 Mac 实例。要使用 Putty,您必须将。pem 密钥对与. ppk 密钥的兼容性。转换后,您提供。ppk 键如图 4-19 所示。

图 4-19

为 Putty 会话提供身份验证

配置好身份验证后,按照格式 ec2-user@ <主机名> 指定主机名以及端口和连接类型,如图 4-20 所示。

图 4-20

正在启动 Putty SSH 会话

点击打开,就登录到 EC2 Mac 服务器的命令终端,如图 4-21 所示。

图 4-21

EC2 Mac 服务器的命令终端

正在连接 VNC 客户端

要连接到 Mac 服务器的用户界面(UI ),您必须使用 VNC 客户端。但是在使用 VNC 客户端之前,有几个先决条件需要配置。

设置登录密码

默认情况下,ec2 用户禁用密码验证。要使用 VNC 客户端并连接到 UI,必须为 ec2 用户创建密码,如清单 4-11 所示。

ec2-user@ip-172-31-47-239 ~ % sudo passwd ec2-user
Changing password for ec2-user.
New password:
Retype new password:

################################### WARNING ###################################
# This tool does not update the login keychain password.                      #
# To update it, run `security set-keychain-password` as the user in question, #
# or as root providing a path to such user's login keychain.                  #
###############################################################################

Listing 4-11Setting up password for default ec2-user account

请保管好您在此设置的密码,因为它将用于使用 VNC 客户端登录到您的服务器。

设置苹果远程桌面

要在 Mac 服务器上启用远程桌面连接,必须从 Mac 服务器的终端启动苹果远程桌面代理,如清单 4-12 所示。

ec2-user@ip-172-31-47-239 ~ % sudo /System/Library/CoreServices/RemoteManagement/ARDAgent.app/Contents/Resources/kickstart \
-activate -configure -access -on \
-restart -agent -privs -all
Starting...
Warning: macos 10.14 and later only allows control if Screen Sharing is enabled through System Preferences.
Activated Remote Management.
Stopped ARD Agent.
ec2-user: Set user remote control privileges.
ec2-user: Set user remote access.
Done.

Listing 4-12Starting Apple Remote Desktop Agent

设置 SSH 端口转发

您可以从工作站上的 VNC 客户端直接连接到端口 5900 (VNC 端口)上的 Mac 服务器的 IP 地址,但是 VNC 协议被认为是不安全的。一种更安全的方法是从您的工作站使用 SSH 端口转发功能通过 SSH 隧道传输 VNC 流量。

清单 4-13 展示了如何将本地主机端口 5900 的所有流量转发到 EC2 Mac 服务器端口 5900。因此,要连接到 Mac 服务器,您需要向本地主机端口 5900 发送流量。

ssh -L 5900:localhost:5900 -i /path/my-key-pair.pem ec2-user@your-instance-public-dns-name

Listing 4-13SSH tunneling VNC traffic

下载 VNC 客户端并连接

根据您的操作系统,有多种 VNC 客户端选项可供使用。一个这样的选项是 VNC 浏览器,它可以跨多个操作系统使用;可以下载,如图 4-22 所示。

图 4-22

下载 VNC 客户端

它可以安装在 Windows 操作系统上,如图 4-23 所示。

图 4-23

在 Windows 上安装 VNC 客户端

安装完成后,确保按照清单 4-13 中的描述设置了端口 5900 SSH 隧道,然后可以通过连接到本地主机开始连接 Mac 服务器,如图 4-24 所示。

图 4-24

使用 VNC 客户端连接到 EC2 Mac 服务器

连接成功后,您会看到 EC2 Mac 服务器的登录提示,如图 4-25 所示。

图 4-25

EC2 Mac 服务器的登录提示

在清单 4-11 中,我向您展示了如何为默认 ec2 用户设置密码。您在那里设置的密码是 ec2 用户将用来登录的。

认证成功后,您将登录,如图 4-26 所示。

图 4-26

EC2 Mac 服务器主屏幕

使用 Amazon CloudWatch 监控 EC2 Mac 服务器

默认情况下,EC2 Mac 实例会向 Amazon CloudWatch 发出指标以进行性能监控。它发送 CPU 利用率、网络使用信息等指标。EC2 Mac 实例的指标可以在 EC2 控制台上查看,方法是在实例上选择,然后转到 Monitoring 选项卡。这方面的一个例子如图 4-27 所示。

图 4-27

EC2 控制台上的实例度量信息

这些指标也可以在亚马逊 CloudWatch 控制台上查看。CloudWatch 控制台为您提供了更多的图表选项,并允许您在同一个图表上比较多个指标,如图 4-28 所示。

图 4-28

Cloudwatch 上的实例度量图

要禁用向 CloudWatch 发送 CPU 利用率等系统监控指标的代理,可以运行清单 4-14 中所示的设置。

$ sudo setup-ec2monitoring [enable | disable]

Listing 4-14Configuring EC2 system monitoring for Mac instance

清理 Amazon EC2 Mac 服务器

如果不经常使用 Amazon EC2 服务器,要清理它,首先要终止 EC2 实例,然后释放专用主机。

要终止实例,从 EC2 仪表板中,选择实例并选择您想要终止的 mac1.metal 实例。选择实例状态,然后选择终止实例

由于 Amazon EC2 Mac 实例不是按实例收费的,而是由专用主机收费的,终止实例并不能停止收费,必须释放专用主机才能停止收费。

  • 在分配主机 24 小时后,才能释放专用主机。

要释放主机,从 EC2 仪表板中,选择专用主机并选择您想要释放的专用主机。选择动作,然后选择发布主机

摘要

我们讨论了部署 EC2 macOS 实例的细节,探索了不同的部署方法。我还向您展示了不同的连接选项,同时还介绍了连接 EC2 Mac 服务器的先决条件。

在下一章中,我们将在此基础上进行构建,我将向您展示如何在 EC2 macOS 实例上安装和设置各种 iOS 开发和构建工具。