如何通过 k8s 注释更新 AWS NLB 设置以将日志存储在 S3 存储桶中
How to update AWS NLB setting to store logs in S3 bucket by k8s annotations
我想将 AWS NLB 配置为将日志存储在 S3 存储桶中吗?
我有:
- AWS EKS 集群 (v1.15),
- NLB(由 Nginx 控制器创建),
- 带 AIM 的 S3 存储桶(按照此处所述完成:https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-access-logs.html)。
我已将这些注释添加到我的 terraform 代码中以用于 nginx ingress:
set {
name = "controller.service.annotations.service\.beta\.kubernetes\.io/aws-load-balancer-access-log-enabled"
value = "true"
}
set {
name = "controller.service.annotations.service\.beta\.kubernetes\.io/aws-load-balancer-access-log-s3-bucket-name"
value = "nlb-logs-bucket"
}
set {
name = "controller.service.annotations.service\.beta\.kubernetes\.io/aws-load-balancer-access-log-s3-bucket-prefix"
value = "/nlblogs"
}
我看到注释已添加到控制器,但 AWS 控制台中的 NLB 设置没有更改(日志未保存到存储桶)。
我找到了解决办法。希望对大家有帮助。
据我了解,上述注解仅适用于ELB,不适用于NLB。我尝试将 EKS 更新到 1.16 和 1.17。它适用于 ELB,但不适用于 NLB。
因此,解决方案是 - 在 Terraform 中为 k8s 使用 local-exec 规定。至少对我有用。
代码如下:
resource "null_resource" "enable_s3_bucket_logging_on_nlb" {
triggers = { <TRIGGERS> }
provisioner "local-exec" {
command = <<EOS
for i in $(aws elbv2 describe-load-balancers --region=<REGION> --names=$(echo ${data.kubernetes_service.nginx_ingress.load_balancer_ingress.0.hostname} |cut -d- -f1) | \
jq ".[][] | { LoadBalancerArn: .LoadBalancerArn }" |awk '{print }' |tr -d '"'); do \
aws elbv2 modify-load-balancer-attributes --region=<REGION> --load-balancer-arn $i --attributes Key=access_logs.s3.enabled,Value=true \
Key=access_logs.s3.bucket,Value=nlb-logs-bucket Key=access_logs.s3.prefix,Value=nlblogs;\
done; \
EOS
}
}
其中:
- 触发条件
- 您的 NLB 所在区域
我非常喜欢上面的答案 - 我只是修改了 terraform 代码以减少对任何 cli 处理的依赖:
data "kubernetes_service" "nginx" {
metadata {
name = "${local.k8s_nginx_name}-controller"
namespace = local.k8s_nginx_namespace
}
}
locals {
nlb_hostname = data.kubernetes_service.nginx.status.0.load_balancer.0.ingress.0.hostname
nlb_name = split("-", local.nlb_hostname)[0]
# S3 log bucket needs:
# https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-logging-bucket-permissions
nlb_attributes_json = jsonencode([
{ Key = "deletion_protection.enabled", Value = "true" },
{ Key = "load_balancing.cross_zone.enabled", Value = "true" },
{ Key = "access_logs.s3.enabled", Value = "true" },
{ Key = "access_logs.s3.bucket", Value = var.s3_log_name },
{ Key = "access_logs.s3.prefix", Value = "nlblogs" },
])
}
data "aws_lb" "nginx-nlb" {
name = local.nlb_name
}
resource "null_resource" "enable_s3_bucket_logging_on_nlb" {
triggers = {
nlb_arn = data.aws_lb.nginx-nlb.arn
nlb_attributes_json = local.nlb_attributes_json
}
provisioner "local-exec" {
command = <<EOS
aws elbv2 modify-load-balancer-attributes \
--region=${var.aws_region} \
--load-balancer-arn ${data.aws_lb.nginx-nlb.arn} \
--attributes '${local.nlb_attributes_json}'\
EOS
}
}
我想将 AWS NLB 配置为将日志存储在 S3 存储桶中吗? 我有:
- AWS EKS 集群 (v1.15),
- NLB(由 Nginx 控制器创建),
- 带 AIM 的 S3 存储桶(按照此处所述完成:https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-access-logs.html)。
我已将这些注释添加到我的 terraform 代码中以用于 nginx ingress:
set {
name = "controller.service.annotations.service\.beta\.kubernetes\.io/aws-load-balancer-access-log-enabled"
value = "true"
}
set {
name = "controller.service.annotations.service\.beta\.kubernetes\.io/aws-load-balancer-access-log-s3-bucket-name"
value = "nlb-logs-bucket"
}
set {
name = "controller.service.annotations.service\.beta\.kubernetes\.io/aws-load-balancer-access-log-s3-bucket-prefix"
value = "/nlblogs"
}
我看到注释已添加到控制器,但 AWS 控制台中的 NLB 设置没有更改(日志未保存到存储桶)。
我找到了解决办法。希望对大家有帮助。
据我了解,上述注解仅适用于ELB,不适用于NLB。我尝试将 EKS 更新到 1.16 和 1.17。它适用于 ELB,但不适用于 NLB。
因此,解决方案是 - 在 Terraform 中为 k8s 使用 local-exec 规定。至少对我有用。
代码如下:
resource "null_resource" "enable_s3_bucket_logging_on_nlb" {
triggers = { <TRIGGERS> }
provisioner "local-exec" {
command = <<EOS
for i in $(aws elbv2 describe-load-balancers --region=<REGION> --names=$(echo ${data.kubernetes_service.nginx_ingress.load_balancer_ingress.0.hostname} |cut -d- -f1) | \
jq ".[][] | { LoadBalancerArn: .LoadBalancerArn }" |awk '{print }' |tr -d '"'); do \
aws elbv2 modify-load-balancer-attributes --region=<REGION> --load-balancer-arn $i --attributes Key=access_logs.s3.enabled,Value=true \
Key=access_logs.s3.bucket,Value=nlb-logs-bucket Key=access_logs.s3.prefix,Value=nlblogs;\
done; \
EOS
}
}
其中:
- 触发条件 - 您的 NLB 所在区域
我非常喜欢上面的答案 - 我只是修改了 terraform 代码以减少对任何 cli 处理的依赖:
data "kubernetes_service" "nginx" {
metadata {
name = "${local.k8s_nginx_name}-controller"
namespace = local.k8s_nginx_namespace
}
}
locals {
nlb_hostname = data.kubernetes_service.nginx.status.0.load_balancer.0.ingress.0.hostname
nlb_name = split("-", local.nlb_hostname)[0]
# S3 log bucket needs:
# https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-logging-bucket-permissions
nlb_attributes_json = jsonencode([
{ Key = "deletion_protection.enabled", Value = "true" },
{ Key = "load_balancing.cross_zone.enabled", Value = "true" },
{ Key = "access_logs.s3.enabled", Value = "true" },
{ Key = "access_logs.s3.bucket", Value = var.s3_log_name },
{ Key = "access_logs.s3.prefix", Value = "nlblogs" },
])
}
data "aws_lb" "nginx-nlb" {
name = local.nlb_name
}
resource "null_resource" "enable_s3_bucket_logging_on_nlb" {
triggers = {
nlb_arn = data.aws_lb.nginx-nlb.arn
nlb_attributes_json = local.nlb_attributes_json
}
provisioner "local-exec" {
command = <<EOS
aws elbv2 modify-load-balancer-attributes \
--region=${var.aws_region} \
--load-balancer-arn ${data.aws_lb.nginx-nlb.arn} \
--attributes '${local.nlb_attributes_json}'\
EOS
}
}