猿问

拥有多个 main.go 文件以部署基于 AWS Lambda 的应用程序

我有以下复杂的结构:


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

如何在 GoLang 中为所有这些函数创建 .YML 部署文件?如果所有这些函数都有自己的 main,会有什么问题吗?我是 GoLang 的新手,但据我所知,包只能包含一个 main.go 文件,而在 YML 文件中,handler我必须为属性指定可执行文件bin。这是我的想法:


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。


倚天杖
浏览 128回答 1
1回答

翻翻过去那场雪

lambda 函数的部署归结为包/模块组织和自动化部署工具。第一个看起来像是在您的问题中解决了共享代码被放置到 util 并且每个 lambda 都有一个单独的包。在问题中,不清楚使用的是什么部署方法。有多种方法可以部署 lambda命令行界面AWS 无服务器应用程序模型Endly - 自动化和 e2e 运行器地貌虽然我一直是 e2e 和自动化的倡导者,但针对各种事件的最终运行器多 lambda 部署工作流程可能如下所示init:  fn1ZipLocation: somepath1.zip  fn2ZipLocation: somepath2.zip  fnXZipLocation: somepathX.zippipeline:  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 实际测试示例检查 无服务器 e2e。
随时随地看视频慕课网APP

相关分类

Go
我要回答