很少的背景: -
2019年,我们开始从服务器转移到无服务器,并开始采用AWS lambda + Golang进行任何新开发。我的首席建筑师和现任首席技术官Ben Pyle(博客)提出了我们在所有微服务中使用的Golang模式。这是我们最近做出的最好的建筑决策之一。
到目前为止,我们在每个环境中都部署了300多个Lambdas。这些Lambdas的99%写在Golang中,其余的1%在节点,Python或Java中。我们大多数人在2019年开始时我的组织中都有Java背景。几个Golang培训课程帮助我们进行了平稳的过渡。
这篇文章将帮助您理解和实施用Golang撰写的AWS lambda。
aws Bill: -
这是我们最近一个月账单的屏幕截图。您可以看到我们有98百万个Lambda请求,我们的Lambda的总AWS账单为108美元。
-
写lambda时,请记住3件事。
1)运行时
2)包装尺寸
3)启动逻辑。
-
我们在组织中拥有的大部分GO Lambda都配置为128 MB内存(这是我们可以为AWS Lambda配置的最小内存)。
-
对于我们的大多数lambda,GO可执行的二进制尺寸约为8 MB。运行时的足迹较少。
-
这是几个运行时示例。您可以在此示例中看到冷启动时间为210.65 ms,并且使用了45 MB的内存。由于Golang将代码编译到本机代码并执行很快,因此大多数时候冷启动时间将是几毫秒至1秒钟。
Duration: 3.93 ms Billed Duration: 4 ms Memory Size:
128 MB Max Memory Used: 44 MB Init Duration: 210.65 ms
Duration: 1.36 ms Billed Duration: 2 ms Memory Size:
128 MB Max Memory Used: 45 MB
Duration: 16.44 ms Billed Duration: 17 ms Memory Size:
128 MB Max Memory Used: 45 MB
示例: -
我们遵循行业实施AWS Lambda的最佳实践。
1。优化静态初始化: -
这是处理程序之外发生的“初始化”代码。初始化了您与其他服务的变量或连接。
2。单用途lambdas: -
每个Lambda都有一个责任。对于任何CRUD操作,我们实现4个lambdas(创建,更新,删除和GET)
使用 aws cdk 和 aws sam ,以您首选的方式实现此示例
您可以从here
下载源代码aws sam部署说明: -
1)如果您部署了us-west-2-2
Region:
Type: String
Description: AWS Region Name
Default: us-west-2
2)将目录更改为模式目录SAM
cd sam
3)在命令行中,使用AWS SAM CLI命令部署应用程序。
sam deploy --stack-name employee-functions --capabilities CAPABILITY_NAMED_IAM --guided --profile <your profile name>
4)堆栈已成功部署后,请获取以下API网关URL。我们将使用此URL执行我们的API。
Key APIEndpoint
Description endpoint of EmployeeApi
Value https://fy6fpson09.execute-api.us-west-2.amazonaws.com/
AWS CDK部署说明: -
1)如果您部署了us-west-2,则更改config.ts文件中的区域名称。
export const getConfig = (): Options => {
return {
defaultRegion: "us-west-2",
apiStageName: "main",
}
}
2)将目录更改为模式目录CDK
cd cdk
3)在命令行中,使用AWS CDK CLI命令部署应用程序。
cdk deploy --all -a "npx ts-node bin/app.ts" --profile <your profile name>
4)一旦堆栈成功部署,请运行以下AWS CLI命令以获取API URL。它正在使用JQ。
aws cloudformation list-exports --query "Exports[?Name=='employee-api-url'].Value" --output text --profile <your profile name>
API执行: -
1)添加员工: -
curl -X POST -H 'Content-type: application/json'
https://fy6fpson09.execute-api.us-west-2.amazonaws.com/main/employee \
--data '{
"Age": 30,
"FirstName": "Kyle",
"LastName" : "Gray"
}'
您将在DynamoDB中看到以下记录。
2)找员工: -
curl -X GET -H 'Content-type: application/json' https://fy6fpson09.execute-api.us-west-2.amazonaws.com/main/employee/2414 | jq
Response:-
{
"Id": 2414,
"firstName": "Kyle",
"lastName": "Gray",
"age": 30,
"createdDatetime": "2023-03-06T05:23:59.471574185Z",
"modifiedDatetime": "0001-01-01T00:00:00Z"
}
3)更新员工: -
curl -X PUT -H 'Content-type: application/json' https://fy6fpson09.execute-api.us-west-2.amazonaws.com/main/employee/2414
--data '{
"Age": 31,
"FirstName": "Kyle",
"LastName" : "Gray"
}'
4)删除员工: -
curl -X DELETE -H 'Content-type: application/json' https://fy6fpson09.execute-api.us-west-2.amazonaws.com/main/employee/2414
清理: -
sam delete --stack-name employee-functions --profile <your profile name>
OR
cdk destroy --profile <your profile name>
总结: -
您可以看到在AWS环境中易于理解,实施和部署Golang Lambda的方式。我强烈建议您自己和组织尝试。我们有几个旧应用程序,我们使用一个带有1个CPU和2 GB RAM的ECS容器,这使我们每月花费约32美元。即使流量模式不一致,我们最终每月支付32美元。对于无服务器,我们每次使用付费,并且在没有流量的情况下不支付任何费用。在下一篇文章中,我将使用步骤函数 + universal target。