SwitchBotの温度と湿度をLambdaで「New Relic」に送る
目次
背景
以下をデータをNew Relicに送信するのに、Lambdaで実装しました。
- SwitchBotで取得した温度と湿度
## 処理の流れ
- SwitchBot Cloud API から15分ごとに温度・湿度を取得
- AWS Lambdaが取得値をMetric API形式に変換しNew RelicへPOST
- New Relic 側では NRQL/チャート/アラートで活用

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

工夫点
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}}}'


