本文将介绍如何在 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
。