MENU

Soracom

Users

AWS Lambda を呼び出し Slack へ通知する

SORACOM Funk は、クラウドサービスの Function を直接実行できるサービスです。クラウドリソースを活用することでデバイス側の実装をシンプルに保ち、処理をオフロードや低電力消費化が可能となります。

当ガイドでは、SORACOM Funk(以降、Funk)を利用して、AWS Lambda を呼び出し、Slack へ通知します。

はじめに

当ガイドの前提は以下のとおりです。

  • SORACOM のアカウントを作成済みであること
  • SORACOM Air の SIM (IoT SIM)、および使用できるデバイスが準備されていること
  • Slack、および AWS のアカウントを作成済みであること

各種デバイスでの IoT SIM の使用は 各種デバイスで SORACOM Air を使用する を参考にしてください。

ステップ 1: Slack を設定する

通知を受けるための Slack を設定します。 Slack のアカウントを作成したのち アプリケーションの追加 を行います。

Slack設定

Incoming Webhook の設定を行います。 のちに AWS Lambda に設定するので Webhook URL をメモしておきます。

Slack設定

以上で Slack の設定は完了です。

ステップ 2: AWS Lambda を設定する

次に Funk から呼び出す AWS Lambda を設定します。 AWS Lambda 作成画面から

以下の js のサンプルプログラムを参考に Slack へ POST する AWS Lambda を作成します。 環境変数として SLACK_URL を先ほど設定した https://hooks.slack.com/services/~~ 等の Webhook URL として保存しています。

const https = require("https");
const url = require("url");
const slackUrl = process.env.SLACK_URL;

exports.handler = function (e, ctx, cb) {
  console.log("event: %j", e);
  console.log("context: %j", ctx);

  var slackReqOptions = url.parse(slackUrl);
  slackReqOptions.method = "POST";
  slackReqOptions.headers = { "Content-Type": "application/json" };
  var payload = {
    text: "--- *lambda function called with following parameters.* ---",
    attachments: [
      {
        title: "clientContext",
        color: "#34cdd7",
        text: "```\n" + JSON.stringify(ctx.clientContext, null, "  ") + "```\n",
        mrkdwn_in: ["text"],
      },
      {
        title: "event",
        color: "#e47911",
        text: "```\n" + JSON.stringify(e, null, "  ") + "```\n",
        mrkdwn_in: ["text"],
      },
    ],
  };
  var body = JSON.stringify(payload);
  slackReqOptions.headers = {
    "Content-Type": "application/json",
    "Content-Length": Buffer.byteLength(body),
  };
  var req = https.request(slackReqOptions, function (res) {
    if (res.statusCode === 200) {
      console.log("Posted to slack");
      cb(null, { result: "ok" });
    } else {
      cb(false, { result: "ng", reason: "Failed to post slack " + res.statusCode });
    }
    return res;
  });
  req.write(body);
  req.end();
};

また、 Funk から AWS Lambda を呼び出す為に、設定した AWS Lambda の ARN をメモします。 lambda設定

Lambda 実行用の AWS IAM ユーザーを作成します。 以下の JSON を参考に AWS IAM ユーザーを作成してください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowAuroraToExampleFunction",
      "Effect": "Allow",
      "Action": "lambda:InvokeFunction",
      "Resource": "先ほどコピーしたARN"
    }
  ]
}

作成したユーザーの アクセスキーID および シークレットアクセスキー をコピーします。

ステップ 3: Funk の利用を開始する

SORACOM コンソールで AWS IAM ユーザーの認証情報を登録します。 SORACOM ユーザーコンソールの右上のユーザー名をクリックし、“セキュリティ” を選択します。

funk設定

“認証情報ストア” => “認証情報を登録” を選択します。 “認証情報 ID” は任意に記載し、種別として AWS 認証情報を選択します。 先ほどコピーした AWS ユーザーのアクセスキー ID およびシークレットアクセスキーを入力し、登録を行います。

funk設定

利用する SIM を紐付けた SIM グループの設定から Funk の設定を行います。 サービスとして AWS Lambda を選択し、認証情報と ARN を入力し保存します。

multi credentials per group 機能
Beam と同じく、Funk の認証情報にも multi credentials per group 機能を使用できます。 認証情報 ID の任意の場所に #{imsi} もしくは #{imei} のプレースホルダーを入れることで、接続デバイスに応じた 認証情報を使い分けることが可能となります。 機能詳細については Getting Started: multi credentials per group 機能を利用して AWS IoT に接続する | SORACOM Beam ご覧ください。

funk設定

ステップ 4: Slack へ通知を行う

SORACOM Funk 経由で Slack へ通知を行います。 今回は SIM を利用しているデバイスから unified endpoint を利用します。

$ curl -v -X POST -H "content-type:application/json" -d "{\"hello\": \"funk\"}" http://uni.soracom.io

以上で SORACOM Funk を利用して AWS Lambda を呼び出し Slack へ通知することができました。

トラブルシューティング

本手順で Slack へ通知できなかった場合、以下の点を確認してください。

SORACOM Harvest Data へデータが格納されるか

本手順では Unified Endpoint を利用しているため、 SORACOM Harvest Data を有効にすることで SORACOM Harvest Data と SORACOM Funk 両方へ連携されます。SORACOM Harvest Data へ格納されていない場合、デバイスが SORACOM に接続されていなかったり、グループへ所属できていない可能性があります。

AWS Lambda へデータが連携されているか

AWS Lambda のログより、SORACOM Funk からのデータが連携されているか確認します。もし SORACOM Harvest Data へデータが格納されているのに AWS Lambda にログが記録されていない場合、SORACOM Funk に設定した ARN や認証情報が誤っていないか確認してください。

Slack へ通知されているか

データを送信した際に AWS Lambda にログが記録されているにもかかわらず Slack へ通知されていない場合、AWS Lambda の設定 (コード・環境変数) を確認してください。