Soracom

Users

ドキュメント
Home ドキュメント SORACOM Beam Amazon Web Service (AWS) に送信する

IAM 認証を利用して AWS Lambda にリクエストを送信する

お客様の AWS アカウントにある AWS Lambda 関数へのアクセスを、Beam が動作する SORACOM の AWS アカウントにのみ許可できます。

Beam の HTTP エントリポイントを使用すると、以下のようなメリットがあります。

  • AWS Lambda 関数にアクセスするための認証情報を、デバイスにインストールする必要がありません。

  • デバイスでは、以下のように Beam のエントリポイントにリクエストを送信するだけで、AWS Lambda 関数にアクセスできます。AWS API リクエストの署名 で説明されている署名バージョン 4 の署名プロセスをデバイスで行う必要はありません。

    $ curl -X POST http://beam.soracom.io:8888/lambda-with-signature-v4 \
    -H "Content-Type: application/json" \
    -d '{
      "key": "value"
    }'
    
    {
      "message": "Hello from Lambda!",
      "body": {
        "key": "value"
      }
    }
    
  • 1 つのグループ設定に複数の HTTP エントリポイントを設定できます。

HTTP エントリポイントを経由して AWS Lambda 関数にデータを送る場合は、転送可能なデータの最大値は 6 MiB です。

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

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

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

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

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

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

  3. [詳細設定] をクリックし、[関数 URL を有効化] にチェックを入れて、[認証タイプ] で「AWS_IAM」が選択されていることを確認します。

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

    関数が作成されます。

  5. [コードソース] の「index.mjs」をダブルクリックして、以下のサンプルプログラムが表示されていることを確認します。

    export const handler = async(event) => {
        const body = {
            "message": "Hello from Lambda!",
            "body": JSON.parse(event.body)
        }
    
        const response = {
            statusCode: 200,
            body: JSON.stringify(body),
        };
        return response;
    };
    
  6. [関数の概要] に表示されている [関数の ARN][関数 URL] の値をコピーします。

    [関数の ARN] は、これ以降、${lambda_func_arn} と表記します。例: arn:aws:lambda:ap-northeast-1:XXXXXXXXXXXX:function:beam-hello-world

    [関数 URL] は、これ以降、${lambda_func_url} と表記します。例: https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.lambda-url.ap-northeast-1.on.aws/

    続けて、${lambda_func_url} にアクセスしても、アクセスできないことを確認します。

  7. 以下のコマンドを実行します。

    $ curl -X POST https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.lambda-url.ap-northeast-1.on.aws/ \
    -H "Content-Type: application/json" \
    -d '{
      "key": "value"
    }'
    
    {"Message":"Forbidden"}
    

    これは、[認証タイプ] で「AWS_IAM」を選択したためです。

ステップ 2: IAM ポリシーと IAM ロールを作成する

Beam の HTTP エントリポイントが、お客様の AWS アカウントの AWS Lambda の関数 URL を呼び出すために、お客様の AWS アカウントに以下の設定の IAM ポリシーと IAM ロールを作成します。操作手順について詳しくは、IAM ポリシーと IAM ロールを作成する を参照してください。

項目説明
IAM ポリシー

このページで説明する機能を体験するために、お客様の AWS アカウントの AWS Lambda の関数 URL を呼び出す権限を追加します。

具体的には以下のように設定します。

  • [サービス]: 「Lambda」を選択します。

  • [アクション]: [InvokeFunctionUrl] にチェックを入れます。

  • [リソース]: 「ARN を指定」画面で以下のように設定します。

    [Function name] に AWS Lambda の関数名 (例: beam-hello-world) を入力します。

IAM ロール

SORACOM の AWS アカウントを、信頼できるエンティティとして指定します。

  • 信頼できるエンティティ (IAM ロールの利用を許可する AWS アカウント): SORACOM の AWS アカウント。カバレッジタイプによって異なります。
  • 外部 ID の要求: IAM ロールを利用する際に外部 ID (任意の文字列) を要求し、セキュリティを強化します。IAM ロールごとに異なる文字列を指定してください。これ以降、${external_id} と表記します。例: External-ID-N4gqVwJMp7ZTVEgY
  • アタッチする IAM ポリシー: このページで作成する IAM ポリシー。

なお、ここで作成した IAM ロールの ARN を、これ以降、${iam_role_arn} と表記します。例: arn:aws:iam::XXXXXXXXXXXX:role/beam-hello-world-invoke-function-url-role

ステップ 3: SORACOM Beam をセットアップする

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

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

Beam から AWS Lambda 関数を呼び出すために、IAM ロールに関する認証情報を、SORACOM ユーザーコンソールに登録します。

具体的には、認証情報ストアの「認証情報を登録」画面で以下のように登録します。この画面の表示方法については、認証情報を登録する を参照してください。

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

Beam の HTTP エントリポイントを設定する

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

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

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

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

  2. [+設定を追加する][HTTP エントリポイント] の順にクリックします。

    「SORACOM Beam - HTTP 設定」画面が表示されます。

  3. 以下のように設定します。

    項目説明
    [設定名]任意の設定名 (例: AWS Lambda) を入力します。
    [エントリポイント][パス]

    /lambda-with-signature-v4 を入力します。

    1 つのグループ設定に複数のエントリポイントを設定できます

    [エントリポイント][パス] の内容で HTTP エントリポイントが識別されます。HTTP エントリポイントごとに設定を変更すると、1 つのグループ設定に複数のエントリポイントを設定できます。

    [転送先][プロトコル]「HTTPS」を選択します。
    [転送先][ホスト名]${lambda_func_url} から、先頭の「https://」および末尾の「/」を取り除いた文字列を入力します (例: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.lambda-url.ap-northeast-1.on.aws)。
    [転送先][ポート番号]空欄のままにします。
    [転送先][パス]空欄のままにします。
    [ヘッダ操作][Authorization ヘッダ]

    オンにして、以下のように設定します。

    • [タイプ]: 「AWS Signature V4」を選択します。
    • [サービス]: 「lambda」(AWS Lambda) を選択します。
    • [リージョン]: AWS Lambda 関数のリージョンを選択します。
    • [認証情報 ID]: 認証情報ストアに AWS IAM ロール認証情報を登録する で登録した AWS IAM ロール認証情報を選択します。

    HTTP エントリポイント HTTP エントリポイント
    HTTP エントリポイント HTTP エントリポイント

    HTTP エントリポイントの設定値の意味は、HTTP エントリポイント を参照してください。

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

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

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

ここでは、HTTP エントリポイントを利用しましたが、Web サイトエントリポイント でも [Authorization ヘッダ] を利用できます。

ステップ 4: HTTP エントリポイントを使用して AWS Lambda 関数を呼び出す

Beam の HTTP エントリポイントを使用して、AWS Lambda 関数を呼び出します。

  1. IoT SIM を利用するデバイスで、以下のコマンドを実行します。

    $ curl -X POST http://beam.soracom.io:8888/lambda-with-signature-v4 \
    -H "Content-Type: application/json" \
    -d '{
      "key": "value"
    }'
    
    {
      "message": "Hello from Lambda!",
      "body": {
        "key": "value"
      }
    }
    

    続けて、${lambda_func_url} にアクセスしても、引き続きアクセスできないことを確認します。

  2. IoT SIM を利用するデバイスで、以下のコマンドを実行します。

    $ curl -X POST https://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.lambda-url.ap-northeast-1.on.aws/ \
    -H "Content-Type: application/json" \
    -d '{
      "key": "value"
    }'
    
    {"Message":"Forbidden"}