我已经使用 ECS 集群和服务设置了 GTM 服务器端,如下所述:https://aws-solutions-library-samples.github.io/advertising-marketing/using-google-tag-manager-for-server-side -website-analytics-on-aws.html
我使用 Snowbridge(由 Snowplow 提供)通过 HTTP post 请求将数据从 AWS kinesis 发送到 GTM(安装了 Snowplow 客户端)。
当数据量较大时,我偶尔会收到 GTM 的 502 错误。如果我过滤掉数据并减少转发到 GTM 的数据量,我就不会再收到错误。我可以在 GTM 端进行哪些更改以确保可以处理大量数据?
这就是我的 GTM 配置的大致样子:
resource "aws_ecs_cluster" "gtm" {
name = "gtm"
setting {
name = "containerInsights"
value = "enabled"
}
}
resource "aws_ecs_task_definition" "PrimaryServerSideContainer" {
family = "PrimaryServerSideContainer"
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
cpu = 2048
memory = 4096
execution_role_arn = aws_iam_role.gtm_container_exec_role.arn
task_role_arn = aws_iam_role.gtm_container_role.arn
runtime_platform {
operating_system_family = "LINUX"
cpu_architecture = "X86_64"
}
container_definitions = <<TASK_DEFINITION
[
{
"name": "primary",
"image": "gcr.io/cloud-tagging-10302018/gtm-cloud-image",
"environment": [
{
"name": "PORT",
"value": "80"
},
{
"name": "PREVIEW_SERVER_URL",
"value": "${var.PREVIEW_SERVER_URL}"
},
{
"name": "CONTAINER_CONFIG",
"value": "${var.CONTAINER_CONFIG}"
}
],
"cpu": 2048,
"memory": 4096,
"essential": true,
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "gtm-primary",
"awslogs-create-group": "true",
"awslogs-region": "eu-central-1",
"awslogs-stream-prefix": "ecs"
}
},
"portMappings" : [
{
"containerPort" : 80,
"hostPort" : 80
}
]
}
]
TASK_DEFINITION
}
resource "aws_ecs_task_definition" "PreviewContainer" {
family = "PreviewContainer"
network_mode = "awsvpc"
requires_compatibilities = ["FARGATE"]
cpu = 2048
memory = 4096
execution_role_arn = aws_iam_role.gtm_container_exec_role.arn
task_role_arn = aws_iam_role.gtm_container_role.arn
runtime_platform {
operating_system_family = "LINUX"
cpu_architecture = "X86_64"
}
container_definitions = <<TASK_DEFINITION
[
{
"name": "preview",
"image": "gcr.io/cloud-tagging-10302018/gtm-cloud-image",
"environment": [
{
"name": "PORT",
"value": "80"
},
{
"name": "RUN_AS_PREVIEW_SERVER",
"value": "true"
},
{
"name": "CONTAINER_CONFIG",
"value": "${var.CONTAINER_CONFIG}"
}
],
"cpu": 1024,
"memory": 2048,
"essential": true,
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "gtm-preview",
"awslogs-region": "eu-central-1",
"awslogs-create-group": "true",
"awslogs-stream-prefix": "ecs"
}
},
"portMappings" : [
{
"containerPort" : 80,
"hostPort" : 80
}
]
}
]
TASK_DEFINITION
}
resource "aws_ecs_service" "PrimaryServerSideService" {
name = var.primary_service_name
cluster = aws_ecs_cluster.gtm.id
task_definition = aws_ecs_task_definition.PrimaryServerSideContainer.id
desired_count = var.primary_service_desired_count
launch_type = "FARGATE"
platform_version = "LATEST"
scheduling_strategy = "REPLICA"
deployment_maximum_percent = 200
deployment_minimum_healthy_percent = 50
network_configuration {
assign_public_ip = true
security_groups = [aws_security_group.gtm-security-group.id]
subnets = module.vpc.private_subnet_ids
}
load_balancer {
target_group_arn = aws_lb_target_group.PrimaryServerSideTarget.arn
container_name = "primary"
container_port = 80
}
lifecycle {
ignore_changes = [task_definition]
}
}
resource "aws_ecs_service" "PreviewService" {
name = var.preview_service_name
cluster = aws_ecs_cluster.gtm.id
task_definition = aws_ecs_task_definition.PreviewContainer.id
desired_count = var.preview_service_desired_count
launch_type = "FARGATE"
platform_version = "LATEST"
scheduling_strategy = "REPLICA"
network_configuration {
assign_public_ip = true
security_groups = [aws_security_group.gtm-security-group.id]
subnets = module.vpc.private_subnet_ids
}
load_balancer {
target_group_arn = aws_lb_target_group.PreviewTarget.arn
container_name = "preview"
container_port = 80
}
lifecycle {
ignore_changes = [task_definition]
}
}
resource "aws_lb" "PrimaryServerSideLoadBalancer" {
name = "PrimaryServerSideLoadBalancer"
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.gtm-security-group.id]
subnets = module.vpc.public_subnet_ids
enable_deletion_protection = false
}
resource "aws_security_group" "gtm-security-group" {
name = "gtm-security-group"
description = "Security Group that allows all traffic for GTM"
vpc_id = module.vpc.vpc_id
// Allow all inbound traffic for IPv4
ingress {
from_port = 0
to_port = 65535
protocol = "tcp" # All TCP traffic
cidr_blocks = ["0.0.0.0/0"] # Allow all sources (IPv4)
}
// Allow all outbound traffic for IPv4
egress {
from_port = 0
to_port = 65535
protocol = "tcp" # All TCP traffic
cidr_blocks = ["0.0.0.0/0"] # Allow all destinations (IPv4)
}
}
resource "aws_lb_target_group" "PrimaryServerSideTarget" {
name = "PrimaryServerSideTarget"
port = 80
protocol = "HTTP"
vpc_id = module.vpc.vpc_id
target_type = "ip"
health_check {
path = "/healthz"
}
}
resource "aws_lb_listener" "primarylistener" {
load_balancer_arn = aws_lb.PrimaryServerSideLoadBalancer.arn
port = "443"
protocol = "HTTPS"
ssl_policy = "ELBSecurityPolicy-2016-08"
certificate_arn = aws_acm_certificate.cert.arn
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.PrimaryServerSideTarget.arn
}
}
// Public subnets
resource "aws_lb" "PreviewLoadBalancer" {
name = "PreviewLoadBalancer"
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.gtm-security-group.id]
subnets = module.vpc.public_subnet_ids
enable_deletion_protection = false
}
resource "aws_lb_listener" "previewlistener" {
load_balancer_arn = aws_lb.PreviewLoadBalancer.arn
port = "443"
protocol = "HTTPS"
ssl_policy = "ELBSecurityPolicy-2016-08"
certificate_arn = aws_acm_certificate.cert.arn
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.PreviewTarget.arn
}
}
resource "aws_lb_target_group" "PreviewTarget" {
name = "PreviewTarget"
port = 80
protocol = "HTTP"
vpc_id = module.vpc.vpc_id
target_type = "ip"
health_check {
path = "/healthz"
}
}
我尝试像这样实现自动缩放,并将阈值保持在相当低的水平,但尽管如此,我偶尔会遇到 502 错误。
resource "aws_appautoscaling_target" "ecs_service_target" {
max_capacity = 15
min_capacity = 1
resource_id = "service/${aws_ecs_cluster.gtm.name}/${aws_ecs_service.PrimaryServerSideService.name}"
scalable_dimension = "ecs:service:DesiredCount"
service_namespace = "ecs"
}
resource "aws_appautoscaling_policy" "ecs_policy" {
name = "scale-cpu"
policy_type = "TargetTrackingScaling"
resource_id = aws_appautoscaling_target.ecs_service_target.resource_id
scalable_dimension = aws_appautoscaling_target.ecs_service_target.scalable_dimension
service_namespace = aws_appautoscaling_target.ecs_service_target.service_namespace
target_tracking_scaling_policy_configuration {
predefined_metric_specification {
predefined_metric_type = "ECSServiceAverageCPUUtilization"
}
target_value = 40
scale_in_cooldown = 1
scale_out_cooldown = 300
}
depends_on = [aws_appautoscaling_target.ecs_service_target]
}
难道不是GTM的问题,而是GTM上安装的Snowplow客户端的问题?
对于提出问题与提供答案表示歉意。我实际上正在尝试通过同一个文档设置相同的东西。你是如何完成步骤 #6 的?