Soracom

Users

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

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

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

AWS Lambda を実行する場合は AWS STS エンドポイントをアクティブ化してください

AWS Lambda を実行する場合は、AWS が提供する AWS STS エンドポイントをアクティブ化してください。

なお、アクティブ化する AWS STS エンドポイントは、Funk を利用する カバレッジタイプ および ランデブーポイント によって異なります。

SORACOM のカバレッジタイプSORACOM のランデブーポイントAWS リージョンAWS STS エンドポイント
グローバルカバレッジオレゴン (米国)米国西部 (オレゴン)sts.us-west-2.amazonaws.com
シドニー (オーストラリア)アジアパシフィック (シドニー)sts.ap-southeast-2.amazonaws.com
東京 (日本)アジアパシフィック (東京)sts.ap-northeast-1.amazonaws.com
フランクフルト (ドイツ)欧州 (フランクフルト)sts.eu-central-1.amazonaws.com
日本カバレッジ東京 (日本)アジアパシフィック (東京)sts.ap-northeast-1.amazonaws.com

たとえば、日本カバレッジの Funk で AWS Lambda を実行する場合は、sts.ap-northeast-1.amazonaws.com をアクティブ化します。

AWS STS エンドポイントのアクティブ化について詳しくは、AWS リージョン での AWS STS のアクティブ化と非アクティブ化 を参照してください。

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

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

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

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

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

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

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

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

準備完了

ステップ 1: Slack の Webhook URL を発行する

Slack の Webhook URL を発行します。詳しくは、Slack App の Incoming Webhook を利用する を参照してください。

ステップ 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 に送信されていることを確認できます。