2016-07-16 14 views
12

Potrzebuję wysłać moje dzienniki Cloudwatch do usługi analizy logów.Terraform: konfigurowanie dostarczania subskrypcji protokołu chmurowego do lambda?

Mam śledzony wraz z tymi artykułami here i here i dostałem go działa ręcznie, nie martw się.

Teraz staram się zautomatyzować to wszystko za pomocą Terraform (role/polityki, grupy bezpieczeństwa, grupa logów w chmurze, lambda i wyzwalanie lambda z grupy logów).

Ale nie mogę się dowiedzieć, jak użyć TF do skonfigurowania AWS, aby uruchomić lambdę z logów w chmurze.

mogę połączyć dwa zasoby TF wspólnie przez strony w następujący sposób (w konsoli Web UI lambda):

  • przejść do sekcji funkcja lambda „wyzwalaczy”
  • kliknij „Dodaj progowa”
  • wybrać „Raporty cloudwatch” z listy typów wyzwalania
  • wybrać grupę dziennika Chcę wywołać lambda
  • Wpisz nazwę filtra
  • opuścić wzór filtru pusty (sugerując wyzwalania na wszystkich strumieni dziennika)
  • upewnić „umożliwić spust” wybiera
  • kliknij przycisk Prześlij

Po dokonaniu rejestracji, lambda pokazuje się na dziennikach cloudwatch konsoli w kolumnie subskrypcji - wyświetla jako "Lambda (cloudwatch-sumologic-lambda)".

Próbowałem stworzyć subskrypcję z następującym TF zasobu:

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}" 
} 

Ale nie jest on z:

* aws_cloudwatch_log_subscription_filter.cloudwatch-sumologic-lambda-subscription: InvalidParameterException: destinationArn for vendor lambda cannot be used with roleArn 

znalazłem this answer temat konfigurowania coś podobnego do zaplanowanego zdarzenia, ale to nie wydaje się być równoważne z działaniami konsoli, które opisałem powyżej (metoda konsoli UI nie tworzy zdarzenia/reguły, które widzę).

Czy ktoś może mi wskazać, co robię źle?

+0

Trudno, aby zobaczyć dokładnie, ale wygląda na to, AWS mówi, że rola, którą nadałeś PutSubscriptionFilter, nie ma dostępu do Lambdy. Czy możesz również opublikować definicję zasobu 'aws_iam_role.jordi-waf-cloudwatch-lambda-role.arn'? – ydaetskcoR

Odpowiedz

18

Zasób "aws_cloudwatch_log_subscription_filter" został zdefiniowany niepoprawnie - nie powinieneś podawać argumentu "role_arn" w tej sytuacji.

Musisz również dodać zasób aws_lambda_permission (z relacją "depend_on" zdefiniowaną w filtrze lub TF może zrobić to w niewłaściwej kolejności).

Należy zauważyć, że interfejs użytkownika konsoli lambda AWS dodaje do użytkownika uprawnienia lambda w sposób niewidoczny, więc należy pamiętać, że "aws_cloudwatch_log_subscription_filter" będzie działał bez zasobu uprawnień, jeśli wcześniej wykonano tę samą akcję w interfejsie użytkownika konsoli.

Niezbędna TF config wygląda następująco (dwa ostatnie środki są odpowiednie z nich konfigurowania rzeczywistą cloudwatch-> spust 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}" 
} 
+0

Dzięki za to! –

Powiązane problemy