1亿Lambda处决,猜猜我们的AWS $$$ Bill -Golang
#aws #serverless #lambda #go

很少的背景: -

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美元。

AWS Bill

  • 写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中看到以下记录。

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