【问题标题】:AWS CDK deploy in CodePipeline/CodeBuildAWS CDK 在 CodePipeline/CodeBuild 中部署
【发布时间】:2020-08-23 22:44:06
【问题描述】:

我正在尝试使用 CodeBuild 操作在 AWS CodePipeline 上部署 AWS CDK 应用程序。

构建和部署在本地完美运行(因为它会!)但是在 CodeBuild 上运行时,cdk 命令失败并显示

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.ymlBuild 阶段是

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

Deploy 阶段的buildspec.yml 是(此阶段的输入目录是来自Build 阶段的工件,即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 阶段在cdk ls 步骤中引发Cannot find module './index' 错误。由于上述构建/部署步骤在本地工作(在干净的结帐中),我怀疑这可能与将工件从 Build 复制到 Deploy 阶段有关,这是导致问题的原因,但无法查明是什么。有什么故障排除建议吗?

【问题讨论】:

  • 尝试在cdk ls命令之前添加ls,以验证所有文件都在那里
  • 是的,试过了,所有文件似乎都在那里..
  • 奇怪..你能分享你手动执行的步骤吗?我知道它与 buildspec.yaml 相同,但可能需要进行一些小改动
  • 是的,这确实很奇怪。可能是我遗漏了一些简单的东西。我手动运行的步骤是npm install &amp;&amp; npm run build &amp;&amp; cdk deploy
  • 用最小的应用程序复制github.com/IndikaUdagedara/CDKSample

标签: typescript aws-codepipeline aws-codebuild aws-cdk


【解决方案1】:

我遇到了同样的问题,并通过在我的 buildspec.yml 中传递 enable-symlinks: yes 解决了它

artifacts:
  enable-symlinks: yes

【讨论】:

    【解决方案2】:

    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
    

    【讨论】:

      【解决方案3】:

      cdk 中有 Lambda 代码吗?您能否检查所使用的处理程序以及它是否存在于该路径中,例如

      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')),
      });
      

      【讨论】:

        猜你喜欢
        • 2021-04-08
        • 2018-07-18
        • 2020-10-07
        • 1970-01-01
        • 2017-07-14
        • 1970-01-01
        • 1970-01-01
        • 2019-04-07
        • 1970-01-01
        相关资源
        最近更新 更多