AWS CDK развернуть в CodePipeline / CodeBuild - PullRequest
2 голосов
/ 08 мая 2020

Я пытаюсь развернуть приложение AWS CDK на AWS CodePipeline с помощью действий CodeBuild.

Сборка и развертывание отлично работают локально (как и было бы!), Но при работе на CodeBuild * Команда 1003 * не работает с

Cannot find module './index'
Subprocess exited with error 1

Это, скорее всего, что-то тривиальное, но я ломаю голову, пытаясь понять, что!

Структура проекта генерируется автоматически (с cdk init --language typescript)

<>/cdk$ ls
README.md  app  cdk.context.json  cdk.json  cdk.out  jest.config.js  lib  node_modules  package.json  test  tsconfig.json  yarn.lock

buildspec.yml для стадии Build это

phases:
  build:
    commands:
      - cd ${CODEBUILD_SRC_DIR}/cdk
      - yarn install
      - yarn build
artifacts:
  base-directory: ${CODEBUILD_SRC_DIR}/cdk
  files:
    - '**/*'

buildspec.yml для стадии Deploy (входным каталогом для этого этапа является артефакт из Build stage, т.е. каталог cdk)

phases:
  install:
    commands:
      - npm install -g aws-cdk
      - cdk --version

  build:
    commands:
      - cd ${CODEBUILD_SRC_DIR} # this is cdk directory
      - cdk ls
      - cdk deploy app

Этап Deploy выдает ошибку Cannot find module './index' на шаге cdk ls. Поскольку приведенные выше шаги сборки / развертывания работают локально (при чистой проверке), я подозреваю, что это может быть связано с копированием артефактов с этапов Build на Deploy, что вызывает проблему, но не могу точно определить, что. Есть предложения по устранению неполадок?

Ответы [ 2 ]

1 голос
/ 13 мая 2020

Существует известная проблема с CodeBuild, заключающаяся в том, что он разбивает все ваши символические ссылки при создании вашего артефакта => https://forums.aws.amazon.com/thread.jspa?threadID=245780

Ошибка Cannot find module './index' связана с тем, что ваш cdk.json имеет команда для использования ts-node, и когда cdk пытается запустить ее из node-modules/.bin/ts-node, ссылка не работает.

Чтобы сделать то, что вы хотите, я предлагаю вам самостоятельно сжать код в задании сборки. Что-то вроде:

      - yarn build
      - tar -czf /tmp/mycode.tar.gz .
artifacts:
  files:
    - 'mycode.tar.gz'
  discard-paths: true
  base-directory: '/tmp'

и распаковать при развертывании:

...
      - cd ${CODEBUILD_SRC_DIR} # this is cdk directory
      - tar -zxvf mycode.tar.gz
      - cdk ls
      - cdk deploy app
0 голосов
/ 09 мая 2020

У вас есть лямбда-код в cdk? Можете ли вы проверить используемый обработчик и присутствует ли он на этом пути, например,

import * as lambda from '@aws-cdk/aws-lambda';
import * as path from 'path';

const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_10_X,
  handler: 'dist/index.handler',  <======= Check index.js file is inside dist directory
  code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')),
});
...