Skip to content

Latest commit

 

History

History
301 lines (186 loc) · 13.2 KB

File metadata and controls

301 lines (186 loc) · 13.2 KB

二、AWS Lambda 入门

本章提供了设置 AWS 环境以及 Go 运行时和开发环境的指南。将向您介绍功能强大的 AWS CLI,它将使部署无服务器应用更加高效,并极大地提高您的生产效率。

此外,还将为您提供一套关于如何选择 Go集成开发环境IDE的提示和建议。

技术要求

在继续安装和配置 AWS 和 Go 环境之前,建议您在笔记本电脑(Windows、Linux 或 macOS X)上预装 Python 2 版本 2.6.5+或 Python 3 版本 3.3+并设置 AWS 帐户,以便轻松执行给定命令。本章的代码包托管在 GitHub 上的https://github.com/PacktPublishing/Hands-On-serverless-Applications-with-Go

设置 AWS 环境

本节将指导您如何安装和配置 AWS 命令行。CLI 是一个可靠的强制性工具,将在后续章节中介绍;通过自动化 Lambda 功能和其他 AWS 服务的部署和配置,这将为我们节省大量时间。

AWS 命令行

AWS CLI 是从终端会话管理 AWS 服务和资源的强大工具。它构建在 AWS API 之上,因此可以通过 AWS 管理控制台完成的所有操作都可以通过 CLI 完成;这使它成为一个方便的工具,可用于通过脚本自动化和控制 AWS 基础设施。后面的章节将提供有关使用 CLI 管理 Lambda 功能和围绕 Lambda 创建其他 AWS 服务的信息。

让我们看一下 AWS CLI 的安装过程;您可以在AWS 管理控制台部分找到有关其配置和测试的信息。

安装 AWS CLI

首先,打开一个新的终端会话,然后使用pipPython 软件包管理器安装awscli的最新稳定版本:

pip install awscli

如果已安装 CLI,出于安全考虑,建议您升级到最新版本:

pip install --upgrade awscli

