Soracom

Users

ドキュメント
Home ドキュメント SORACOM Funk Getting Started

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
    [ランタイム]手順 4 で入力するサンプルプログラムにあわせて「Node.js 20.x」を選択します。
    [アーキテクチャ]「x86_64」を選択します。

    Funk の送信先として作成する関数では、任意のランタイムと任意のコードを利用できます。

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

    関数が作成され、関数の概要が表示されます。

  4. [コード][コードソース] で「index.mjs」をダブルクリックして、以下のサンプルプログラムを入力します。

    import https from "https";
    import url from "node:url";
    const slackUrl = process.env.SLACK_URL;
    
    export const handler = async function (e, ctx) {
      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),
      };
    
      try {
        // https.request を Promise を使わずに async/await で扱う
        const res = await new Promise((resolve, reject) => {
          const req = https.request(slackReqOptions, (res) => {
            resolve(res);
          });
          req.on("error", (e) => {
            reject(e);
          });
          req.write(body);
          req.end();
        });
    
        if (res.statusCode === 200) {
          console.log("Posted to slack");
          return { result: "ok" };
        } else {
          return { result: "ng", reason: "Failed to post slack " + res.statusCode };
        }
      } catch (error) {
        console.error("Error posting to slack:", error);
        return { result: "ng", reason: error.message };
      }
    };
    

    コードソースを更新すると、「Changes not deployed」と表示されます。

  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: AWS IAM ポリシーと AWS IAM ロールを作成する

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

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

    「アクセス許可を指定」画面が表示されます。

  2. [サービス] で「Lambda」を選択します。

  3. [アクションをフィルタリング] に「InvokeFunction」を入力し、[InvokeFunction] にチェックを入れます。

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

    「ARN を指定」画面が表示されます。

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

    「アクセス許可を指定」画面に戻ります。

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

    「確認して作成」画面が表示されます。

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

    AWS IAM ポリシーが作成され、ポリシー画面に戻ります。

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

  9. [AWS アカウント][別の AWS アカウント] の順にクリックし、[アカウント ID] に Funk が動作する SORACOM の AWS アカウントの ID を入力します。

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

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

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

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

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

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

  12. 手順 7 で入力した AWS IAM ポリシーの名前をテキストボックスに入力し、AWS IAM ポリシーにチェックを入れて、[次へ] をクリックします。

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

    AWS IAM ロールが作成され、ロール画面に戻ります。

  14. 手順 13 で入力した AWS IAM ロールの名前をテキストボックスに入力し、AWS IAM ロールの名前をクリックします。

  15. [ARN] をメモします。

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

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

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

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

Funk から AWS Lambda の関数を呼び出すための認証情報 (IAM ロールに関する認証情報) をユーザーコンソールの認証情報ストアに登録します。認証情報は、${iam_role_arn} および ${external_id} です。認証情報ストアの「認証情報を登録」画面の表示方法については、認証情報を登録する を参照してください。

認証情報は、以下のように登録します。

項目説明
[認証情報 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

credential registration credential registration

SORACOM 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」を選択します。詳しくは、SORACOM Funk を有効化する を参照してください。

    funk group setting funk group setting

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

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

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

multi credentials per group 機能

Beam と同じく、Funk の認証情報にも multi credentials per group 機能を使用できます。

multi credentials per group 機能は、IoT SIM ごとに異なる認証情報を利用する機能です。グループ設定の [認証情報] には、#{imsi} または #{imei} のプレースホルダーを含めておき、認証情報ストア に認証情報を登録するときは、[認証情報 ID] に、実際の IoT SIM の IMSI やデバイスの IMEI を含めます。このように準備すると、接続する IoT SIM やデバイスに応じて認証情報を使い分けられます。詳しくは、Beam の multi credentials per group 機能を利用して AWS IoT に接続する を参照してください。

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

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

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

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

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

SORACOM Funk を有効化する[送信データ形式] で「JSON」を選択しているため、Unified Endpoint の UDP エントリポイントや TCP エントリポイント{"hello": "funk"} を送信しても、Slack に同様のメッセージが送信されます。

トラブルシューティング

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

SORACOM Harvest Data を有効化してデータが保存されること

Unified Endpoint に送信しているため、SORACOM Harvest Data を有効化する と、送信したデータが Harvest Data にも保存されます。Harvest Data を有効化してから、もう一度 ステップ 5: デバイスから Slack へ通知を行う の手順に従ってデバイスからリクエストを送信してください。

Harvest Data を有効化しても、送信したデータが Harvest Data に保存されない場合は、以下の点を確認してください。

  • デバイスから SORACOM に到達できること。

    たとえば、デバイスで PING 応答サービス を利用して、IoT SIM を利用するデバイスから SORACOM に到達できることを確認してください。

  • Funk および Harvest Data を有効化したグループに、IoT SIM が所属できていること。

    SIM 管理画面で、デバイスで利用する IoT SIM の [グループ] 欄に、Funk および Harvest Data を有効化したグループが表示されていることを確認してください。詳しくは、IoT SIM の情報を確認する を参照してください。

AWS Lambda にデータが送信されていること

AWS Lambda のログで、Funk で転送されたデータが AWS Lambda に送信されていることを確認できます。