Наличие нескольких файлов main.go для развертывания приложения на основе AWS Lambda - PullRequest
2 голосов
/ 13 мая 2019

У меня следующая сложная структура:

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

Как мне создать файл развертывания .YML для всех этих функций в GoLang? Будут ли какие-либо проблемы, если у всех этих функций будет свой основной? Я новичок в 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?

ПРИМЕЧАНИЕ: в каждом main.go есть соответствующий обработчик функции.

1 Ответ

2 голосов
/ 13 мая 2019

Развертывание лямбда-функции сводится к средствам организации пакетов / модулей и средствам автоматизации.Первый выглядит как адрес в вашем вопросе, где общий код размещен для использования, и каждая лямбда имеет индивидуальный пакет.В вопросе не ясно, какой метод развертывания используется.Существуют различные способы развертывания лямбды

В то время как я был сторонником e2e и автоматизации, с конечным рабочим процессом развертывания нескольких лямбда-систем для различныхСобытия могут выглядеть следующим образом:

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

Наконец, вы можете проверить e2e без сервера с примерами практического тестирования lambda e2e.

...