【问题标题】:How to allow a Lambda Function inside a VPC to Publish in the IoT-Core MQTT Broker outside the VPC in AWS?如何允许 VPC 内的 Lambda 函数在 AWS VPC 外的 IoT-Core MQTT 代理中发布?
【发布时间】:2020-06-14 12:36:23
【问题描述】:

场景 1:我有以下架构和 lambda,它可以在 MQTT 代理(IoT-Core)中侦听事件(1),并可以检索数据并将其保存@987654326 RDS 中的@。 RDS 和 Lambda 都在同一个 VPC 内。这里的问题是 lambda 无法在 Broker 中发布回(3) 事务的结果。

场景 2:我有相同的 lambda,但它在 RDS VPC 之外。在此配置中,lambda 可以侦听 MQTT 代理 (IoT-Core) 内的事件 (1) 并发布回 (3)。问题是 lambda 无法在 RDS (2) 中保存数据。

我希望允许 lambda 在 Scenario-1 中的 MQTT 代理中发布。事实上,我不知道为什么 lambda 可能被代理中的事件触发但不允许发布回来如果 VPC 的原因也无法监听。

如何让 lambda 在 Scenario-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'

【问题讨论】:

    标签: aws-lambda mqtt serverless amazon-vpc aws-iot


    【解决方案1】:

    您需要通过添加 Internet 网关在 VPC 控制面板中配置您的子网以访问 Internet。需要将网关添加到安全组中,您可以在其中配置允许的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-14
      • 2022-06-12
      • 2016-06-30
      • 2019-05-23
      • 2019-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多