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



我正在使用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

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

我在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

我希望这能有所帮助。

此外,我应该使用什么作为此作业的基本映像?我在想,我可以从python容器开始并安装节点,反之亦然。或者,也许有一个预构建的容器,我还没能找到。

对于任何想在2022年使用AWS CDK Python实现CI/CD的人来说,这里有一个经过测试的解决方案:

  • 使用python:3.10.8作为CI/CD中的基本映像(或Debian 11的任何图片(
  • 从NodeSource安装Node.js 16:curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && apt-get install -y nodejs
  • 安装aws cdk:npm i -g aws-cdk

您可以将后两个步骤作为内联脚本添加到CI/CD管道中,这样您就不需要构建自己的Docker映像。

以下是Bitbucket管道的完整示例:

image: python:3.10.8
run-tests: &run-tests
step:
name: Run tests
script:
# Node 16
- curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && apt-get install -y nodejs
- npm i -g aws-cdk
- pip install -r requirements-dev.txt
- pytest
pipelines:
pull-requests:
"**":
- <<: *run-tests
branches:
master:
- <<: *run-tests

请注意,以上说明不安装Docker引擎。在Bitbucket Pipelines中,只需添加即可使用Docker

services:
- docker

在配置文件中。

如果cdk deploy给您错误:

/usr/lib/node_modules/aws-cdk/lib/index.js:12422
home = path.join((os.userInfo().homedir ?? os.homedir()).trim(), ".cdk");

则CCD_ 10版本已经过时。这可以通过更新docker图像来修复,该图像也需要pip3:

cdk deploy:
image: docker:20.10.21
services:
- docker:20.10.21-dind
stage: deploy
only:
- master
before_script:
- apk add --no-cache python3
- python3 -V
- apk add py3-pip
- pip3 -V

最新更新