为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
倚天杖 2023-06-19 14:05:30
我有以下复杂的结构:utils:    - utils.gofunction1:    pkg1_specific_to_fn1:        -pkg1_specific_to_fn1.go    pkg2_specific_to_fn1:        -pkg2_specific_to_fn1.go    main.gofunction2:    pkg1_specific_to_fn1:        -pkg1_specific_to_fn2.go    pkg2_specific_to_fn1:        -pkg2_specific_to_fn2.go    main.gofunction3:    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: myServiceprovider:  name: aws  runtime: go1.xfunctions:  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。
查看完整描述

1 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

lambda 函数的部署归结为包/模块组织和自动化部署工具。第一个看起来像是在您的问题中解决了共享代码被放置到 util 并且每个 lambda 都有一个单独的包。在问题中,不清楚使用的是什么部署方法。有多种方法可以部署 lambda

  • 命令行界面

  • AWS 无服务器应用程序模型

  • Endly - 自动化和 e2e 运行器

  • 地貌

虽然我一直是 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 实际测试示例检查 无服务器 e2e。



查看完整回答
反对 回复 2023-06-19
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信