通过Terraform修改非Terraform创建的已有ELB并启用访问日志
使用Terraform导入现有ELB并启用访问日志
核心需求
将非Terraform创建的现有Application Load Balancer纳入Terraform管理,仅为其启用访问日志,不创建新ELB。
原代码问题
直接定义resource "aws_lb"并指定ARN会触发Terraform尝试创建新ELB,而非关联现有资源。必须先通过terraform import将现有ELB导入Terraform状态,再编写匹配的资源配置。
正确操作步骤
1. 配置日志存储用S3桶
保留原代码中S3桶的配置,替换占位符为实际值:
data "aws_elb_service_account" "main" {} resource "aws_s3_bucket" "elb_logs" { bucket = "<你的存储桶名称>" acl = "private" policy = <<POLICY { "Id": "Policy", "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:PutObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::<你的存储桶名称>/AWSLogs/*", "Principal": { "AWS": [ "${data.aws_elb_service_account.main.arn}" ] } } ] } POLICY }
2. 导入现有ELB到Terraform状态
执行以下命令,将现有ELB关联到aws_lb.foobar资源:
terraform import aws_lb.foobar arn:aws:elasticloadbalancing:ap-northeast-1:<你的账号ID>:loadbalancer/app/<你的ELB名称>/7c6a359c72a9a02e
3. 编写ELB资源配置
导入后,编写aws_lb资源块,仅指定与现有ELB完全匹配的必要参数和access_logs配置:
resource "aws_lb" "foobar" { arn = "arn:aws:elasticloadbalancing:ap-northeast-1:<你的账号ID>:loadbalancer/app/<你的ELB名称>/7c6a359c72a9a02e" name = "<你的ELB名称>" internal = false load_balancer_type = "application" subnets = [ "<子网ID1>", "<子网ID2>", ] access_logs { bucket = aws_s3_bucket.elb_logs.bucket enabled = true # 必须显式启用日志功能,原代码缺失此参数 } }
关键注意事项
subnets必须使用子网ID而非名称,Terraform的aws_lb资源要求传入IDaccess_logs块需添加enabled = true才能真正开启日志- 执行
terraform plan验证配置,确认仅会添加访问日志规则,不会修改ELB的其他原有属性
内容的提问来源于stack exchange,提问作者Chiyoung Choi
相关产品推荐
相关产品推荐

