Сценарий-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'