设置带有弹性beanstalk和CI/CD的节点应用程序
#aws #javascript #node #cicd

介绍

假设我们有一个节点Express应用程序,需要将其发布到云中。搜索后,涵盖该主题的相关文章和资源不多,因此我希望这有助于满足确切需求。 AWS CloudFormation是一个很好的解决方案,但它具有很大的进入障碍。取而代之的是,我们将使用AWS弹性Beanstalk进行很多繁重的工作。它将为我的应用程序启用所有必需的AWS资源;此外,我们将自动化此过程,以便使用新更改更新代码时。该代码将自动部署到具有最新更改的Elastic Beanstalk。

本文不是什么

有很多方法可以编写节点Express应用程序。该博客不会试图说服如何设计或在哪里托管存储库。

要求

节点应用程序

我们需要一个节点Express应用程序。它是仅用于固定真实节点应用程序的目的的API。

AWS CLI设置和访问

aws提供了一个免费的级别。在线查看教程,了解如何创建免费的层帐户并使用AWS CLI设置终端。

概念

弹性豆茎

这项由AWS提供的服务为采购应用程序工作所需的所有基础架构所做的许多繁重工作。它将连接所有所需的依赖项。

弹性豆茎环境

环境是部署应用程序的空间。所有必要的AWS资源都与环境相关联,以促进平台的需求。本教程只会使用一个环境;但是,我们可以拥有满足软件生命周期均值所需的许多环境。

应用版本

该版本与标签标识的源捆绑包关联。它代表将部署到弹性豆stall环境的应用程序工件。

源捆绑包

代码的伪像及其存储位置的引用。在这种情况下,我们将使用S3作为源捆绑包的存储库。

简单存储服务(S3)

此服务是一种对象存储,允许保存任何类型的数据以供以后访问。例如,它可以存储zip文件。源包将存储在这里。

如何 - 手动步骤

首先,我们需要手动执行步骤。这将确保所有依赖性,权限和事件顺序是正确的。在Gitlab中自动化此管道时,这将减轻任何麻烦。

采购应用程序上传到Elastic Beanstalk

您可以在https://gitlab.com/ayogsynergy/eb_node_sandbox/-/tree/step1_helloworld

中使用此示例

将源包上传到S3

  • 将源代码从VCS捆绑到zip文件中。
    • git archive -v -o eb-node-sandbox.zip --format=zip HEAD
  • 创建一个S3存储桶。
    • 此示例将使用manual-eb
  • 将捆绑包上传到S3存储桶中。
    • aws s3 cp eb-node-sandbox.zip s3://manual-eb

创建应用程序版本

Elastic Beanstalk期望指定应用程序版本以实例化环境。

用法

aws elasticbeanstalk create-application-version \
--application-name ${APP_NAME} \
--version-label ${VERSION_LABEL} \
--description="new version ${VERSION_LABEL}" \
--source-bundle S3Bucket=${S3Bucket},S3Key=${S3Key} \
--auto-create-application \
--region ${AWS_REGION}

示例

aws elasticbeanstalk create-application-version \
--application-name eb-node-sandbox \
--version-label v0.0.01 \
--description="new version v0.0.01" \
--source-bundle S3Bucket=manual-eb,S3Key=eb-node-sandbox.zip \
--auto-create-application \
--region us-east-1

描述应用程序版本

  • 确认应用程序版本是创建的。
    • aws elasticbeanstalk describe-application-versions --application-name eb-node-sandbox

创建Elastic Beanstalk环境

接下来,实例化将接受应用程序版本的环境。

创建配置模板

aws elasticbeanstalk create-configuration-template \
--application-name eb-node-sandbox \
--template-name v1-template \
--solution-stack-name "64bit Amazon Linux 2 v5.6.4 running Node.js 16"

描述配置模板

aws elasticbeanstalk describe-configuration-settings --application-name eb-node-sandbox --template-name v1-template

创建弹性豆茎环境

  • 创建一个用于使用环境的选项文件

    [
        {
            "Namespace": "aws:autoscaling:launchconfiguration",
            "OptionName": "IamInstanceProfile",
            "Value": "aws-elasticbeanstalk-ec2-role"
        }
    ]
    
  • 为应用程序创建弹性豆stall环境

    aws elasticbeanstalk create-environment \
    --application-name eb-node-sandbox \
    --template-name v1-template \
    --version-label v0.0.01 \
    --environment-name eb-node-sandbox-env \
    --option-settings file://options.txt
    

描述环境

  • 确认创建环境
    • aws elasticbeanstalk describe-environments --environment-names eb-node-sandbox-env

此时,可以通过Internet访问一个运行的弹性Beanstalk环境。

启动实例并将请求发送到GET /,以验证适当的Hello World响应已返回。

Hello World Application

更新环境

