Reputation: 4399
I'm trying to deploy a AWS CDK app on AWS CodePipeline using CodeBuild actions.
The build and deploy works perfect locally (as it would!) but when running on CodeBuild, cdk
command fails with
Cannot find module './index'
Subprocess exited with error 1
This is most likely something trivial but scratching my head trying to figure out what!
The project structure is auto-generated (with 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
for the Build
stage is
phases:
build:
commands:
- cd ${CODEBUILD_SRC_DIR}/cdk
- yarn install
- yarn build
artifacts:
base-directory: ${CODEBUILD_SRC_DIR}/cdk
files:
- '**/*'
buildspec.yml
for the Deploy
stage is (the input directory to this stage is the artifact from Build
stage i.e. the cdk
directory)
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
The Deploy
stage throws the Cannot find module './index'
error at the cdk ls
step. Since the above build/deploy steps work locally (in a clean checkout) I suspect it could be something to do with copying artifacts from Build
to Deploy
stages is what's causing the problem, but can't pinpoint what. Any suggestions for troubleshooting?
Upvotes: 3
Views: 5321
Reputation: 55
I had the same issue and resolved it by passing in enable-symlinks: yes
in my buildspec.yml
artifacts:
enable-symlinks: yes
Upvotes: 2
Reputation: 1804
There is a known issue with CodeBuild that it breaks all your symlinks when it creates your artifact => https://forums.aws.amazon.com/thread.jspa?threadID=245780
The error Cannot find module './index'
is because your cdk.json
has a command to use ts-node
and when cdk tries to run it from node-modules/.bin/ts-node
the link is broken.
In order to do what you want, I suggest you to compress the code yourself on the build job. Something like:
- yarn build
- tar -czf /tmp/mycode.tar.gz .
artifacts:
files:
- 'mycode.tar.gz'
discard-paths: true
base-directory: '/tmp'
and decompress on the deploy job:
...
- cd ${CODEBUILD_SRC_DIR} # this is cdk directory
- tar -zxvf mycode.tar.gz
- cdk ls
- cdk deploy app
Upvotes: 2
Reputation: 8890
Do you have Lambda code in cdk? Can you check the handler used and if it is present at that path, e.g.
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')),
});
Upvotes: 0