Каков наилучший способ сделать CI / CD с AWS CDK (python), используя GitLab CI? - PullRequest
2 голосов
/ 29 апреля 2020

Я использую AWS CDK (с Python) для контейнерного приложения, которое работает на Fargate. Я хотел бы запустить cdk deploy в CI-процессе GitLab и передать тег git в качестве переменной среды, которая заменяет контейнер, запущенный в Fargate. В настоящее время я делаю нечто подобное с CloudFormation (aws cloudformation update-stack ...). Кто-нибудь еще делает CI / CD с AWS CDK таким образом? Есть ли лучший способ сделать это?

Кроме того, что я должен использовать для своего базового изображения для этой работы? Я думал, что могу либо начать с контейнера 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 может создавать 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

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 Ответ

2 голосов
/ 30 апреля 2020

вам определенно нужно использовать CDK для развертывания внутри конвейера CI / CD, если у вас есть ресурсы lambda или ECS, в противном случае вы можете запустить синтезатор CDK и передать получившуюся Cloudformation в AWS Code Deploy. Это означает, что большая часть вашего CI / CD будет потрачена на развертывание, что может потратить ваши бесплатные минуты на сборку уровня или просто означает, что вы платите больше (AWS Code Deploy бесплатен)

Я делаю нечто подобное с Golang в CircleCi. Я использую базовый образ 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

Надеюсь, это поможет.

...