Terraform: настройка подписки на подписку на журнал Cloudwatch на лямбда?

Мне нужно отправить свои журналы облачного просмотра в службу анализа журналов.

Я следил за этими статьями здесь и здесь и заставил его работать рукой, не беспокойтесь.

Теперь я пытаюсь автоматизировать все это с помощью Terraform (роли/политики, группы безопасности, группу журналов cloudwatch, lambda и запуск лямбда из группы журналов).

Но я не могу понять, как использовать TF для настройки AWS для запуска лямбды из журналов cloudwatch.

Я могу связать два ресурса TF вручную, выполнив следующие действия (в интерфейсе веб-консоли Lambda):

  • перейдите в раздел лямбда-функции "Триггеры".
  • нажмите "Добавить триггер"
  • выберите "журналы облачных наблюдений" из списка типов триггеров
  • выберите группу журналов Я хочу запустить lambda
  • введите имя фильтра
  • оставить шаблон фильтра пустым (подразумевая триггер во всех журнальных потоках)
  • убедитесь, что выбран "включить триггер"
  • нажмите кнопку отправки

После этого лямбда появляется на консоли журналов cloudwatch в столбце подписок - отображается как "Lambda (cloudwatch-sumologic-lambda)".

Я попытался создать подписку со следующим ресурсом 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}"
}

Но он терпит неудачу:

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

Я нашел этот ответ о настройке подобной вещи для запланированного события, но это не похоже на то, что действия консоли, описанные выше, делают (метод консольного интерфейса не создает событие/правило, которое я вижу).

Может кто-нибудь дать мне указатель на то, что я делаю неправильно?

4b9b3361

У меня был определен ресурс "aws_cloudwatch_log_subscription_filter" неправильно - вы не должны указывать аргумент "role_arn" в этой ситуации.

Вам также нужно добавить ресурс aws_lambda_permission (с отношением "depend_on", определенным на фильтре, или TF может сделать это в неправильном порядке).

Обратите внимание, что пользовательский интерфейс UMS лямбда-консоли AWS добавляет вам лямбда-разрешение для невидимости, поэтому будьте осторожны, что "aws_cloudwatch_log_subscription_filter" будет работать без ресурса разрешений, если вы уже делали то же самое действие в пользовательском интерфейсе консоли.

Необходимая конфигурация TF выглядит так (последние два ресурса являются релевантными для настройки фактического триггера cloudwatch- > лямбда):

// 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}"
}
18
18 июля '16 в 7:57
источник