cluster aws_rds_cluster amazon-web-services terraform sumologic

amazon-web-services - aws_rds_cluster - terraform rds cluster endpoint



Terraform: configurando la entrega de la suscripciĆ³n del registro de cloudwatch a lambda? (1)

Tenía el recurso aws_cloudwatch_log_subscription_filter definido incorrectamente; no debería proporcionar el argumento role_arn en esta situación.

También debe agregar un recurso aws_lambda_permission (con una relación depends_on definida en el filtro o TF puede hacerlo en el orden incorrecto).

Tenga en cuenta que la interfaz de usuario de la consola lambda de AWS agrega el permiso lambda para usted de manera invisible, así que tenga cuidado de que la aws_cloudwatch_log_subscription_filter funcionará sin el recurso de permiso si ha realizado la misma acción antes en la interfaz de usuario de la consola.

La configuración de TF necesaria tiene este aspecto (los dos últimos recursos son los relevantes para configurar el cloudwatch->lambda real de cloudwatch->lambda ):

// intended for application logs (access logs, modsec, etc.) resource "aws_cloudwatch_log_group" "test-app-loggroup" { name = "test-app" retention_in_days = 90 } resource "aws_security_group" "cloudwatch-sumologic-lambda-sg" { name = "cloudwatch-sumologic-lambda-sg" tags { Name = "cloudwatch-sumologic-lambda-sg" } description = "Security group for lambda to move logs from CWL to SumoLogic" vpc_id = "${aws_vpc.dev-vpc.id}" } resource "aws_security_group_rule" "https-egress-cloudwatch-sumologic-to-internet" { type = "egress" from_port = 443 to_port = 443 protocol = "tcp" security_group_id = "${aws_security_group.cloudwatch-sumologic-lambda-sg.id}" cidr_blocks = ["0.0.0.0/0"] } resource "aws_iam_role" "test-cloudwatch-lambda-role" { name = "test-cloudwatch-lambda-role" assume_role_policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Action": "sts:AssumeRole", "Principal": { "Service": "lambda.amazonaws.com" }, "Effect": "Allow" } ] } EOF } resource "aws_iam_role_policy" "test-cloudwatch-lambda-policy" { name = "test-cloudwatch-lambda-policy" role = "${aws_iam_role.test-cloudwatch-lambda-role.id}" policy = <<EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "CopiedFromTemplateAWSLambdaVPCAccessExecutionRole1", "Effect": "Allow", "Action": [ "ec2:CreateNetworkInterface" ], "Resource": "*" }, { "Sid": "CopiedFromTemplateAWSLambdaVPCAccessExecutionRole2", "Effect": "Allow", "Action": [ "ec2:DescribeNetworkInterfaces", "ec2:DeleteNetworkInterface" ], "Resource": "arn:aws:ec2:ap-southeast-2:${var.dev_vpc_account_id}:network-interface/*" }, { "Sid": "CopiedFromTemplateAWSLambdaBasicExecutionRole1", "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:ap-southeast-2:${var.dev_vpc_account_id}:*" }, { "Sid": "CopiedFromTemplateAWSLambdaBasicExecutionRole2", "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:ap-southeast-2:${var.dev_vpc_account_id}:log-group:/aws/lambda/*" ] }, { "Sid": "CopiedFromTemplateAWSLambdaAMIExecutionRole", "Effect": "Allow", "Action": [ "ec2:DescribeImages" ], "Resource": "*" } ] } EOF } resource "aws_lambda_function" "cloudwatch-sumologic-lambda" { function_name = "cloudwatch-sumologic-lambda" filename = "${var.lambda_dir}/cloudwatchSumologicLambda.zip" source_code_hash = "${base64sha256(file("${var.lambda_dir}/cloudwatchSumologicLambda.zip"))}" handler = "cloudwatchSumologic.handler" role = "${aws_iam_role.test-cloudwatch-lambda-role.arn}" memory_size = "128" runtime = "nodejs4.3" // set low because I''m concerned about cost-blowout in the case of mis-configuration timeout = "15" vpc_config = { subnet_ids = ["${aws_subnet.dev-private-subnet.id}"] security_group_ids = ["${aws_security_group.cloudwatch-sumologic-lambda-sg.id}"] } } resource "aws_lambda_permission" "test-app-allow-cloudwatch" { statement_id = "test-app-allow-cloudwatch" action = "lambda:InvokeFunction" function_name = "${aws_lambda_function.cloudwatch-sumologic-lambda.arn}" principal = "logs.ap-southeast-2.amazonaws.com" source_arn = "${aws_cloudwatch_log_group.test-app-loggroup.arn}" } resource "aws_cloudwatch_log_subscription_filter" "test-app-cloudwatch-sumologic-lambda-subscription" { depends_on = ["aws_lambda_permission.test-app-allow-cloudwatch"] name = "cloudwatch-sumologic-lambda-subscription" log_group_name = "${aws_cloudwatch_log_group.test-app-loggroup.name}" filter_pattern = "" destination_arn = "${aws_lambda_function.cloudwatch-sumologic-lambda.arn}" }

Necesito enviar mis registros de Cloudwatch a un servicio de análisis de registros.

He seguido estos artículos here y here y los he puesto a mano, sin preocupaciones.

Ahora estoy intentando automatizar todo esto con Terraform (roles / políticas, grupos de seguridad, grupo de registro de cloudwatch, lambda y activando el lambda desde el grupo de registro).

Pero no puedo averiguar cómo usar TF para configurar AWS para activar la lambda desde los registros de cloudwatch.

Puedo vincular los dos recursos de TF a mano haciendo lo siguiente (en la interfaz de usuario de la consola web de Lambda):

  • Entra en la sección "Disparadores" de la función lambda
  • haga clic en "Añadir gatillo"
  • seleccione "registros de cloudwatch" de la lista de tipos de activadores
  • Seleccione el grupo de registro que quiero activar la lambda
  • introduzca un nombre de filtro
  • deje el patrón de filtro vacío (lo que implica un activador en todos los flujos de registro)
  • Asegúrate de que "activar disparador" esté seleccionado
  • haga clic en el botón enviar

Una vez hecho esto, la lambda aparece en la consola de registros de cloudwatch en la columna de suscripciones, se muestra como "Lambda (cloudwatch-sumologic-lambda)".

Intenté crear la suscripción con el siguiente recurso TF:

resource "aws_cloudwatch_log_subscription_filter" "cloudwatch-sumologic-lambda-subscription" { name = "cloudwatch-sumologic-lambda-subscription" role_arn = "${aws_iam_role.jordi-waf-cloudwatch-lambda-role.arn}" log_group_name = "${aws_cloudwatch_log_group.jordi-waf-int-app-loggroup.name}" filter_pattern = "logtype test" destination_arn = "${aws_lambda_function.cloudwatch-sumologic-lambda.arn}" }

Pero falla con:

aws_cloudwatch_log_subscription_filter.cloudwatch-sumologic-lambda-membership: InvalidParameterException: destinationArn para el proveedor lambda no se puede usar con roleArn

Encontré esta respuesta sobre la configuración de algo similar para un evento programado, pero eso no parece ser equivalente a lo que hacen las acciones de la consola que describí anteriormente (el método de interfaz de usuario de la consola no crea un evento / regla que pueda ver ).

¿Puede alguien darme un indicador de lo que estoy haciendo mal, por favor?