如何使用GitLab CI将应用部署到AWS Beanstalk

4

如何在AWS Elastic Beanstalk、Docker和Gitlab ci上部署Node应用程序。

我创建了一个简单的Node应用程序,并将其Docker化。

我想要做的是使用Gitlab ci部署我的应用程序。

目前为止,这就是我所拥有的。

image: docker:git
services:
  - docker:dind

stages:
  - build
  - release
  - release-prod

variables:
  CI_REGISTRY: registry.gitlab.com
  CONTAINER_TEST_IMAGE: registry.gitlab.com/testapp/routing:$CI_COMMIT_REF_NAME
  CONTAINER_RELEASE_IMAGE: registry.gitlab.com/testapp/routing:latest

before_script:
  - echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin "$CI_REGISTRY"

build:
  stage: build
  script:
    - docker build -t $CONTAINER_TEST_IMAGE -f Dockerfile.prod .
    - docker push $CONTAINER_TEST_IMAGE

release-image:
  stage: release
  script:
    - docker pull $CONTAINER_TEST_IMAGE
    - docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
    - docker push $CONTAINER_RELEASE_IMAGE
  only:
    - master

release-prod:
  stage: release-prod
  script:

  when: manual


我卡在发布生产阶段。我不确定如何将应用程序部署到AWS Beanstalk。
由于已经创建并存储了Docker镜像在GitLab注册表中,我希望的是指示AWS Beanstalk从GitLab注册表下载Docker镜像并启动应用程序。
我还有一个定义服务的 "Dockerrun.aws.json" 文件。
2个回答

3

您的 Dockerrun.aws.json 文件是 Beanstalk 部署的最终决策。

我找到的适用于我们的选项是创建一个自定义的 Docker 镜像,其中安装了 eb cli,以便我们可以从 gitlab-ci.yml 文件运行 eb deploy... 命令。

这需要为 Runner 授予 AWS 权限,以便能够访问 AWS 服务,因此用户或权限起到作用。但无论如何设置,它们都会发挥作用。

GitLab 项目 - CI/CD 设置 aws 用户密钥(理想情况下,应该设置使用 IAM 角色,但用户/密钥也可以工作 - 我不太熟悉获取临时访问权限可能是最好的方法,但我也不确定它是如何工作的)

我们使用自定义 EC2 实例作为我们的 Runner 运行管道,因此我不确定共享 Runner 的情况 - 我们担心将 aws 用户凭据传递给共享 Runner 管道...

构建阶段: 构建并将 Docker 镜像推送到我们的 ECR 存储库或您的用例

部署阶段: 在 GitLab 中存储一个自定义镜像,其中预先安装了 eb cli,然后运行 eb deploy env-name

这是我们针对 PHP 项目使用的 Dockerfile。其中一些安装对您的情况来说并不必要...这也可以通过添加 USER 和软件包版本来改进。这将创建一个已安装 eb cli 的 docker 镜像。

FROM node:12

RUN apt-get update && apt-get -y --allow-unauthenticated install apt-transport-https ca-certificates curl gnupg2 software-properties-common ruby-full \
    && add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
RUN apt-get update && apt-get -y --allow-unauthenticated install docker-ce \
    && apt-get -y install build-essential zlib1g-dev libssl-dev libncurses-dev libffi-dev libsqlite3-dev libreadline-dev libbz2-dev python-pip python3-pip
RUN git clone https://github.com/aws/aws-elastic-beanstalk-cli-setup.git \
    && ./aws-elastic-beanstalk-cli-setup/scripts/bundled_installer
RUN python3 --version && apt-get update && apt-get -y install python3-pip \
    && pip3 install awscli boto3 botocore && pip3 install boto3 botocore --upgrade

示例 gitlab-ci.yml 设置

release-prod:
  image: registry.gitlab.com/your-acct/project/custom-image
  stage: release-prod
  script:
    - service docker start
    - echo 'export PATH="/root/.ebcli-virtual-env/executables:$PATH"' >> ~/.bash_profile && source ~/.bash_profile
    - echo 'export PATH=/root/.pyenv/versions/3.7.2/bin:$PATH' >> /root/.bash_profile && source /root/.bash_profile
    - eb deploy your-environment
  when: manual

你还可以将echo命令添加到自定义的GitLab镜像中,这样你只需要运行eb deploy即可。

希望这能有所帮助。


我认为“使用eb cli安装自定义docker镜像以便我们可以运行…”是为了与AWS进行交互。然而,创建一个容器并授予它AWS IAM并不简单。作为替代方案,我们可以创建一个具有适当IAM的EC2实例,这是一个更简单的解决方案,然后在Gitlab CI中,我们通过ssh连接到这个EC2实例,并在AWS上执行所需的操作。 - undefined

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接