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

时间:2020-04-29 02:43:36

标签: amazon-web-services gitlab gitlab-ci continuous-deployment aws-cdk

我将AWS CDK(带有Python)用于在Fargate上运行的容器化应用程序。我想在GitLab CI进程中运行cdk deploy,并将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

编辑2020-05-04:

CDK可以在cdk deploy期间构建docker映像,但是它需要访问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

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"],
        )

有关cdk bootstrap的更多信息:https://github.com/aws/aws-cdk/blob/master/design/cdk-bootstrap.md

1 个答案:

答案 0 :(得分:3)

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

我在CircleCi中对Golang做类似的事情。我使用Go基本映像并安装nodejs和cdk。我使用此基础映像来构建所有go二进制文件,vuejs前端并编译cdk打字稿并进行部署。

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

我希望能有所帮助。