本文将介绍如何在 AWS ECS Fargate 上部署 Nacos 服务,包括通过 CLI 创建资源、使用 ALB 暴露 8848 端口、使用服务发现暴露其他端口,以及设置健康检查路径。

前提条件

  • 已安装 AWS CLI 并配置了访问凭证
    -拥有一个 VPC 和两个可用的子网
  • (可选) 已创建 RDS 实例用于存储 Nacos 配置

准备数据库初始化文件

https://github.com/alibaba/nacos/blob/master/config/src/main/resources/META-INF/nacos-db.sql

或者:
https://gitee.com/mirrors/Nacos/blob/develop/config/src/main/resources/META-INF/nacos-db.sql

# 建库(我这里用的nacos,官方说明是nacos_config问题也不大,都一样)
create database nacos;
use nacos;

-- 执行或者导入 nacos-db.sql,不知道为什么这个文件里的注释还写了 【数据库全名 = nacos_config】
-- 可以直接复制粘贴到 navicat 或 terminal 上执行,200多行不是很长

# 创建 nacos 单独使用的一个用户,也可以直接把 root 用户给他
create user 'nacos'@'%' IDENTIFIED BY 'G@nacos2023';
-- 库nacos的所有表的执行存储过程、CRUD权限
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, REFERENCES, INDEX, ALTER ON `nacos`.* TO 'nacos'@'%'
-- 刷新权限
FLUSH PRIVILEGES;

-- 查看权限
show grants for nacos;

步骤

1. 创建 ECS 集群

aws ecs create-cluster --cluster-name nacos-cluster

2. 创建任务定义

将以下内容保存为 task-definition.json:

{
  "family": "dev-nacos-task",
  "executionRoleArn": "ecsTaskExecutionRole",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "nacos",
      "image": "nacos/nacos-server:v2.2.0",
      "portMappings": [
        {
          "containerPort": 8848,
          "hostPort": 8848,
          "protocol": "tcp"
        },
        {
          "containerPort": 9848,
          "hostPort": 9848,
          "protocol": "tcp"
        },
        {
          "containerPort": 9849,
          "hostPort": 9849,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {"name": "MODE", "value": "standalone"},
        {"name": "NACOS_AUTH_ENABLE", "value": "true"},
        {"name": "SPRING_DATASOURCE_PLATFORM", "value": "mysql"},
        {"name": "MYSQL_SERVICE_HOST", "value": "test-cluster.cluster-cviu6goyqplm.us-east-1.rds.amazonaws.com"},
        {"name": "MYSQL_SERVICE_PORT", "value": "3306"},
        {"name": "MYSQL_SERVICE_DB_NAME", "value": "nacos"},
        {"name": "MYSQL_SERVICE_USER", "value": "nacos"},
        {"name": "MYSQL_SERVICE_PASSWORD", "value": "G@nacos2023"},
        {"name": "MYSQL_DATABASE_NUM", "value": "1"},
        {"name": "NACOS_AUTH_TOKEN_EXPIRE_SECONDS", "value": "86400"},
        {"name": "NACOS_AUTH_TOKEN", "value": "TmFjb4NTZWNyZXRLZXkxM3U1ZDlqZDAyaTU2bjBzNTY3OHkyMDIwNzFiYW9nMzQ1Njc4OTAxMjNzZnNhYnkyMDE2Nzg5"},
        {"name": "NACOS_AUTH_IDENTITY_KEY", "value": "NacosOpendata"},
        {"name": "NACOS_AUTH_IDENTITY_VALUE", "value": "nacos66"}
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-create-group": "true",
          "awslogs-group": "/ecs/dev-nacos",
          "awslogs-region": "us-east-1",
          "awslogs-stream-prefix": "nacos"
        }
      }
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "2048",
  "memory": "4096"
}

注册任务定义:

aws ecs register-task-definition --cli-input-json file://task-definition.json

3. 创建 ALB 和目标组

# 创建 ALB
alb_arn=$(aws elbv2 create-load-balancer --name nacos-alb --type application --scheme internet-facing --ip-address-type ipv4 --query 'LoadBalancers[0].LoadBalancerArn' --output text)

# 创建目标组
target_group_arn=$(aws elbv2 create-target-group --name nacos-tg --protocol HTTP --port 8848 --vpc-id <YOUR_VPC_ID> --target-type ip --query 'TargetGroups[0].TargetGroupArn' --output text)

# 创建监听器
aws elbv2 create-listener --load-balancer-arn $alb_arn --protocol HTTP --port 80 --default-actions Type=forward,TargetGroupArn=$target_group_arn

4. 创建 ECS 服务

将以下内容保存为 service-definition.json:

{
  "cluster": "nacos-cluster",
  "serviceName": "nacos-service",
  "taskDefinition": "<TASK_DEFINITION_ARN>",
  "desiredCount": 1,
  "launchType": "FARGATE",
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "subnets": [
        "<SUBNET_ID_1>",
        "<SUBNET_ID_2>"
      ],
      "securityGroups": [
        "<SECURITY_GROUP_ID>"
      ],
      "assignPublicIp": "DISABLED"
    }
  },
  "loadBalancers": [
    {
      "targetGroupArn": "<TARGET_GROUP_ARN>",
      "containerName": "nacos",
      "containerPort": 8848
    }
  ],
  "serviceRegistries": [
    {
      "registryArn": "<SERVICE_DISCOVERY_ARN>"
    }
  ],
  "healthCheckGracePeriodSeconds": 60
}

替换以下占位符:

  • <TASK_DEFINITION_ARN>: 上一步中注册的任务定义 ARN
  • <SUBNET_ID_1> 和 <SUBNET_ID_2>: 你的 VPC 中的两个子网 ID
  • <SECURITY_GROUP_ID>: 允许入站流量的安全组 ID
  • <TARGET_GROUP_ARN>: 上一步中创建的目标组 ARN
  • <SERVICE_DISCOVERY_ARN>: 你的服务发现服务 ARN (可选)

创建 ECS 服务:

aws ecs create-service --cli-input-json file://service-definition.json

5. 配置健康检查

在 AWS 控制台或使用 AWS CLI 更新目标组,设置健康检查路径为 /nacos/v1/console/health/liveness

aws elbv2 modify-target-group --target-group-arn $target_group_arn --health-check-path "/nacos/v1/console/health/liveness"

结论

完成上述步骤后,你应该可以通过 ALB 的 DNS 名称访问 Nacos 的 8848 端口,而其他端口则可以通过服务发现进行访问。健康检查路径也已经设置为 /nacos/v1/console/health/liveness