2016-07-16 15 views
12

Tôi cần gửi nhật ký trên máy tính để bàn của mình tới dịch vụ phân tích nhật ký.Terraform: định cấu hình phân phối đăng ký trên cloudwatch cho lambda?

Tôi đã theo dõi cùng với các bài viết này herehere và làm cho nó hoạt động bằng tay, không phải lo lắng.

Bây giờ tôi đang cố gắng tự động hóa tất cả điều này với Terraform (vai trò/chính sách, nhóm bảo mật, nhóm nhật ký cloudwatch, lambda và kích hoạt lambda từ nhóm nhật ký).

Nhưng tôi không thể tìm ra cách sử dụng TF để định cấu hình AWS để kích hoạt lambda từ nhật ký trên máy tính bảng.

tôi có thể liên kết hai nguồn TF với nhau bằng tay bằng cách làm như sau (trong Lambda web console UI):

  • đi vào "Triggers" phần chức năng lambda của
  • nhấp vào "Thêm Trigger"
  • chọn "nhật ký cloudwatch" từ danh sách các loại cò
  • chọn nhóm log tôi muốn kích hoạt các lambda
  • nhập tên bộ lọc
  • rời mô hình lọc rỗng (ám chỉ kích hoạt trên tất cả các dòng log)
  • đảm bảo "cho phép kích hoạt" được chọn
  • nhấp vào nút gửi

Khi đã xong, các lambda xuất hiện trên các bản ghi cloudwatch bảng điều khiển trong cột đăng ký - hiển thị dưới dạng "Lambda (cloudwatch-sumologic-lambda)".

tôi đã cố gắng để tạo ra các thuê bao với nguồn TF sau:

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

Nhưng nó không thành công với:

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

tôi thấy this answer về việc thiết lập một điều tương tự cho một sự kiện theo lịch trình, nhưng điều đó dường như không tương đương với những hành động của giao diện điều khiển mà tôi đã mô tả ở trên (phương thức UI console không tạo ra một sự kiện/quy tắc mà tôi có thể thấy).

Ai đó có thể cho tôi một con trỏ trên những gì tôi đang làm sai không?

+0

Thật khó để xem chính xác nhưng có vẻ như AWS đang nói rằng vai trò bạn đã cung cấp cho PutSubscriptionFilter không có quyền truy cập Lambda. Bạn cũng có thể đăng định nghĩa của tài nguyên 'aws_iam_role.jordi-waf-cloudwatch-lambda-role.arn' không? – ydaetskcoR

Trả lời

18

Tôi đã có tài nguyên "aws_cloudwatch_log_subscription_filter" được xác định không chính xác - bạn không nên cung cấp đối số "role_arn" trong trường hợp này.

Bạn cũng cần phải thêm tài nguyên aws_lambda_permission (có mối quan hệ "depends_on" được xác định trên bộ lọc hoặc TF có thể thực hiện theo thứ tự sai). Lưu ý rằng giao diện điều khiển giao diện điều khiển AWS lambda thêm quyền lambda cho bạn một cách vô hình, vì vậy hãy cẩn thận rằng "aws_cloudwatch_log_subscription_filter" sẽ hoạt động mà không có tài nguyên quyền nếu bạn tình cờ thực hiện hành động tương tự trước đó trong giao diện điều khiển giao diện người dùng.

Các TF cấu hình cần thiết trông như thế này (hai nguồn tài nguyên cuối cùng là những người có liên quan để cấu hình các cloudwatch- thực tế> lambda kích hoạt):

// 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

Cảm ơn vì điều này! –

Các vấn đề liên quan