用AWS Lambda和Golang创建无服务器函数(FaaS

12,437 阅读5分钟

在靠近用户的地方部署容器

本工程教育(EngEd)计划由科支持。

在全球范围内即时部署容器。Section是经济实惠、简单而强大的。

免费入门

使用AWS Lambda和Golang创建无服务器函数(FaaS)

9月13日, 2021

无服务器架构是一种新的范式,正在被用于现代应用的开发中。无服务器一词指的是将服务器从应用开发中抽象出来。

与服务器计算相比,无服务器计算的一个优势是,云提供商负责服务器,而你则专注于应用开发。

功能即服务(FaaS)是一种在云上运行模块化代码的无服务器方法。你可以使用FaaS来编写由事件触发的代码。

例如,当用户点击你的Web应用中的一个按钮时,就会执行一个特定的云函数。

在本教程中,我们将建立一个用户资料生成器函数。

该函数将接受一些用户数据,并根据这些数据返回一个简介。

将生成器函数上传到AWS Lambda后,我们将创建一个客户端程序,与AWS Lambda上的用户配置文件生成函数进行通信。

如果你是无服务器计算的新手,强烈建议你浏览一下这些文章。

要求

  • 使用AWS账户访问AWS lambda仪表盘。
  • 使用git clone https://github.com/Bamimore-Tomi/faas-golang.git ,下载本演示的源代码。
  • 在你的机器上安装Go 1.x运行时。

设置AWS Lambda函数

  1. 创建你的AWS账户后,在主仪表板上,搜索Lambda

search-aws-lambda

当你点击Lambda ,AWS Lambda仪表盘就会显示出来,如下图所示。

aws-lambda-dashboard

  1. 点击Create function 按钮,创建一个新的AWS Lambda函数。

aws-create-lambda-setting

在这里,我们指定该函数的名称为user-profile

  1. 在该函数的仪表板上,我们将上传我们想要在云端运行的函数。

aws-lambda-function-dashboard

在下一节,我们将看看如何制作一个在AWS Lambda上运行的函数。

在Golang中创建一个用户配置文件函数

在这一节中,我们将看到如何创建一个函数,在上传到AWS Lambda上之前将其转换为一个压缩文件。

我们需要安装aws-lambda-go 包,使用。

  • go mod init
  • go get github.com/aws/aws-lambda-go/lambda
package main

import (
	"fmt"
	"github.com/aws/aws-lambda-go/lambda"
)

// Struct for the input the program expects from the client
type InfoEvent struct {
	Firstname string `json:"firstname"`
	Lastname string `json:"lastname"`
	Age int `json:"age"`
}

// Struct for the output the server will send back to the client
type Response struct {
	Profile string `json:"profile"`
}

// Event handler, this function handles requests from clients
func HandleInfoEvent(event InfoEvent) (Response, error) {
	return Response{Profile: fmt.Sprintf("Their name is %s %s, they are %d ", event.Firstname, event.Lastname, event.Age)}, nil
}

func main() {
	lambda.Start(HandleInfoEvent)
}

导航到server 文件夹,看这个源代码。

在上面的程序中,我们创建了HandleInfoEvent 函数。这个方法在云中运行。

使用下面的步骤来编译和压缩程序。

安装 - MacOS和Linux

  1. 编译可执行文件。
GOOS=linux go build main.go
  1. 用以下命令创建压缩文件。
zip user-profile-function.zip main

安装--Windows

  1. 从GitHub下载build-lambda-zip 工具。
go.exe get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip
  1. 现在你可以使用之前下载的工具来创建压缩文件。
Set GOOS=linux

Go build -o main main.go

%USERPROFILE%\Go\bin\build-lambda-zip.exe -output main.zip main

现在你可以将生成的压缩文件上传到AWS Lambda。

你可以测试一下这个函数,看看它是否运行良好。

首先,我们需要将处理程序的名称从默认的hello 改为main

Lambda函数处理程序是你函数代码中处理事件的方法。

aws-lambda-edit-hanler

点击Edit

aws-lambda-runtime-settings

将处理程序字段从hello 改为main ,然后点击Save

在AWS Lambda上测试该函数

  1. 在主仪表板上,点击Test

aws-lambda-dashboard-test

  1. 在页面上的JSON编辑器中输入这个样本数据,然后点击Test
{
	"firstname": "Oluwatomisin",
	"lastname": "Bamimore",
	"age": 19
}

aws-lambda-test-prompt

结果将是。

aws-lambda-test-result

从Golang调用Lambda函数

我们也可以在本地执行同样的函数。

为此,我们必须安装AWS Go SDK ,如图所示。

go get github.com/aws/aws-sdk-go

现在我们可以使用这个代码段在云端执行该函数,并在本地看到结果。

package main

import (
	"encoding/json"
	"fmt"
	"os"
	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/service/lambda"
	"github.com/joho/godotenv"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
)

type Info struct {
	Firstname string `json:"firstname"`
	Lastname string `json:"lastname"`
	Age int `json:"age"`
}

type Response struct {
	Profile string `json:"profile"`
}

func main() {
	// Load the environment variable which has the IAM credentials needed to connect to AWS
	godotenv.Load()
	// Initialize new aws session
	sess := session.Must(session.NewSessionWithOptions(session.Options{SharedConfigState: session.SharedConfigEnable}))
	// Initialize new aws client using IAM credentials
	client := lambda.New(sess, &aws.Config{Region: aws.String("us-east-1"), Credentials: credentials.NewStaticCredentials(os.Getenv("aws_access_key_id"), os.Getenv("aws_secret_access_key"), "")})
	// Prepare request parameters
	request := Info{Firstname: "Oluwatomisin", Lastname: "Bamimore", Age: 16}

	payload, err := json.Marshal(request)

	if err != nil {
		fmt.Println("Error marshalling request")
		os.Exit(0)
	}

	result, err := client.Invoke(&lambda.InvokeInput{FunctionName: aws.String("user-profile"), Payload: payload})

	if err != nil {
		fmt.Println("Error calling user-profile function", err)
		os.Exit(0)
	}

	var resp Response

	err = json.Unmarshal(result.Payload, &resp)

	if err != nil {
		fmt.Println("Error unmarshalling user-profile response")
		os.Exit(0)
	}

	// Print response from lambda function
	fmt.Println(resp.Profile)
}

你需要创建一个具有正确权限的IAM用户。

aws_access_key_idaws_secret_access_key 存储在你目前工作的目录中的.env 文件中。

sample-env-file

运行该程序后,AWS将执行云函数,你将得到这个结果。

sample-program-output

该程序将一些参数(json格式)传入云函数并返回结果。

总结

我们已经看到了如何部署和消费AWS Lambda函数。

在本教程中,我们通过建立一个用Golang编写的用户配置文件生成器函数来学习。

我们还通过使用一个实际的客户端程序和AWS上的Lambda控制台发送触发器来测试Lambda函数。

在其他语言中,如Python、JavaScript和Java,我们使用相同的机制来创建无服务器函数。

编码愉快。

进一步阅读


同行评审投稿人:。Srishilesh P S

类似文章

[

Event-Driven Architecture for Your IoT Projects Hero Image

边缘计算

为什么你的物联网项目需要事件驱动架构?

阅读更多

](www.section.io/engineering…

Digital Twin Hero Image

边缘计算

机器人的数字双胞胎和物联网

阅读更多

](www.section.io/engineering…

Computational Storage a Newfound Solution to Edge Storage Problems? Hero Image

边缘计算

计算型存储是解决边缘存储问题的新方法吗?

阅读更多

](www.section.io/engineering…)