使用 GitLab CI 使用 AWS CDK (python) 进行 CI/CD 的最佳方法是什么?

bri*_*fey 10 amazon-web-services continuous-deployment gitlab gitlab-ci aws-cdk

我将 AWS CDK(使用 Python)用于在 Fargate 上运行的容器化应用程序。我想cdk deploy在 GitLab CI 进程中运行并将 git 标记作为环境变量传递,以替换在 Fargate 中运行的容器。我目前正在使用 CloudFormation ( aws cloudformation update-stack ...)做类似的事情。还有其他人以这种方式使用 AWS CDK 进行 CI/CD 吗?有没有更好的方法来做到这一点?

另外,我应该为这项工作使用什么作为我的基本图像?我在想我可以从 python 容器开始并安装节点,反之亦然。或者也许在某处我还没有找到预建的容器。

这是似乎运行良好的开始:

CDK:
  image: python:3.8
  stage: deploy
  before_script:
    - apt-get -qq update && apt-get -y install nodejs npm
    - node -v
    - npm i -g aws-cdk
    - cd awscdk
    - pip3 install -r requirements.txt
  script:
    - cdk diff
    - cdk deploy --require-approval never
Run Code Online (Sandbox Code Playgroud)

编辑 2020-05-04:

CDK 可以在 期间构建 docker 镜像cdk deploy,但需要访问 docker。如果你不需要 docker,上面的 CI 作业定义应该没问题。这是我正在使用的当前 CI 工作:

cdk deploy:
  image: docker:19.03.1
  services:
    - docker:19.03.5-dind
  stage: deploy
  only:
    - master
  before_script:
    - apk add --no-cache python3
    - python3 -V
    - pip3 -V
    - apk add nodejs-current npm
    - node -v
    - npm i -g aws-cdk
    - cd awscdk
    - pip3 install -r requirements.txt
  script:
    - cdk bootstrap aws://$AWS_ACCOUNT_ID/$AWS_DEFAULT_REGION
    - cdk deploy --require-approval never
Run Code Online (Sandbox Code Playgroud)

cdk bootstrap是必需的,因为我在我的 cdk 代码中使用资产:

        self.backend_task.add_container(
            "DjangoBackend",
            image=ecs.AssetImage(
                "../backend",
                file="scripts/prod/Dockerfile",
                target="production",
            ),
            logging=ecs.LogDrivers.aws_logs(stream_prefix="Backend"),
            environment=environment_variables,
            command=["/start_prod.sh"],
        )
Run Code Online (Sandbox Code Playgroud)

以下是更多信息cdk bootstraphttps : //github.com/aws/aws-cdk/blob/master/design/cdk-bootstrap.md

Jon*_*mek 5

如果您有 lambda 或 ECS 资产,您肯定必须在 CI/CD 管道内使用 CDK 部署,否则,您可以运行 CDK 合成并将生成的 Cloudformation 传递给 AWS Code Deploy。这意味着您的大量 CI/CD 将用于部署,这可能会耗尽您的免费套餐构建时间,或者只是意味着您需要支付更多费用(AWS Code Deploy 是免费的)

我在 CircleCi 中对 Golang 做了类似的事情。我使用 Go 基础镜像并安装 nodejs 和 cdk。我使用这个基础镜像来构建我所有的 go 二进制文件、vuejs 前端并编译 cdk typescript 并部署它。

FROM golang:1.13

RUN go get -u -d github.com/magefile/mage
WORKDIR $GOPATH/src/github.com/magefile/mage
RUN go run bootstrap.go

RUN curl -sL https://deb.nodesource.com/setup_12.x | bash -
RUN apt-get install -y nodejs
RUN npm i -g aws-cdk@1.36.x
RUN npm i -g typescript
RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list
RUN apt update && apt install yarn
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助。