Cloud Functions에서 IoT Core를 PubSub 해보기

소개



Cloud Functions 는 Google Cloud Platform의 서버리스 애플리케이션입니다. AWS Lambda
Azure Functions 과 유사한 단시간 실행형 함수 기능을 제공하는 서비스이다. Cloud Functions는 현재 베타 버전입니다.

이 Functions로 IoT Core 의 토픽을 구독해 보기로 한다.

해봤어



Google Cloud IoT Core 사용하기 에서 만든 프로젝트에서 IoT Core 레지스트리 주제를 구독해 봅니다.

먼저 GCP 콘솔의 왼쪽 상단 햄버거 메뉴에서 Functions를 클릭하여 Functions 콘솔로 이동합니다.



처음 사용하는 경우는 API가 무효가 되어 있으므로 유효화한다.



함수 만들기를 클릭합니다.



함수 작성 화면. 함수의 소스 코드를 만드는 방법에는 여러 가지가 있지만 이번에는 인라인 편집기를 사용하여 소스 코드를 만듭니다.



함수 이름 btf-test-iot할당된 메모리 256MB 선택
트리거 Cloud Pub/Sub トピック 선택
주제 btf-test-topic 선택(IoT Core에서 만든 주제)
소스 코드 インライン エディタ 선택
실행할 함수 subscribe 입력



트리거에서 Cloud Pub/Sub トピック를 선택하면 소스 코드가 Pub/Sub 트리거 전용 샘플 코드로 전환됩니다. 소스 코드는 트리거에 따른 샘플 코드가 준비되어 있는 것 같다. 이번에는 이것을 그대로 이용한다.

index.js
/**
 * Triggered from a message on a Cloud Pub/Sub topic.
 *
 * @param {!Object} event The Cloud Functions event.
 * @param {!Function} The callback function.
 */
exports.subscribe = (event, callback) => {
  // The Cloud Pub/Sub Message object.
  const pubsubMessage = event.data;

  // We're just going to log the message to prove that
  // it worked.
  console.log(Buffer.from(pubsubMessage.data, 'base64').toString());

  // Don't forget to call the callback.
  callback();
};

모두 설정할 수 있으면 만들기를 클릭합니다.



잠시 후 함수가 생성됩니다.



IoT Core에 메시지를 게시하는 샘플 코드를 만듭니다. Google Cloud IoT Core 사용하기 에서 사용한 공식의 샘플 코드는 조금 중복이므로 이것을 참고에 간단한 것을 만들어 보았다.
[PROJECT ID] 실제 프로젝트 ID[REGION] IoT Core 레지스트리 지역[REGISTRY ID] IoT Core 레지스트리 ID[DEVICE ID] 장치 ID

에 각각 다시 씁니다.

index.js
'use strict';

const fs = require('fs');
const jwt = require('jsonwebtoken');
const mqtt = require('mqtt');

const PUBLISH_INTERVAL_MILLISEC = 5000;

const MQTT_HOST = 'mqtt.googleapis.com';
const MQTT_PORT = 8883;

const PROJECT_ID = '[PROJECT ID]';
const CLOUD_REGION = '[REGION]';
const REGISTRY_ID = '[REGISTRY ID]';
const DEVICE_ID = '[DEVICE ID]';

const PRIVATE_KEY_FILE = './rsa_private.pem';
const ALGORITHM = 'RS256';
const MESSAGE_TYPE = 'events';

const mqttClientId = `projects/${PROJECT_ID}/locations/${CLOUD_REGION}/registries/${REGISTRY_ID}/devices/${DEVICE_ID}`;
const mqttTopic = `/devices/${DEVICE_ID}/${MESSAGE_TYPE}`;

// Create a Cloud IoT Core JWT for the given project id, signed with the given
// private key.
// [START iot_mqtt_jwt]
function createJwt (projectId, privateKeyFile, algorithm) {
  // Create a JWT to authenticate this device. The device will be disconnected
  // after the token expires, and will have to reconnect with a new token. The
  // audience field should always be set to the GCP project id.
  const token = {
    'iat': parseInt(Date.now() / 1000),
    'exp': parseInt(Date.now() / 1000) + 20 * 60, // 20 minutes
    'aud': projectId
  };
  const privateKey = fs.readFileSync(privateKeyFile);
  return jwt.sign(token, privateKey, { algorithm: algorithm });
}
// [END iot_mqtt_jwt]

// With Google Cloud IoT Core, the username field is ignored, however it must be
// non-empty. The password field is used to transmit a JWT to authorize the
// device. The "mqtts" protocol causes the library to connect using SSL, which
// is required for Cloud IoT Core.
let settings = {
  host: MQTT_HOST,
  port: MQTT_PORT,
  clientId: mqttClientId,
  username: 'unused',
  password: createJwt(PROJECT_ID, PRIVATE_KEY_FILE, ALGORITHM),
  protocol: 'mqtts',
  secureProtocol: 'TLSv1_2_method'
};

let client = mqtt.connect(settings);

let count = 1;

/* MAIN */
setInterval(function () {

  const payload = `${DEVICE_ID}-payload-${count}`;

  // Publish "payload" to the MQTT topic. qos=1 means at least once delivery.
  // Cloud IoT Core also supports qos=0 for at most once delivery.
  console.log('Publishing message:', payload);
  client.publish(mqttTopic, payload, { qos: 1 }, function (err) {
    if (err) {
      throw new Error(err);
    }
  });

  count++;

}, PUBLISH_INTERVAL_MILLISEC);

실행합니다. 5초에 한 번 메시지가 게시됩니다.
node index.js

Publishing message: sensor1-payload-1
Publishing message: sensor1-payload-2
Publishing message: sensor1-payload-3
Publishing message: sensor1-payload-4
Publishing message: sensor1-payload-5

기능 콘솔에서 btf-test-iot 기능의 오른쪽 옵션 메뉴에서 로그 표시를 클릭합니다.



화면 상단의 재생 버튼을 클릭하여 로그 스트리밍을 활성화합니다.



구독된 메시지가 로그에 표시됩니다. 잘 된 것 같다.



요약



인라인 편집기가 편리합니다. 소스 코드는 ZIP으로 업로드하거나 Cloud Storage에 넣을 수 있지만 인라인 에디터의 샘플을 만지는 편이 편할지도 생각했다. 로컬로 개발하는 경우는 cloud-functions-emulator 로 디버그 하는 것이 편리해 보인다.

GCP로 서버리스하려면 Cloud Pub/Sub을 잘 이용하는 것이 키모가 될 것 같다. Functions의 Pub/Sub 트리거를 활용하여 유연하게 서버리스 할 수 있게 되고 싶다.

좋은 웹페이지 즐겨찾기