メインコンテンツにスキップ

SwitchBotの温度と湿度をLambdaで「New Relic」に送る

タグ: 🏷 lambda ,switchbot
目次

背景

以下をデータをNew Relicに送信するのに、Lambdaで実装しました。

  • SwitchBotで取得した温度と湿度

## 処理の流れ

  • SwitchBot Cloud API から15分ごとに温度・湿度を取得
  • AWS Lambdaが取得値をMetric API形式に変換しNew RelicへPOST
  • New Relic 側では NRQL/チャート/アラートで活用

グラフ

以下のようにグラフ化されます。

alt text

工夫点

SAMを使用してまとめてデプロイするようにしています。

また、以下のtemplate.yamlのようにTOKENなどの秘密度の高い情報はパラメータストアのセキュアパラメータとして取得するようにしています。(KMSでの暗号化は面倒に感じてしまい、してないです。)

Resources:
  SwitchBotToNewRelicFunction:
    Type: AWS::Serverless::Function
    Properties:
      PackageType: Image
      Architectures:
        - x86_64
      Policies:
        - Version: '2012-10-17'
          Statement:
            - Effect: Allow
              Action:
                - ssm:GetParameter
                - ssm:GetParameters
              Resource:
                - !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter${SwitchBotTokenParameterName}"
                - !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter${NewRelicLicenseKeyParameterName}"
            - Effect: Allow
              Action:
                - kms:Decrypt
              Resource:
                - !Sub "arn:aws:kms:${AWS::Region}:${AWS::AccountId}:key/*"
              Condition:
                StringEquals:
                  'kms:ViaService': !Sub 'ssm.${AWS::Region}.amazonaws.com'
      Events:
        ScheduledEvent:
          Type: Schedule
          Properties:
            Schedule: rate(15 minutes)
            Name: switchbot-sensor-fetch-schedule
            Description: "Triggers the function to fetch SwitchBot sensor data every 15 minutes."
            Enabled: True
      Environment:
        Variables:
          # セキュアパラメータは実行時にSSMから取得するため、パラメータ名のみを環境変数として設定
          SWITCHBOT_TOKEN_PARAMETER: !Ref SwitchBotTokenParameterName
          NEW_RELIC_LICENSE_KEY_PARAMETER: !Ref NewRelicLicenseKeyParameterName
          # 通常のパラメータは直接取得可能
          SWITCHBOT_DEVICE_ID: !Sub '{{resolve:ssm:${SwitchBotDeviceIdParameterName}}}'
          NEW_RELIC_APP_NAME: !Sub '{{resolve:ssm:${NewRelicAppNameParameterName}}}'
          NEW_RELIC_ACCOUNT_ID: !Sub '{{resolve:ssm:${NewRelicAccountIdParameterName}}}'