Windows 用户也可以使用 MSI 安装程序(https://s3.amazonaws.com/aws-cli/AWSCLI64.msihttps://s3.amazonaws.com/aws-cli/AWSCLI32.msi ,不需要安装 Python。

*安装后,您需要将 AWS 二进制路径添加到PATH环境变量中,如下所示:

  • 对于 Windows,按 Windows 键并键入环境变量。在“环境变量”窗口中,突出显示系统变量部分中的PATH变量。编辑该变量并在最后一个路径后添加一个路径,在最后一个路径后添加分号,输入安装 CLI 二进制文件的文件夹的完整路径。
  • 对于 Linux、Mac 或任何 Unix 系统,打开 shell 的配置文件脚本(.bash_profile.profile.bash_login,并在文件末尾添加以下行:
export PATH=~/.local/bin:$PATH

最后,将配置文件加载到当前会话中:

source ~/.bash_profile

通过打开新的终端会话并键入以下命令,验证 CLI 是否已正确安装:

aws --version

您应该能够看到 AWS CLI 版本;在我的情况下,安装了 1.14.60:

让我们测试一下,并以法兰克福地区的 Lambda 函数为例:

aws lambda list-functions --region eu-central-1

上一个命令将显示以下输出:

使用 CLI 时,通常需要 AWS 凭据才能使用 AWS 服务进行身份验证。有多种方法可以配置 AWS 凭据:

  • 环境凭证AWS_ACCESS_KEY_IDAWS_SECRET_KEY变量。

  • 共享凭证文件~/.aws/credentials文件。

  • IAM 角色:如果您在 EC2 实例中使用 CLI,则无需在生产中管理凭据文件。

在下一节中,我将向您展示如何使用AWS 身份和访问管理IAM服务为 CLI 创建新用户。

AWS 管理控制台

IAM 是一项允许您管理用户、组及其对 AWS 服务的访问级别的服务。

强烈建议您不要将 AWS 根帐户用于除计费任务以外的任何任务,因为它拥有创建和删除 IAM 用户、更改计费、关闭帐户以及对您的 AWS 帐户执行所有其他操作的最终权限。因此,我们将创建一个新的 IAM 用户,并按照最低特权的原则授予其访问正确 AWS 资源所需的权限。在这种情况下,用户将拥有对 AWS Lambda 服务的完全访问权:

  1. 登录 AWS 管理控制台(https://console.aws.amazon.com/console/home )使用您的 AWS 电子邮件地址和密码。
  2. 安全、身份&合规部分打开IAM控制台:

  1. 从导航窗格中,选择用户并单击添加用户按钮,然后为用户设置名称并选择编程访问(如果希望同一用户访问控制台,还可以选择 AWS 管理控制台访问):

  1. 在“设置权限”部分中,将 AWSLambdaFullAccess 策略分配给用户:

  1. 在最后一页上,您应该看到用户的 AWS 凭据:

确保将访问密钥保存在安全位置,因为您将无法再次看到它们:

配置

我们的 IAM 用户已创建。让我们提供访问密钥和密钥以及默认区域。这可以使用aws configure命令完成:

CLI 将在~/.aws/credentials(或 Windows 上的%UserProfile%\.aws/credentials中)的本地文件中存储上述命令中指定的凭据,其中包含以下内容:

[default]
aws_access_key_id = AKIAJYZMNSSSMS4EKH6Q
aws_secret_access_key = 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
region=eu-central-1

测试

应该是这样,;尝试以下命令,如果您有任何 Lambda 函数,您应该能够看到它们列出:

默认输出是 JSON。您可以通过添加--output选项来更改命令的输出格式(支持值:json表格文本)。以下是以表格形式显示的结果:

此外,您可以使用--query选项从这个 JSON 文档中提取输出元素。例如,要输出函数名属性,可以使用以下命令:

aws lambda list-functions --query Functions[].FunctionName

输出应类似于以下内容:

可以使用jq之类的工具来操作 JSON。它使我们能够对 CLI 返回的 JSON 进行过滤、映射、计数和执行其他高级 JSON 过程:

aws lambda list-functions | jq '.Functions[].FunctionName'

控制台将显示以下输出:

建立围棋环境

本节将引导您了解如何在多个平台上下载和安装 Go,如何构建一个简单的 Hello World 应用,以及如何使用 IDE 加速 Go 开发。在此过程中,您将熟悉在 Go 中编写 Lambda 函数所需的 Go 命令。

运行时环境

从 Go 下载页面(下载适合您的操作系统和体系结构的软件包 https://golang.org/dl/

  • **对于 macOS X:**下载goVersion.darwin.amd64.pkg文件并按照安装提示进行操作。要使更改生效,您可能需要重新启动任何打开的终端会话。
  • 对于 Windows:下载 MSI 安装程序并按照向导操作。安装程序将为您设置环境变量。
  • 对于 Linux打开一个新的终端会话并键入以下命令(撰写本文时,当前版本为 1.10):

**```go curl https://golang.org/doc/install?download=go1.10.1.linux-amd64.tar.gz -O /tmp/go1.10.tar.gz tar -C /usr/local -xzf /tmp/go1.10.tar.gz


前面的命令将使用`curl`*下载最新的 Go 包。*然后使用`tar`打开包装。接下来,通过将以下行添加到 shell 的概要脚本中,将`/usr/local/go/bin`添加到`PATH`环境变量中:

```go
export PATH=$PATH:/usr/local/go/bin

如果在自定义目录而不是/usr/local中安装 Go,则必须将GOROOT环境变量设置为指向安装它的目录:

export GOROOT=PATH/go
export PATH=$PATH:$GOROOT/bin

然后,您必须重新加载用户配置文件以应用更改:

$ source ~/.bash_profile

现在 Go 已经正确安装,并且为您的机器设置了路径,让我们测试一下。创建一个工作区,我们将在其上构建本书中的无服务器应用:

mkdir -p $HOME/go/src

Go 源代码位于工作区中;默认为$HOME/go。如果要使用其他目录,则需要设置GOPATH环境变量。

要验证 Go 工作区配置是否正确,可以运行go env命令:

如果设置了GOPATH变量,您就可以开始了。在工作区内,使用具有以下内容的vim创建一个main.go文件:

package main
import "fmt"

func main(){
  fmt.Println("Welcome to 'Hands-On serverless Applications with Go'")
}

使用以下命令编译文件:

go run main.go

文件运行成功后显示Welcome to 'Hands-On serverless Applications with Go';这表明 Go 正在正确编译文件。

Go 是一种编译语言,因此您可以使用以下命令为应用生成单个二进制文件:

go build -o app main.go

如果要为特定操作系统和体系结构构建可执行文件,可以覆盖GOOSGOARCH参数:

GOOS=linux GOARCH=amd64 go build -o app main.go

使用 vim 文本编辑器编辑 Go 不是最佳选择;因此,在下一节中,我将向您展示如何使用 VSCode 作为 Go 编辑器来提高您的开发效率/体验。

发展环境

拥有 IDE 可以提高开发速度并节省大量时间,这些时间可以用来调试和搜索正确的语法。此外,您还可以轻松导航和搜索 Lambda 函数代码。

但是我们应该用哪一个呢?有很多解决方案;这些解决方案可分为三大类:

  • IDEs:格兰德、日食、科莫多
  • 编辑:Atom、VSCode、升华文本
  • 基于云的 IDE:Cloud9、Codeanywhere、CodeEnvy

Go 生态系统提供了各种编辑器和 IDE;确保你和他们一起玩,找到最适合你的

我选择使用 Visual Studio 代码(VS 代码),因为它符合我的所有标准:

  • 开源
  • 支持多种语言
  • 插件驱动工具
  • 伟大的社区和支持

VSCode 对 Go 开发有强大的支持,包括语法突出显示开箱即用、内置 GIT 集成、所有 Go 工具的集成以及 Delve 调试器。

除了 Go 的本机支持外,开源社区还构建了一些有用且功能强大的插件,您可以从 VSCode 市场安装这些插件:

VSCode 也是跨平台的,因此您可以在 Mac、Linux 或 Windows 上使用它。使用 Visual Studio 代码,您可以使用一系列可用插件来扩展功能,这些插件附带了许多功能强大的附加功能,例如:

  • 自动完成当您键入 Go 文件时,您可以看到 IntelliSense 为您提供建议的完成方式:

**

  • 签名帮助:将鼠标悬停在任何变量、函数或结构上都会为您提供该项的信息,例如文档、签名、预期输入和输出参数。例如,下面的屏幕截图显示了通过悬停在main.go文件上获取的Println信息:

  • 代码格式:它使用gofmt工具,在保存时自动格式化您的 Go 源代码,使您的代码更易于编写、阅读和维护。
  • **集成调试器:**可以设置断点和条件断点,查看每帧中的堆栈跟踪和局部、全局变量。
  • 自动导入 Go 包:保存时自动导入所需 Go 包。
  • 测试运行程序:它允许您运行、停止和重新启动单元测试以及集成测试。

我期待 JetBrains 稳定发布 GoLand:它看起来是一个非常有前途的 Go IDE,我很高兴看到它的发展方向。

这就是一切!您已经准备好在 Go 中开始构建和部署无服务器应用。

总结

在本章中,我们学习了如何安装、配置和使用 AWS CLI。当涉及到管理 AWS 服务和自动化 Lambda 功能的部署时,此工具将非常有用。然后,我们介绍了如何使用最少的权限从 IAM 创建用户和生成 AWS 凭据。这样,如果您的访问密钥最终落入坏人手中,那么造成伤害的能力是有限的。此外,我们还学习了如何设置 Go 环境,逐步安装了适用于多种平台(Windows、macOS X 和 Linux)的 Go,并在 Go 中编译了我们的第一个 Hello World 应用。在此过程中,我们介绍了 Go 中最重要的命令,这将帮助您轻松地理解后面的章节。

在下一章中,我们将最终弄脏我们的手,并在 Go 中编写我们的第一个 Lambda 函数。

问题

  1. AWS CLI 不支持哪种格式?
    • JSON
    • 桌子
    • XML
    • 文本
  2. 是否建议使用 AWS 根帐户与 AWS 进行日常交互?若有,原因为何?
  3. 使用 AWS CLI 需要设置哪些环境变量?
  4. 如何将 AWS CLI 与命名配置文件一起使用?
  5. 解释 GOPATH 环境变量。
  6. 哪个命令行命令在 Go 中编译程序?
    • go build
    • go run
    • go fmt
    • go doc
  7. 什么是围棋工作区?*****