如何通过Terraform设置API Gateway关联的CloudWatch日志保留期
解决API Gateway日志组保留期配置问题
我来帮你搞定这个问题!你遇到的核心问题是:API Gateway默认会自动生成执行日志组,但这个自动创建的资源不在Terraform的管理范围内,所以没法直接通过现有部署资源设置日志保留期。下面是具体的解决方案:
核心思路
API Gateway的执行日志组有固定的命名规则:API-Gateway-Execution-Logs_{rest-api-id}/{stage-name}。我们只需要预先在Terraform中创建完全匹配这个命名规则的日志组,API Gateway就会直接复用这个日志组,而不是自动生成新的。这样就能通过Terraform配置日志保留期了。
修改后的完整代码
# 1. 创建符合API Gateway执行日志命名规则的日志组,设置保留期 resource "aws_cloudwatch_log_group" "api_gateway_execution_logs" { name = "API-Gateway-Execution-Logs_${aws_api_gateway_rest_api.name.id}/${aws_api_gateway_stage.name.stage_name}" retention_in_days = 30 # 可根据需求修改,比如7、90,0表示永久保留 } # 2. 现有API Gateway CloudWatch角色配置(无需修改) resource "aws_iam_role" "cloudwatch" { name = "#{name}_APIGatewayCloudWatchLogs" assume_role_policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "apigateway.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } EOF } resource "aws_iam_policy_attachment" "api_gateway_logs" { name = "#{name}_api_gateway_logs_policy_attach" roles = ["${aws_iam_role.cloudwatch.id}"] policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonAPIGatewayPushToCloudWatchLogs" } # 3. 配置API Gateway账户关联CloudWatch角色(无需修改) resource "aws_api_gateway_account" "name" { cloudwatch_role_arn = "${aws_iam_role.cloudwatch.arn}" } # 4. 开启API Gateway方法级日志(无需修改) resource "aws_api_gateway_method_settings" "name" { rest_api_id = "${aws_api_gateway_rest_api.name.id}" stage_name = "${aws_api_gateway_stage.name.stage_name}" method_path = "${aws_api_gateway_resource.name.path_part}/${aws_api_gateway_method.name.http_method}" settings { metrics_enabled = true logging_level = "INFO" data_trace_enabled = true } }
关键说明
- 日志组命名匹配:必须严格使用
API-Gateway-Execution-Logs_${rest-api-id}/${stage-name}格式,替换其中的${aws_api_gateway_rest_api.name.id}和${aws_api_gateway_stage.name.stage_name}为你实际的REST API和Stage资源引用,这样API Gateway才会识别并使用这个预先创建的日志组。 - 权限验证:你现有的
AmazonAPIGatewayPushToCloudWatchLogs策略已经包含了API Gateway写入CloudWatch日志组的所有必要权限,不需要额外调整。 - 可选:配置访问日志:如果你需要更详细的请求日志(比如请求IP、状态码等),可以在你的Stage资源中添加
access_log_settings块,自定义日志组和格式:
resource "aws_api_gateway_stage" "name" { # 你的现有Stage配置... access_log_settings { destination_arn = aws_cloudwatch_log_group.api_gateway_access_logs.arn # 自定义日志格式,这里用JSON示例 format = jsonencode({ requestId = "$context.requestId", sourceIp = "$context.identity.sourceIp", httpMethod = "$context.httpMethod", resourcePath = "$context.resourcePath", statusCode = "$context.status", responseLength = "$context.responseLength" }) } } # 自定义访问日志组 resource "aws_cloudwatch_log_group" "api_gateway_access_logs" { name = "/aws/api-gateway/${aws_api_gateway_rest_api.name.name}-access-logs" retention_in_days = 30 }
这样配置后,API Gateway的执行日志就会写入你预先创建的日志组,并且保留期由Terraform管理,完美解决你的问题!
内容的提问来源于stack exchange,提问作者LHK
相关产品推荐
相关产品推荐

