Soracom

Users

ドキュメント

AWS Lambda を実行し Slack へ通知する

当ガイドでは、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設定

SORACOM Funk を有効にする 

Funk の設定はグループに対して行います
ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作ついて詳しくは、グループ設定 を参照してください。
  1. SIM グループ画面で [SORACOM Funk 設定] をクリックします。

    SIM グループ画面を表示する操作について詳しくは、グループの設定を変更する を参照してください。

  2. スイッチをクリックして「ON」にします。

  3. [サービス] として「AWS Lambda」を選択し、[認証情報][ARN] を入力し [保存] をクリックします。

    funk設定

  4. IoT SIM が所属するグループを切り替えます。

    IoT SIM の Funk の設定が完了しました。

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

SORACOM CLI / SORACOM API の場合 

soracom groups put-config (Group:putConfigurationParameters) を使用します。

{namespace} は、SoracomFunk です。

ボディで指定するプロパティについては、以下の keyvalue のペアを配列で指定します。

"SoracomFunk": {
  "enabled": true | false, // 機能自体のオンオフ、デフォルトは false
  "destination" : {
    "provider": "aws", // 利用するクラウドサービス
    "service": "lambda", // クラウドサービスに応じて変更
    "resourceUrl": "各サービスのリソース情報" // クラウドサービスに応じて変更 (以下設定例参照)
  },
  "contentType": "unspecified" | "application/json" | "text" | "binary" // 送信するデータ形式
}

destination.resourceUrl として AWS Lambda の ARN を指定する際に末尾に :VERSION を指定することで呼び出す AWS Lambda の Version を指定できます。

Funk は Lambda ランタイムには依存しませんので、任意の Lambda ランタイムの Function を利用できます。

設定例 
"SoracomFunk": {
    "enabled": true,
    "destination": {
        "provider": "aws",
        "service": "lambda",
        "resourceUrl": "AWS Lambda の ARN"
    },
    "credentialsId": {
        "$credentialsId": "AWS 認証情報"
    },
    "contentType": "application/json"
}

ステップ 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 の設定 (コード・環境変数) を確認してください。