拥有多个 main.go 文件以部署基于 AWS Lambda 的应用程序
Having multiple main.go files in order to deploy AWS Lambda based application
我有以下复杂结构:
utils:
- utils.go
function1:
pkg1_specific_to_fn1:
-pkg1_specific_to_fn1.go
pkg2_specific_to_fn1:
-pkg2_specific_to_fn1.go
main.go
function2:
pkg1_specific_to_fn1:
-pkg1_specific_to_fn2.go
pkg2_specific_to_fn1:
-pkg2_specific_to_fn2.go
main.go
function3:
pkg1_specific_to_fn1:
-pkg1_specific_to_fn3.go
pkg2_specific_to_fn1:
-pkg2_specific_to_fn3.go
main.go
如何在 Go 语言中为所有这些函数创建 .YML 部署文件?如果所有这些函数都有自己的 main,会有什么问题吗?我是 GoLang 的新手,但据我所知,包只能包含一个 main.go 文件,而在 handler
属性 的 YML 文件中,我必须从 [=14= 指定可执行文件].这是我的想法:
service: myService
provider:
name: aws
runtime: go1.x
functions:
function1:
handler: bin/function1/main
description: ..
events: ..
function2:
handler: bin/function2/main
events: ..
function3:
handler: bin/function3/main
因为我有多个代表多个 Lambda 函数的包,所以我应该可以在每个包中包含 main.go,对吗?如果不是那么正确的方法是什么?另外,如果这没问题,我如何为每个函数指定正确的 main
二进制文件,这真的是使用 GoLang 部署多个 lambda 的惯例吗?
注意: 在每个main.go中都有对应的函数Handler。
lambda 函数的部署归结为 package/module 组织和自动化部署工具。
第一个看起来像是在您的问题中解决了共享代码被放置到 util 并且每个 lambda 都有一个单独的包。在问题中,不清楚使用的是什么部署方法。有多种方法可以部署 lambda
虽然我一直是 e2e 和自动化的倡导者,但针对各种事件的最终运行器多 lambda 部署工作流程可能如下所示
init:
fn1ZipLocation: somepath1.zip
fn2ZipLocation: somepath2.zip
fnXZipLocation: somepathX.zip
pipeline:
build:
fn1:
action: exec:run
target: $target
sleepTimeMs: 1500
errors:
- ERROR
commands:
- cd ${appPath}aeroagg/app
- unset GOPATH
- export GOOS=linux
- export GOARCH=amd64
- go build -o function1
- zip -j somepath1.zip function1
...
deployFunctions:
fn1:
action: aws/lambda:deploy
credentials: aws-e2e
functionname: fn1
runtime: go1.x
handler: main
code:
zipfile: $LoadBinary(${fn1ZipLocation})
rolename: lambda-fn1-executor
define:
- policyname: xxx-resource-fn1-role
policydocument: $Cat('${privilegePolicy}')
attach:
- policyarn: arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
triggers:
- source: somequeue
type: sqs
enabled: true
batchSize: 20000
fn2:
action: aws/lambda:deploy
credentials: aws-e2e
functionname: fn2
runtime: go1.x
handler: main
code:
zipfile: $LoadBinary(${fn2ZipLocation})
rolename: lambda-fn2-executor
define:
- policyname: xxx-resource-fn2-role
policydocument: $Cat('${privilegePolicy}')
attach:
- policyarn: arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
notification:
action: aws/s3:setupBucketNotification
bucket: someBucket
lambdaFunctionConfigurations:
- functionName: fn2
id: ObjectCreatedEvents
events:
- s3:ObjectCreated:*
filter:
prefix:
- folderXXX
suffix:
- .csv
...
fnX:
action: aws/lambda:deploy
functionname: fnX
runtime: go1.x
handler: main
timeout: 360
vpcMatcher:
instance:
name: instanceWithVPC
environment:
variables:
CONFIG: $AsString($config)
code:
zipfile: $LoadBinary(${fn2ZipLocation})
rolename: lambda-fn3-executor
define:
- policyname: lambda-sns-execution-role
policydocument: $Cat('${privilegePolicy}')
attach:
- policyarn: arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
- policyarn: arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
setupSubscription:
action: aws/sns:setupSubscription
protocol: lambda
endpoint: fnX
topic: someTopic
deployGatewayAPI:
redeploy: true
action: aws/apigateway:setupRestAPI
'@name': myAPIName
resources:
- path: /
methods:
- httpMethod: GET
functionname: fn3
- path: /{proxy+}
methods:
- httpMethod: GET
functionname: fn4
- path: /v1/api/fn4
methods:
- httpMethod: GET
functionname: fn5
最后你可以用 lambda e2e 实际测试示例检查 serverless e2e。
我有以下复杂结构:
utils:
- utils.go
function1:
pkg1_specific_to_fn1:
-pkg1_specific_to_fn1.go
pkg2_specific_to_fn1:
-pkg2_specific_to_fn1.go
main.go
function2:
pkg1_specific_to_fn1:
-pkg1_specific_to_fn2.go
pkg2_specific_to_fn1:
-pkg2_specific_to_fn2.go
main.go
function3:
pkg1_specific_to_fn1:
-pkg1_specific_to_fn3.go
pkg2_specific_to_fn1:
-pkg2_specific_to_fn3.go
main.go
如何在 Go 语言中为所有这些函数创建 .YML 部署文件?如果所有这些函数都有自己的 main,会有什么问题吗?我是 GoLang 的新手,但据我所知,包只能包含一个 main.go 文件,而在 handler
属性 的 YML 文件中,我必须从 [=14= 指定可执行文件].这是我的想法:
service: myService
provider:
name: aws
runtime: go1.x
functions:
function1:
handler: bin/function1/main
description: ..
events: ..
function2:
handler: bin/function2/main
events: ..
function3:
handler: bin/function3/main
因为我有多个代表多个 Lambda 函数的包,所以我应该可以在每个包中包含 main.go,对吗?如果不是那么正确的方法是什么?另外,如果这没问题,我如何为每个函数指定正确的 main
二进制文件,这真的是使用 GoLang 部署多个 lambda 的惯例吗?
注意: 在每个main.go中都有对应的函数Handler。
lambda 函数的部署归结为 package/module 组织和自动化部署工具。 第一个看起来像是在您的问题中解决了共享代码被放置到 util 并且每个 lambda 都有一个单独的包。在问题中,不清楚使用的是什么部署方法。有多种方法可以部署 lambda
虽然我一直是 e2e 和自动化的倡导者,但针对各种事件的最终运行器多 lambda 部署工作流程可能如下所示
init:
fn1ZipLocation: somepath1.zip
fn2ZipLocation: somepath2.zip
fnXZipLocation: somepathX.zip
pipeline:
build:
fn1:
action: exec:run
target: $target
sleepTimeMs: 1500
errors:
- ERROR
commands:
- cd ${appPath}aeroagg/app
- unset GOPATH
- export GOOS=linux
- export GOARCH=amd64
- go build -o function1
- zip -j somepath1.zip function1
...
deployFunctions:
fn1:
action: aws/lambda:deploy
credentials: aws-e2e
functionname: fn1
runtime: go1.x
handler: main
code:
zipfile: $LoadBinary(${fn1ZipLocation})
rolename: lambda-fn1-executor
define:
- policyname: xxx-resource-fn1-role
policydocument: $Cat('${privilegePolicy}')
attach:
- policyarn: arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
triggers:
- source: somequeue
type: sqs
enabled: true
batchSize: 20000
fn2:
action: aws/lambda:deploy
credentials: aws-e2e
functionname: fn2
runtime: go1.x
handler: main
code:
zipfile: $LoadBinary(${fn2ZipLocation})
rolename: lambda-fn2-executor
define:
- policyname: xxx-resource-fn2-role
policydocument: $Cat('${privilegePolicy}')
attach:
- policyarn: arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
notification:
action: aws/s3:setupBucketNotification
bucket: someBucket
lambdaFunctionConfigurations:
- functionName: fn2
id: ObjectCreatedEvents
events:
- s3:ObjectCreated:*
filter:
prefix:
- folderXXX
suffix:
- .csv
...
fnX:
action: aws/lambda:deploy
functionname: fnX
runtime: go1.x
handler: main
timeout: 360
vpcMatcher:
instance:
name: instanceWithVPC
environment:
variables:
CONFIG: $AsString($config)
code:
zipfile: $LoadBinary(${fn2ZipLocation})
rolename: lambda-fn3-executor
define:
- policyname: lambda-sns-execution-role
policydocument: $Cat('${privilegePolicy}')
attach:
- policyarn: arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
- policyarn: arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole
setupSubscription:
action: aws/sns:setupSubscription
protocol: lambda
endpoint: fnX
topic: someTopic
deployGatewayAPI:
redeploy: true
action: aws/apigateway:setupRestAPI
'@name': myAPIName
resources:
- path: /
methods:
- httpMethod: GET
functionname: fn3
- path: /{proxy+}
methods:
- httpMethod: GET
functionname: fn4
- path: /v1/api/fn4
methods:
- httpMethod: GET
functionname: fn5
最后你可以用 lambda e2e 实际测试示例检查 serverless e2e。