【问题标题】:Having multiple main.go files in order to deploy AWS Lambda based application拥有多个 main.go 文件以部署基于 AWS Lambda 的应用程序
【发布时间】:2019-05-23 00:10:23
【问题描述】:

我有以下复杂的结构:

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 部署文件?如果所有这些功能都有自己的主要功能,会有什么问题吗?我是 GoLang 的新手,但据我所知,包只能包含一个 main.go 文件,并且在 handler 属性的 YML 文件中,我必须从 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 部署多个 lambdas 的约定吗?

注意: 在每个main.go中都有对应的函数Handler。

【问题讨论】:

    标签: amazon-web-services go aws-lambda serverless-framework


    【解决方案1】:

    lambda 函数的部署归结为包/模块组织和自动化部署工具。 第一个看起来像是在您的问题中解决了共享代码被放置到 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
    

    最后你可以检查serverless e2e 与 lambda e2e 实际测试示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 2020-10-22
      • 2018-05-18
      • 2013-12-07
      相关资源
      最近更新 更多