在本篇文章中,我们将演示如何使用 AWS CLI 在 ECS Fargate 上部署 SkyWalking UI,并通过 Application Load Balancer (ALB) 提供公网访问入口,同时确保容器无法直接从公网访问。以下是详细步骤:

1. 创建 ALB
aws elbv2 create-load-balancer\
  --name skywalking-ui-alb \
  --scheme internet-facing \
  --type application \
  --subnets <your-subnet-id-1> <your-subnet-id-2>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

记录返回的 ALB ARN,例如:arn:aws:elasticloadbalancing:us-east-1:123456789012:loadbalancer/app/skywalking-ui-alb/abcdef0123456789

2. 创建 ALB 目标组
aws elbv2 create-target-group\
  --name skywalking-ui-alb-tg \
  --protocol HTTP \
  --port 8080 \
  --vpc-id <your-vpc-id> \
  --target-type ip
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

记录返回的目标组 ARN,例如:arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/skywalking-ui-alb-tg/abcdef0123456789

3. 创建 ALB 监听器
aws elbv2 create-listener\
  --load-balancer-arn <your-alb-arn> \
  --protocol HTTP \
  --port 80 \
  --default-actions Type=forward,TargetGroupArn=<your-alb-tg-arn>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
4. 创建任务定义 JSON 文件 (skywalking-ui-task.json)
{
  "family": "skywalking-ui-task",
  "executionRoleArn": "ecsTaskExecutionRole",
  "networkMode": "awsvpc",
  "containerDefinitions": [
    {
      "name": "skywalking-ui",
      "image": "apache/skywalking-ui:9.1.0",
      "portMappings": [
        {
          "containerPort": 8080,
          "hostPort": 8080,
          "protocol": "tcp"
        }
      ],
      "environment": [
        {
          "name": "SW_OAP_ADDRESS",
          "value": "http://dev-skywalking-oap-server.skywalking-oap.local:12800"
        }
      ],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-create-group": "true",
          "awslogs-group": "/ecs/skywalking-ui",
          "awslogs-region": "us-east-1",
          "awslogs-stream-prefix": "ecs"
        }
      }
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "cpu": "512",
  "memory": "1024"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
5. 注册任务定义
aws ecs register-task-definition --cli-input-json file://skywalking-ui-task.json
  • 1.

记录返回的任务定义 ARN,例如:arn:aws:ecs:us-east-1:123456789012:task-definition/skywalking-ui-task:1

6. 创建 ECS 服务

创建一个名为 skywalking-ui-service.json 的文件,内容如下:

{
  "cluster": "<your-ecs-cluster-name>",
  "serviceName": "skywalking-ui-service",
  "taskDefinition": "<your-task-definition-arn>",
  "desiredCount": 1,
  "deploymentConfiguration": {
    "maximumPercent": 200,
    "minimumHealthyPercent": 100
  },
  "launchType": "FARGATE",
  "schedulingStrategy": "REPLICA",
  "networkConfiguration": {
    "awsvpcConfiguration": {
      "subnets": [
        "<your-subnet-id-1>",
        "<your-subnet-id-2>"
      ],
      "securityGroups": [
        "<your-security-group-id>"
      ],
      "assignPublicIp": "DISABLED"
    }
  },
  "loadBalancers": [
    {
      "targetGroupArn": "<your-alb-tg-arn>",
      "containerName": "skywalking-ui",
      "containerPort": 8080
    }
  ]
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
7. 创建服务
aws ecs create-service --cli-input-json file://skywalking-ui-service.json
  • 1.
8. 验证服务状态
aws ecs describe-services--cluster <your-ecs-cluster-name> --services skywalking-ui-service
  • 1.

确保服务状态为 RUNNING

9. 获取 ALB DNS 名称或 IP 地址
aws elbv2 describe-load-balancers--names skywalking-ui-alb
  • 1.

在输出中找到 DNSNameIPAddress

10. 访问 SkyWalking UI

通过 http://<your-alb-dns> 访问 SkyWalking UI。

通过以上步骤,您已经成功部署了 SkyWalking UI,并通过 ALB 提供了公网访问入口。同时,由于容器没有分配公网 IP 地址,因此无法直接从公网访问容器。所有流量都需要通过 ALB 进行路由。

在生产环境中,您可能需要采取额外的安全措施,例如为 ALB 配置 SSL/TLS 终止、启用健康检查等。同时,也建议定期检查和更新 SkyWalking 版本,以获取最新的功能和安全更新。