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 作成画面 から以下の JavaScript のサンプルプログラムを参考に Slack へ POST する AWS Lambda 関数を作成します。 Lambda 関数の環境変数として SLACK_URL を作成し、ステップ 1 でメモした https://hooks.slack.com/services/.......... を設定します。

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 関数を実行するため ARN をメモします。

lambda設定

Lambda 実行用の AWS IAM ロールを IAM サービス から作成します。

IAM ロール作成

  • 指定されたエンティティの種類: 別の AWS アカウントを選択します。
  • アカウント ID: SIM グループのカバレッジに応じて以下のとおり入力します。
    • 日本カバレッジ: 762707677580
    • グローバルカバレッジ: 950858143650
  • 外部 ID: 任意の文字列を指定します。外部 ID は認証情報ストアに認証情報をメモします。

次のステップに進み、Lambda の実行 (lambda:InvokeFunction) を許可するポリシーをアタッチ、もしくは新規作成してアタッチしてロールを作成します。作成が完了したら、IAM ロールの ARN をメモします。

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

SORACOM コンソールで AWS IAM ロールの認証情報を登録します。

右上のユーザー名セキュリティ認証情報ストア認証情報を登録 を選択します。

  • 認証情報 ID: 認証情報の名称となりますのでわかりやすい文字列を指定します。
  • 種別: AWS IAM ロール認証情報を指定します。
  • ロール ARN: ステップ 2 でメモした IAM ロールの ARN を入力します。
  • 外部 ID: ステップ 2 でメモした外部 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 の設定 (コード・環境変数) を確認してください。