Soracom

Users

ドキュメント

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

Funk を利用して、AWS Lambda の関数を実行し、Slack へ通知できます。

操作を始める前に準備が必要です (クリックして確認してください)

(1) SORACOM のアカウントを作成して IoT SIM を申し込む / デバイスを購入する

デバイスと、そのデバイスで利用できる IoT SIM を用意します。

SORACOM アカウントの作成方法、IoT SIM の申し込み方法、およびデバイスの購入方法について詳しくは、SORACOM の利用を始める を参照してください。

(2) AWS のアカウントを用意する

AWS のアカウントを用意してください。

(3) Slack のアカウントを用意する

Slack のアカウントを用意してください。

準備完了

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

「Incoming Webhook」を Slack に追加して、Webhook URL をコピーします。

  1. Slack app directory にアクセスし、検索ボックスに「Incoming Webhook」と入力して、[Incoming Webhook] をクリックします。

  2. [Slack に追加] をクリックします

  3. Incoming Webhook がメッセージを投稿するチャンネルを選択して、[Incoming Webhook インテグレーションの追加] をクリックします。

  4. [Webhook URL] に表示されている URL をコピーします。

    この URL は、これ以降、${webhook_url} と表記します。例: https://hooks.slack.com/services/..........

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

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

Funk から呼び出す AWS Lambda の関数を作成します。

  1. AWS Lambda の 「関数の作成」画面 にアクセスします。

  2. [一から作成] をクリックし、以下の項目を設定します。

    項目説明
    [関数名]関数名を入力します。例: funk-sample-button
    [ランタイム]「Node.js xx.x」を選択します。
    [アーキテクチャ]「x86_64」を選択します。

    Funk は Lambda ランタイムには依存しません。任意の Lambda ランタイムの Function を利用できます。ここでは、手順 4 で入力するサンプルプログラムにあわせて「Node.js xx.x」を選択します。

  3. [関数の作成] をクリックします。

  4. [コードソース] に以下のサンプルプログラムを入力します。

    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();
    };
    
  5. [Deploy] をクリックします。

  6. [設定][環境変数][編集] の順にクリックします。

  7. [環境変数の追加] をクリックして、以下の項目を設定します。

    項目説明
    [キー]SLACK_URL を入力します。
    [値]${webhook_url} を入力します。例: https://hooks.slack.com/services/..........
  8. [保存] をクリックします。

  9. この関数の ARN をコピーします。

    この ARN は、これ以降、${lambda_func_arn} と表記します。例: arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:funk-sample-button

ステップ 3: IAM ロールを作成する

