Невозможно создать и развернуть Go Lambda с помощью AWS CodePipeline - BundleType должен быть либо YAML, либо JSON - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь построить самые простые лямбда-функции в Go, используя AWS CodePipeline. Несмотря на то, что я играл с ним около 2 недель, мне так и не удалось развернуть его.

main.go

package main

import (
    "context"

    "github.com/aws/aws-lambda-go/lambda"
)

func HandleRequest(ctx context.Context) (string, error) {
    return "Hello from Go!", nil
}

func main() {
    lambda.Start(HandleRequest)
}

buildspec.yml

version: 0.2

env:
  variables:
    S3_BUCKET: dlp-queuetime
    PACKAGE: dlp-queuetime-fetcher

phases:
  install: 
    runtime-versions:
      golang: 1.12
    commands:
      # AWS Codebuild Go images use /go for the $GOPATH so copy the src code into that dir structure
      - mkdir -p "/go/src/$(dirname ${PACKAGE})"
      - ln -s "${CODEBUILD_SRC_DIR}" "/go/src/${PACKAGE}"
      # Print all environment variables (handy for AWS CodeBuild logs)
      - env
      # Install Lambda Go
      - go get github.com/aws/aws-lambda-go/lambda
  pre_build:
    commands:
      # Make sure we're in the project directory within our GOPATH
      - cd "/go/src/${PACKAGE}"
      # Fetch all dependencies
      - go get -t ./...
  build:
    commands:
      # Build our Go app
      - go build -o main
  post_build:
    commands:
      - echo Build completed on `date`
artifacts:
  type: zip
  files:
    - appspec.yml
    - main

appspec.yml

version: 0.0
Resources:
  - dlpQueueTimeFetcher:
      Type: AWS::Lambda::Function
      Properties:
        Name: "dlpQueueTimeFetcher"
        Alias: "v0"
        CurrentVersion: "1"
        TargetVersion: "2"

Во время развертывания CodeDeploy выдает следующую ошибку: Ошибка выполнения действия - BundleType долженбыть YAML или JSON .

Похоже, CodeDeploy не может найти мой файл appspec.yml, несмотря на то, что он определен в разделах artifacts моей спецификации сборки. Что я тут не так делаю?

1 Ответ

1 голос
/ 09 октября 2019

Проблема, с которой вы сталкиваетесь, хорошо известна при подключении CodePipeline к CodeDeploy для Lambda, поскольку CodeDeploy ищет файл appspec для Yaml или Json, тогда как артефакт, представленный CodePipeline, представляет собой zip-файл, содержащий apppec:

На данный момент вы можете использовать CloudFormation в качестве развертыванияинструмент для вашей лямбда-функции в вашем конвейере. Основная идея развертывания лямбда-функции заключается в следующем:

  1. Создание шаблона SAM вашей лямбда-функции

  2. Внешний вид базового шаблона SAMнапример:

    AWSTemplateFormatVersion: '2010-09-09'
    Transform: 'AWS::Serverless-2016-10-31'
    Resources:
        FunctionName:
            Type: 'AWS::Serverless::Function'
            Properties:
                Handler: index.handler
                Runtime: nodejs6.10
                CodeUri: ./code
    
  3. Добавить каталог "code" и сохранить файлы лямбда-кода в этом каталоге

  4. Запустить команду для упаковки изагрузить:

    $ aws cloudformation package --template-file template.yaml --output-template packaged.yaml --s3-bucket {your_S3_bucket}
    
  5. Развернуть пакет:

    $ aws cloudformation deploy --template-file packaged.yaml --stack-name stk1 --capabilities CAPABILITY_IAM
    

Код шаблона (Шаг 1-2) можно сохранить в CodeCommit /Github и выполните шаг 4 в шаге CodeBuild. Для шага 5 я рекомендую сделать это с помощью действия CloudFormation в CodePipeline, который в качестве входного артефакта передает файл «packaged.yaml».

Описанный выше процесс подробно описан здесь: https://docs.aws.amazon.com/en_us/lambda/latest/dg/build-pipeline.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...