现在,让我们模拟源代码中的新更改。我们将需要发布新的更改。我们将使用新版本更新Elastic Beanstalk环境。

  • 上传新的源捆绑包,带有新的密钥名称到S3桶
  • 创建一个新的应用程序版本
    • 将其关联到新的捆绑包
    • eb-node-sandbox-1.0.0-02
  • 使用新应用程序版本更新现有弹性beanstalk环境

    aws elasticbeanstalk update-environment \
    --application-name eb-node-sandbox \
    --environment-name eb-node-sandbox-env \
    --version-label eb-node-sandbox-1.0.0-02 \
    --region us-east-1
    

运行此命令以更新环境。这将需要一些时间。等到环境部署完成。


如果可能的话,尝试一次坐着。否则,终止环境,因为AWS将使您在环境中利用的基础架构保持仪表运行(例如EC2)。这将有助于避免意外费用。


故障排除(日志分析)

如果应用程序未成功响应,请查看日志。这是下面的一些示例日志输出。

----------------------------------------
/var/log/web.stdout.log
----------------------------------------
Jan 15 14:50:25 ip-172-31-7-140 web: > Elastic-Beanstalk-Sample-App@0.0.1 start
Jan 15 14:50:25 ip-172-31-7-140 web: > node app.js
Jan 15 14:50:25 ip-172-31-7-140 web: Server running at http://127.0.0.1:8080/
Jan 15 15:06:21 ip-172-31-7-140 web: > eb_node_sandbox@1.0.0 start
Jan 15 15:06:21 ip-172-31-7-140 web: > node server.js
Jan 15 15:06:21 ip-172-31-7-140 web: Running on Port: 8080
Jan 15 15:18:20 ip-172-31-7-140 web: > eb_node_sandbox@1.0.0 start
Jan 15 15:18:20 ip-172-31-7-140 web: > node server.js
Jan 15 15:18:21 ip-172-31-7-140 web: Running on Port: 8080

按照惯例,它将默认为npm run start启动您的应用程序。确保您的package.json已定义此脚本。如果检测到package.json文件,它也将在运行应用程序之前运行npm install

CI/CD

现在,自动化此发布过程以触发每次更新存储库代码时。此示例将利用gitlab。

  • 创建一个.gitlb-ci.yml文件,以指示如何/包含在CI/CD管道中
stages:
  - build
  - run

variables:
  APP_NAME: ${CI_PROJECT_NAME}
  ENV_NAME: ${ENV_NAME}
  APP_VERSION: "1.0.0"
  S3BUCKET: "manual-eb"
  AWS_ID: ${AWS_ID}
  AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
  AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
  AWS_REGION: us-east-1

create_app_version:
  stage: build
  image: python:latest
  allow_failure: false
  script: |
    pip install awscli
    echo "Creating zip file"
    VERSION_LABEL=${APP_NAME}-${APP_VERSION}-${CI_PIPELINE_ID}
    S3Key="${VERSION_LABEL}.zip"
    echo "Zipping: ${S3Key}"
    git archive -v -o ${S3Key} --format=zip HEAD

    echo "Creating bundle..."
    echo "Uploading bundle: ${S3Key} ..."
    aws s3 cp ${S3Key} s3://${S3BUCKET}/${S3Key} --region ${AWS_REGION}

    echo "Creating app version"
    aws elasticbeanstalk create-application-version \
      --application-name ${APP_NAME} \
      --version-label ${VERSION_LABEL} \
      --description="new version ${VERSION_LABEL}" \
      --source-bundle S3Bucket=${S3BUCKET},S3Key=${S3Key} \
      --auto-create-application \
      --region ${AWS_REGION}
  only:
    refs:
      - main
deploy_version_to_env:
  stage: run
  image: coxauto/aws-ebcli
  when: manual
  script: |
    VERSION_LABEL=${APP_NAME}-${APP_VERSION}-${CI_PIPELINE_ID}

    echo "Deploying version: ${VERSION_LABEL} to env: ${ENV_NAME}"
    aws elasticbeanstalk update-environment \
      --application-name ${APP_NAME} \
      --environment-name ${ENV_NAME} \
      --version-label ${VERSION_LABEL} \
      --region=${AWS_REGION}
  only:
    refs:
      - main

管道分为两个阶段:

  • 舞台
    • create_app_version
      • 将源代码捆绑在头部并发布到S3桶
      • 创建一个新的应用程序版本,并将其与上传的捆绑包相关联
  • 部署
    • Deploy_version_to_env(手动)
      • 将新的应用程序版本上传到(已经建立和运行的)Elastic Beanstalk环境

main分支更新时,此管道将触发。

设置CI/CD管道ENV变量

  • 设置 - CI/CD
  • 变量扩展
  • 添加以下键
    • app_name:eb-node-sandbox
    • yea_id:xxxxx
    • aws_access_key_id:xxxx
    • aws_secret_access_key:xxxxxxx

Elastic Beanstalk Environment Variables

结论

如果您遵循本教程,请确保终止您的环境。这将有助于您避免AWS会为您收费的意外运行费用。请参阅“动作”下拉菜单到Terminate environment

Terminate Environment

通过自动化来避免手动流程可以节省大量时间和意外的错误。还可以添加一个测试阶段,该阶段不允许失败以防止向您的环境发布不良软件。