AWS Severless IoT 15 – Iot-Broker

AWS Severless IoT에 대해 알아봅니다.

작성자

홍세민

홍세민

MarcusHong

Broker

프론트엔드에서 Socket에 연결, 구독을 하는 순간의 상태값을 저장해서 연결이 된 상태에서는 socket으로 메세지를 보내고, 연결이 되지 않은 상태에서는 Push Notification을 보내는 기능을 구현하려면 Iot Broker라는 것을 사용하면 된다. Broker 역시 Iot Rule로 선언하면 되니, 쉽게 구현 가능하다.

Cloudformation

Resources:
  BrokerHandler:
    Type: 'AWS::Serverless::Function'
    Properties:
      CodeUri: src
      Handler: lambda/iot.brokerHandler
      Runtime: nodejs6.10
      Role:
        'Fn::GetAtt':
          - BasicExecutionRole
          - Arn
      Environment:
        Variables:
          NODE_ENV: development
      Timeout: 30
      VpcConfig:
        SecurityGroupIds:
          - Ref: VPCLambdaSecurityGroup
        SubnetIds:
          - Ref: PublicSubnetA
          - Ref: PublicSubnetB
      Events:
        Iot:
          Type: IoTRule
          Properties:
            AwsIotSqlVersion: '2016-03-23'
            Sql: 'SELECT * FROM ''$aws/events/#'''

  BrokerHandlerLogGroup:
    Type: 'AWS::Logs::LogGroup'
    DependsOn: BrokerHandler
    Properties:
      RetentionInDays: 14
      LogGroupName:
        'Fn::Join':
          - ''
          - - /aws/lambda/
            - Ref: BrokerHandler

Lambda Function

module.exports.brokerHandler = async (event, context, callback) => {
  try {
    const options = {id: event.clientId, timestamp: event.timestamp}

    switch (event.eventType) {
      case 'connected':
      case 'disconnected':
        options.isConnected = event.eventType === 'connected'
        options.chatId = null
        break
      case 'subscribed':
      case 'unsubscribed':
        const arr = event.topics[0].split('/')
        if (arr[2] === 'chat') {
          options.isConnected = event.eventType === 'subscribed'
          if(event.eventType === 'subscribed') {
            options.chatId = parseInt(arr[3])
          }
          else {
            options.chatId = null
          }
        }
        break
    }
    if (typeof options.chatId !== 'undefined') {
      const socketStatus = await User.getSocketStatus(options) // pseudo code
      if (!socketStatus) {
        await User.updateSocketStatus(options) // pseudo code
      }
    }
    callback(null, event)
  }
  catch (err) {
    callback(err)
  }
}

주의점

  • 여기서도 express.js를 쓰지 않으므로, callback으로 처리를 해야한다는 것을 명심하자.

Tags : aws 

comments powered by Disqus