Как разрешить публикацию лямбда-функции внутри VPC в IoT-Core MQTT Broker за пределами VPC в AWS?

Сценарий-1. У меня есть следующая архитектура с лямбдой, которая может прослушивать события (1) в брокере MQTT (IoT-Core), а также извлекать данные и сохранять их (2) в RDS. . RDS и Lambda находятся внутри одного и того же VPC. Проблема здесь в том, что лямбда не может опубликовать обратно (3) в Брокере результат транзакции.

введите здесь описание изображения

Сценарий 2. У меня такая же лямбда, но она находится за пределами RDS VPC. В этой конфигурации лямбда может прослушивать событие (1) внутри брокера MQTT (IoT-Core) и публиковать обратно (3). Проблема в том, что лямбда не может сохранять данные в RDS (2). введите здесь описание изображения

Я хотел бы разрешить публикацию лямбды в брокере MQTT в Сценарии-1. На самом деле я не знаю, почему лямбда может быть запущена событием в брокере, но не может быть опубликована обратно. Если VPC, где причина, это также невозможно будет прослушать.

Как разрешить публикацию лямбды в Сценарии-1? Это конфигурация внутри serverless.yml:

lambdaRSDInsert:
    name: ${self:provider.stage}-${self:custom.fnLambdaRSDInsert}
    handler: fnLambdaRSDInsert.fnLambdaRSDInsert
    events:
    - iot:
        name: ${self:custom.fnLambdaRSDInsert}
        sql: "SELECT *, topic() AS topic FROM 'company/sys/cmd/fnLambdaRSDInsert/#' "  
    memorySize: 256
    iamRoleStatementsName: ${self:provider.stage}-${self:custom.fnLambdaRSDInsert}-iamFnLambdaRSDInsert
    iamRoleStatements:
        - Effect: 'Allow'
          Action:
          - 'rds:*'
          Resource: 'arn:aws:rds:${self:provider.region}:xxxxxxx:db:${file(env.yml):rdsMySqlCluster-${self:provider.stage}}'
        - Effect: 'Allow'
          Action:
          - 'logs:CreateLogGroup'
          - 'logs:CreateLogStream'
          - 'logs:PutLogEvents'
          - 'ec2:CreateNetworkInterface'
          - 'ec2:DescribeNetworkInterfaces'
          - 'ec2:DeleteNetworkInterfaces'
          Resource: "*"
        - Effect: "Allow"
          Action:
            - "iot:*"
          Resource: '*' 
    vpc: ${file(env.yml):vpc-${self:provider.stage}}
    environment:
      rdsMySqlDb: ${file(env.yml):rdsMySqlDb-${self:provider.stage}}
      rdsMySqlHost: ${file(env.yml):rdsMySqlHost-${self:provider.stage}}
      rdsMySqlUsername: ${file(env.yml):rdsMySqlUsername-${self:provider.stage}}
      rdsMySqlPassword: ${file(env.yml):rdsMySqlPassword-${self:provider.stage}}
      MQTT_ENDPOINT: '${file(env.yml):mqttEndPoint}${self:provider.region}.amazonaws.com'

person zwitterion    schedule 14.06.2020    source источник


Ответы (1)


Вам необходимо настроить свои подсети для доступа в Интернет на панели управления VPC, добавив интернет-шлюз. Шлюз необходимо добавить в группы безопасности, где вы можете настроить разрешающие IP-адреса и порты.

После этого вам нужно создать эластичный IP-адрес, куда вам нужно добавить сетевые интерфейсы, которые были созданы во время ассоциации подсетей с функцией Lambda (их можно найти в EC2).

Я следовал этим двум руководствам: https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/ https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html

person nezhar    schedule 16.07.2020