在CircleCI中将简单的Node.js应用部署到AWS EC2的设置

44次阅读
没有评论

问题描述

在AWS EC2实例上运行了一个简单的Node.js应用,并希望通过CircleCI实现持续部署。用户遵循了一篇文章,该文章描述了在EC2实例上通过SSH运行部署命令的步骤。用户已经在EC2实例上创建了一个名为deploy.sh的脚本,该脚本的内容是切换到项目目录,然后运行npm ipm2 delete all,最后通过pm2 start server.js启动应用。用户尝试了两种方法来运行deploy.sh脚本,一种是在EC2实例上手动运行,另一种是通过本地机器通过SSH运行,但后者出现了问题。

问题的主要焦点是如何在CircleCI中通过SSH连接到EC2实例,并成功运行deploy.sh脚本,以便实现持续部署。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

使用AWS Systems Manager代替直接SSH连接

一种更可靠的方法是使用AWS Systems Manager(SSM)来代替直接的SSH连接。您可以创建一个SSM文档,其中包含要执行的部署命令。然后,您可以通过AWS CLI命令从CI/CD流水线中调用该SSM文档。

以下是实现该方法的步骤:

  1. 创建一个包含部署命令的SSM文档。您可以使用AWS管理控制台或CLI来完成此操作。
  2. 在您的CI/CD流水线中,使用AWS CLI命令来调用SSM文档,并指定要运行的命令。

以下是一个基本的实现示例:

创建SSM文档

您可以创建一个名为DeployAppDocument的SSM文档,其中包含以下命令:

#!/bin/bash
cd /path/to/your/project
npm install
pm2 delete all
pm2 start server.js

在CI/CD流水线中调用SSM文档

在您的CircleCI配置中,添加一个步骤来调用SSM文档。请确保在步骤中使用正确的AWS访问凭证。

jobs:
  deploy:
    docker:
      - image: circleci/node:14
    steps:
      - checkout
      - run:
          name: Run Deployment
          command: |
            aws ssm create-document --name "DeployAppDocument" --document-type "Command" --content file:///path/to/your/DeployAppDocument.json
            command_id=$(aws ssm send-command --instance-id "your-ec2-instance-id" --document-name "DeployAppDocument" --query "Command.CommandId" --output text)
            aws ssm wait command-executed --instance-id "your-ec2-instance-id" --instance-id $command_id

请注意,上述示例仅为演示目的。您需要根据您的实际情况进行适当的修改。

解决npm和pm2命令未找到的问题

如果在通过SSH连接运行脚本时遇到npm和pm2命令未找到的问题,可能是因为环境变量不正确。您可以尝试在脚本中使用完整路径来引用这些命令,以确保它们能够正确执行。例如:

#!/bin/bash
cd /path/to/your/project
/path/to/npm install
/path/to/pm2 delete all
/path/to/pm2 start server.js

注意事项

  • 使用AWS Systems Manager代替SSH可以更好地管理权限和执行环境,从而提高可靠性。
  • 请确保在CI/CD流水线中正确配置AWS凭证,并限制对实例的访问权限。

总结

通过使用AWS Systems Manager,您可以更可靠地在CircleCI中实现持续部署,而无需直接通过SSH连接到EC2实例。这种方法可以更好地管理权限和执行环境,从而提高部署的可靠性。如果您在SSH连接运行脚本时遇到命令未找到的问题,可以尝试使用完整路径来引用命令。

正文完