You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:40:25