Funk が動作する SORACOM プラットフォームの AWS アカウントに対して、ステップ 2: AWS Lambda を設定する で作成した関数の実行を許可するための、AWS IAM ロールを作成します。

  1. IAM コンソール にアクセスし、[アクセス管理][ロール] の順にクリックして、[ロールを作成] をクリックします。

    IAM ロール作成 IAM ロール作成

  2. [AWS アカウント][別の AWS アカウント] の順にクリックし、[アカウント ID] に SORACOM プラットフォームの AWS アカウント ID を入力します。

    Funk が動作する SORACOM プラットフォームの AWS アカウントの ID は、カバレッジタイプによって異なります。

    • 日本カバレッジ: 762707677580
    • グローバルカバレッジ: 950858143650

    IAM ロール作成 IAM ロール作成

  3. [外部 ID を要求する] にチェックを入れ、[外部 ID] に任意の文字列を入力します。

    [外部 ID] に入力した文字列は、これ以降、${external_id} と表記します。例: External-ID-Mej73gfhrFhimGKb

    IAM ロール作成 IAM ロール作成

  4. [次へ] をクリックします。

    「許可を追加」画面が表示されます。

  5. [ポリシーの作成] をクリックします。

    IAM ロール作成 IAM ロール作成

    別のウィンドウまたは別のタブで、「ポリシーの作成」画面が表示されます。

    ここからは「ポリシーの作成」画面でポリシーを作成します

    「ポリシーの作成」画面の操作が終わったら、[ポリシーの作成] が表示されている「許可を追加」画面に戻ってきて IAM ロールを作成する操作を続けます。画面を閉じないでください。

  6. 以下の項目を設定します。

    項目説明
    [サービス][サービスの選択] をクリックして、[Lambda] をクリックします。
    [アクション][フィルタアクション] に「InvokeFunction」と入力し、[InvokeFunction] にチェックを入れます。

    IAM ロール作成 IAM ロール作成

  7. [リソース][指定][ARN の追加] の順にクリックします。

    IAM ロール作成 IAM ロール作成

    「ARN の追加」画面が表示されます。

  8. [Lambda_function の ARN 設定] に、${lambda_func_arn} (例: arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:funk-sample-button) を入力して、[追加] をクリックします。

    IAM ロール作成 IAM ロール作成

    「ポリシーの作成」画面に戻ります。

  9. [次のステップ: タグ][次のステップ: 確認] の順にクリックします。

  10. [名前] に AWS IAM ポリシーの名前を入力し、[ポリシーの作成] をクリックします。

    IAM ロール作成 IAM ロール作成

    AWS IAM ポリシーが作成され、ポリシー画面が表示されます。

  11. ポリシー画面が表示されているウィンドウまたはタブを閉じて、「許可を追加」画面に戻ります。

  12. [] をクリックし、手順 10 で入力した AWS IAM ポリシーの名前をテキストボックスに入力して、Enter キーを押します。

    IAM ロール作成 IAM ロール作成

    作成した AWS IAM ポリシーが表示されます。

  13. 作成した AWS IAM ポリシーにチェックを入れて、[次へ] をクリックします。

  14. [ロール名] に IAM ロールの名前を入力して、[ロールを作成] をクリックします。

    IAM ロール作成 IAM ロール作成

    ロール画面に戻ります。

  15. 作成した IAM ロールの名前をクリックし、[ARN] をメモします。

    この ARN は、これ以降、${iam_role_arn} と表記します。例: arn:aws:iam::XXXXXXXXXXXX:role/funk-test-aws-lambda-role

    IAM ロール作成 IAM ロール作成

ステップ 4: Funk をセットアップする

IoT SIM を利用するデバイスから送信されたデータに応じて、Funk から AWS Lambda の関数を呼び出すための設定を、ユーザーコンソールで行います。

認証情報ストアに AWS IAM ロール認証情報を登録する

Funk から AWS Lambda の関数を呼び出すための認証情報を登録します。認証情報は、${iam_role_arn} および ${external_id} です。

  1. 認証情報ストアの「認証情報を登録」画面を表示します。

    詳しくは、認証情報を登録する を参照してください。

  2. 以下の項目を設定します。

    項目説明
    [認証情報 ID]認証情報を識別するために任意の名前を入力します。例: AWS-IAM-role-credentials-invokeFunction
    [種別]「AWS IAM ロール認証情報」を選択します。
    [ロール ARN]${iam_role_arn} を入力します。例: arn:aws:iam::XXXXXXXXXXXX:role/funk-test-aws-lambda-role
    [外部 ID]${external_id} を入力します。例: External-ID-Mej73gfhrFhimGKb

    credetial registration credetial registration

  3. [登録] をクリックします。

Funk を有効化する

IoT SIM に対して Funk を有効化します。

Funk の設定はグループに対して行います

ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作について詳しくは、グループ設定 を参照してください。

  1. SIM グループ画面で [SORACOM Funk 設定] をクリックします。

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

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

  3. 各項目を設定します。

    項目説明
    [サービス]「AWS Lambda」を選択します。
    [関数の ARN]${lambda_func_arn} を入力します。例: arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:funk-sample-button
    [認証情報]認証情報ストアに AWS IAM ロール認証情報を登録する で登録した認証情報を選択します。例: AWS-IAM-role-credentials-invokeFunction
    [送信データ形式]ここでは、「JSON」を選択します。

    funk group setting funk group setting

  4. [保存] をクリックします。

  5. 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 を参照してください。

ステップ 5: デバイスから Slack へ通知を行う

Funk を利用して AWS Lambda の関数を実行し、Slack へ通知します。

動作確認のために、Funk を有効化した IoT SIM を利用するデバイスで、Unified Endpoint にリクエストを送信します。

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

Slack に以下のようなメッセージが送信されます。

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