Как включить функцию AWS Lambda для записи в Firehose?

У меня есть функция AWS Lambda, которая должна писать в Firehose. Однако, когда я делаю PutRecordBatchRequest, время ожидания истекает, и запись в Firehose не выполняется.

Функция находится в VPC. Я добавил политику к роли лямбды, чтобы разрешить доступ:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "firehose:*"
      ],
      "Resource": [
        "${aws_kinesis_firehose_delivery_stream.my_firehose.arn}"
      ]
    }
  ]
}

Обратите внимание, что я использую Terraform, поэтому приветствую решение в HCL.

Как мне заставить это работать?


person sdgfsdh    schedule 16.09.2020    source источник
comment
Когда функция AWS Lambda подключена к VPC, у нее не будет прямого доступа к Интернету. Чтобы предоставить такой доступ, вам потребуется либо: шлюз NAT в общедоступной подсети с соответствующими таблицами маршрутов, либо конечная точка VPC в VPC для нужной службы - если вы используете конечную точку VPC - вы можете настроить группы безопасности для вашей функции lamda правильно   -  person AADProgramming    schedule 16.09.2020
comment
Есть ли конкретная причина, по которой вы добавляете лямбда-функцию в VPC? Нужно ли ему связываться с ресурсами в VPC? Если нет, просто отсоедините его от VPC.   -  person John Rotenstein    schedule 17.09.2020
comment
@JohnRotenstein да, он подключается к RDS и т. Д.   -  person sdgfsdh    schedule 17.09.2020


Ответы (2)


Вам нужно добавить aws_vpc_endpoint.

Это позволяет лямбда внутри VPC взаимодействовать с сервисами AWS, которые находятся за пределами VPC. См. https://docs.aws.amazon.com/firehose/latest/dev/vpc.html.

resource "aws_security_group" "firehose_endpoint" {
  name   = "firehose-endpoint"
  vpc_id = aws_default_vpc.default.id
}

resource "aws_vpc_endpoint" "firehose_endpoint" {
  vpc_id              = aws_default_vpc.default.id
  vpc_endpoint_type   = "Interface"
  service_name        = "com.amazonaws.eu-west-2.kinesis-firehose"
  security_group_ids  = [ aws_security_group.firehose_endpoint.id ]
  private_dns_enabled = true

  subnet_ids = [
    aws_default_subnet.subnet_a.id,
    aws_default_subnet.subnet_b.id
  ]

  policy  = <<EOF
      {
        "Statement": [
          {
            "Sid": "Firehose-full-access",
            "Principal": "*",
            "Action": "firehose:*",
            "Effect": "Allow",
            "Resource": "*"
          }
        ]
      }
    EOF
}

Конечно, вам нужно будет настроить свою политику, подсети и т. Д.

person sdgfsdh    schedule 16.09.2020

Вам необходимо либо настроить доступ в Интернет, как предлагается, либо AWS Privatelink, как в https://docs.aws.amazon.com/firehose/latest/dev/vpc.html

person David Webster    schedule 16.09.2020
comment
Я пробовал следовать этим документам, но явно что-то упустил в своих скриптах Terraform. - person sdgfsdh; 16.09.2020
comment
Попробуйте сделать это вручную без терраформирования, возможно, это проблема группы безопасности? Вы всегда можете посмотреть журналы VPC Flow, чтобы узнать, куда трафик достигает или не достигает - person David Webster; 16.09.2020