

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# チュートリアル: のカスタムオーソライザーの作成 AWS IoT Core
<a name="custom-auth-tutorial"></a>

このチュートリアルでは、 AWS CLIを使用してカスタム認証を作成、検証、使用する手順を示します。オプションで、このチュートリアルを使用して、HTTP Publish API を使用して AWS IoT Core にデータを送信するために Postman を使用できます。

このチュートリアルでは、トークン署名が有効な **create-authorizer** 呼び出しを使用して、認可および認証ロジックとカスタムオーソライザーを実装するサンプル Lambda 関数を作成する方法を示します。その後、オーソライザーは を使用して検証され**test-invoke-authorizer**、最後に HTTP Publish API AWS IoT Core を使用してテスト MQTT トピックにデータを送信できます。サンプルリクエストでは、`x-amz-customauthorizer-name` ヘッダーを使用して呼び出すオーソライザーを指定し、トークンキー名と `x-amz-customauthorizer-signature` をリクエストヘッダーで渡します。

**このチュートリアルでは、次の内容を学習します。**
+ カスタムオーソライザーハンドラーとなる Lambda 関数を作成する方法
+ トークン署名を有効に AWS CLI して を使用してカスタムオーソライザーを作成する方法
+ **test-invoke-authorizer** コマンドを使用してカスタムオーソライザーをテストする方法
+ [Postman](https://www.postman.com/) を使用して MQTT トピックを発行し、カスタムオーソライザーでリクエストを検証する方法

このチュートリアルの完了には 60 分ほどかかります。

**Topics**
+ [ステップ 1: カスタムオーソライザー用の Lambda 関数を作成する](#custom-auth-tutorial-define)
+ [ステップ 2: カスタムオーソライザーのパブリックキーとプライベートキーのペアを作成する](#custom-auth-tutorial-keys)
+ [ステップ 3: カスタムオーソライザーリソースとその承認を作成する](#custom-auth-tutorial-authorizer)
+ [ステップ 4: test-invoke-authorizer を呼び出してオーソライザーをテストする](#custom-auth-tutorial-test)
+ [ステップ 5: Postman を使用して MQTT メッセージの発行をテストする](#custom-auth-tutorial-postman)
+ [ステップ 6: MQTT テストクライアントでメッセージを表示する](#custom-auth-tutorial-testclient)
+ [ステップ 7: 結果と次のステップを確認する](#custom-auth-tutorial-review)
+ [ステップ 8: クリーンアップする](#custom-auth-tutorial-cleanup)

**このチュートリアルを開始する前に、以下の要件を満たしていることを確認してください。**
+ 

**[セットアップ AWS アカウント](setting-up.md)**  
このチュートリアルを完了するには、 AWS アカウント と AWS IoT コンソールが必要です。

  このチュートリアルで使用するアカウントは、少なくとも次の AWS マネージドポリシーが含まれている場合に最適に機能します。
  + [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/IAMFullAccess$jsonEditor)
  + [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess$jsonEditor](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSIoTFullAccess$jsonEditor)
  + [https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor](https://console.aws.amazon.com//iam/home#/policies/arn:aws:iam::aws:policy/AWSLambda_FullAccess$jsonEditor)
**重要**  
このチュートリアルで使用される IAM ポリシーは、本稼働環境で従うべきものよりも許容度が高いです。本稼働環境で、アカウントポリシーとリソースポリシーが必要なアクセス許可のみを付与していることを確認します。  
本稼働用の IAM ポリシーを作成する場合は、ユーザーとロールに必要なアクセスを判断し、次にそれらのタスクのみの実行を許可するポリシーを設計します。  
詳細については、[IAM のセキュリティのベストプラクティス](https://docs.aws.amazon.com//IAM/latest/UserGuide/best-practices.html)を参照してください。
+ 

**をインストールしました AWS CLI**  
をインストールする方法については AWS CLI、「 [AWS CLI のインストール](https://docs.aws.amazon.com//cli/latest/userguide/cli-chap-install.html)」を参照してください。このチュートリアルには AWS CLI バージョン `aws-cli/2.1.3 Python/3.7.4 Darwin/18.7.0 exe/x86_64` 以降が必要です。
+ 

**OpenSSL ツール**  
このチュートリアルの例では、[LibreSSL 2.6.5](https://www.libressl.org/) を使用しています。このチュートリアルでは、[OpenSSL v1.1.1i](https://www.openssl.org/) ツールを使用することもできます。
+ 

**「[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html) の概要」を確認します。**  
 AWS Lambda を初めて使用する場合は、[AWS Lambda](https://docs.aws.amazon.com//lambda/latest/dg/welcome.html)「」と[「Lambda の開始方法](https://docs.aws.amazon.com//lambda/latest/dg/getting-started.html)」を確認して、その用語と概念を確認してください。
+ 

**Postman でリクエストを作成する方法を見直しました**  
詳細については、「[リクエストのビルド](https://learning.postman.com/docs/sending-requests/requests/)」を参照してください。
+ 

**以前のチュートリアルからカスタムオーソライザーを削除しました**  
では、一度に設定 AWS アカウント できるカスタムオーソライザーの数は限られています。カスタムオーソライザーの削除方法の詳細については、[ステップ 8: クリーンアップする](#custom-auth-tutorial-cleanup) を参照してください。

## ステップ 1: カスタムオーソライザー用の Lambda 関数を作成する
<a name="custom-auth-tutorial-define"></a>

のカスタム認証 AWS IoT Core では、作成した[オーソライザーリソース](https://docs.aws.amazon.com//iot/latest/apireference/API_AuthorizerDescription.html)を使用してクライアントを認証および認可します。このセクションで作成する 関数は、クライアントが AWS IoT リソースに接続してアクセスするときに、クライアントを認証 AWS IoT Core および認可します。

Lambda 関数は以下を実行します。
+ リクエストが **test-invoke-authorizer** からのものである場合、`Deny` アクションを含む IAM ポリシーを返します。
+ リクエストが HTTP を使用して Postman から送信され、`actionToken` パラメータの値が `allow` の場合、`Allow` アクションを使用して IAM ポリシーを返します。それ以外の場合は、`Deny` アクションを含む IAM ポリシーを返します。

**カスタムオーソライザー用の Lambda 関数を作成するには**

1. [Lambda](https://console.aws.amazon.com//lambda/home#) コンソールで、[[関数]](https://console.aws.amazon.com//lambda/home#/functions) を開きます。

1. [**Create function**] を選択します。

1. **[一から作成]** が選択されていることを確認します。

1. [**Basic information**]:

   1. [**関数名**] に **custom-auth-function** と入力します。

   1. **[ランタイム]** で、**[Node.js 18.x]** を確認します 

1. [**Create function**] を選択します。

   Lambda により、Node.js の関数と[実行ロール](https://docs.aws.amazon.com//lambda/latest/dg/lambda-intro-execution-role.html)が作成され、ログをアップロードするためのアクセス許可が関数に付与されます。Lambda 関数は、関数を呼び出すときに実行ロールを引き受け、実行ロールを使用して AWS SDK の認証情報を作成し、イベントソースからデータを読み込みます。

1. [AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/welcome.html) エディタで関数のコードと設定を表示するには、デザイナーウィンドウで **[custom-auth-function]** を選択し、エディタのナビゲーションペインで **[index.js]** を選択します。

   Node.js などのスクリプト言語では、Lambda には成功のレスポンスを返す基本関数が含まれています。ソースコードが 3 MB を超えない限り、[AWS Cloud9](https://docs.aws.amazon.com/cloud9/latest/user-guide/welcome.html) エディタを使用して関数を編集できます。

1. エディタの **index.js** コードを次のコードに置き換えます。

   ```
   // A simple Lambda function for an authorizer. It demonstrates
   // How to parse a CLI and Http password to generate a response.
   
   export const handler = async (event, context, callback) => {
   
       //Http parameter to initiate allow/deny request
       const HTTP_PARAM_NAME='actionToken';
       const ALLOW_ACTION = 'Allow';
       const DENY_ACTION = 'Deny';
   
       //Event data passed to Lambda function
       var event_str = JSON.stringify(event);
       console.log('Complete event :'+ event_str);
   
       //Read protocolData from the event json passed to Lambda function
       var protocolData = event.protocolData;
       console.log('protocolData value---> ' + protocolData);
   
       //Get the dynamic account ID from function's ARN to be used
       // as full resource for IAM policy
       var ACCOUNT_ID = context.invokedFunctionArn.split(":")[4];
       console.log("ACCOUNT_ID---"+ACCOUNT_ID);
   
       //Get the dynamic region from function's ARN to be used
       // as full resource for IAM policy
       var REGION = context.invokedFunctionArn.split(":")[3];
       console.log("REGION---"+REGION);
   
       //protocolData data will be undefined if testing is done via CLI.
       // This will help to test the set up.
       if (protocolData === undefined) {
   
           //If CLI testing, pass deny action as this is for testing purpose only.
           console.log('Using the test-invoke-authorizer cli for testing only');
           callback(null, generateAuthResponse(DENY_ACTION,ACCOUNT_ID,REGION));
   
       } else{
   
           //Http Testing from Postman
           //Get the query string from the request
           var queryString = event.protocolData.http.queryString;
           console.log('queryString values -- ' + queryString);
           /*         global URLSearchParams       */
           const params = new URLSearchParams(queryString);
           var action = params.get(HTTP_PARAM_NAME);
   
           if(action!=null && action.toLowerCase() === 'allow'){
   
               callback(null, generateAuthResponse(ALLOW_ACTION,ACCOUNT_ID,REGION));
   
           }else{
   
               callback(null, generateAuthResponse(DENY_ACTION,ACCOUNT_ID,REGION));
   
           }
   
       }
   
   };
   
   // Helper function to generate the authorization IAM response.
   var generateAuthResponse = function(effect,ACCOUNT_ID,REGION) {
   
       var full_resource = "arn:aws:iot:"+ REGION + ":" + ACCOUNT_ID + ":*";
       console.log("full_resource---"+full_resource);
   
       var authResponse = {};
       authResponse.isAuthenticated = true;
       authResponse.principalId = 'principalId';
   
       var policyDocument = {};
       policyDocument.Version = '2012-10-17';		 	 	 
       policyDocument.Statement = [];
       var statement = {};
       statement.Action = 'iot:*';
       statement.Effect = effect;
       statement.Resource = full_resource;
       policyDocument.Statement[0] = statement;
       authResponse.policyDocuments = [policyDocument];
       authResponse.disconnectAfterInSeconds = 3600;
       authResponse.refreshAfterInSeconds = 600;
   
       console.log('custom auth policy function called from http');
       console.log('authResponse --> ' + JSON.stringify(authResponse));
       console.log(authResponse.policyDocuments[0]);
   
       return authResponse;
   }
   ```

1. [**デプロイ**] を選択します。

1. **[変更がデプロイされました]** がエディタの上に表示されたら、次の操作を実行します。

   1. エディタの上にある **[関数の概要]** セクションまでスクロールします。

   1. このチュートリアルの後半で使用するために、**[関数 ARN]** をコピーして保存します。

1.  関数をテストします。

   1. **[テスト]** タブを選択します。

   1. デフォルトのテスト設定を使用して、**[呼び出し]** を選択します。

   1. テストが成功した場合は、**[実行結果]** で **[詳細]** ビューを開きます。関数が返したポリシードキュメントが表示されます。

      テストが失敗した場合、またはポリシードキュメントが表示されない場合は、コードを確認し、エラーを見つけて修正します。

## ステップ 2: カスタムオーソライザーのパブリックキーとプライベートキーのペアを作成する
<a name="custom-auth-tutorial-keys"></a>

カスタムオーソライザーでは、認証にパブリックキーとプライベートキーが必要です。このセクションのコマンドは、OpenSSL ツールを使用してこのキーペアを作成します。

**カスタムオーソライザーのパブリックキーとプライベートキーのペアを作成するには**

1. プライベートキーファイルを作成します。

   ```
   openssl genrsa -out private-key.pem 4096
   ```

1. 先ほど作成したプライベートキーファイルを検証します。

   ```
   openssl rsa -check -in private-key.pem -noout
   ```

   コマンドがエラーを表示しない場合、プライベートキーファイルは有効です。

1. パブリックキーファイルを作成します。

   ```
   openssl rsa -in private-key.pem -pubout -out public-key.pem
   ```

1. パブリックキーファイルを確認します。

   ```
   openssl pkey -inform PEM -pubin -in public-key.pem -noout
   ```

   コマンドがエラーを表示しない場合、パブリックキーファイルは有効です。

## ステップ 3: カスタムオーソライザーリソースとその承認を作成する
<a name="custom-auth-tutorial-authorizer"></a>

 AWS IoT カスタムオーソライザーは、前のステップで作成したすべての要素を結び付けるリソースです。このセクションでは、カスタムオーソライザーリソースを作成し、以前に作成した Lambda 関数を実行するためのアクセス許可を付与します。 AWS IoT コンソール、、または AWS API を使用して AWS CLI、カスタムオーソライザーリソースを作成できます。

このチュートリアルでは、1 つのカスタムオーソライザーを作成するだけで済みます。このセクションでは、 AWS IoT コンソールと を使用して を作成する方法について説明します。これにより AWS CLI、最も便利な メソッドを使用できます。どちらの方法でも作成されたカスタムオーソライザーリソースには違いはありません。

### カスタムオーソライザーリソースを作成する
<a name="custom-auth-tutorial-authorizer-resource"></a>

**オプションを選択してカスタムオーソライザーリソースを作成する**
+ [AWS IoT コンソールを使用してカスタムオーソライザーを作成する](#create-custom-auth-in-console)
+ [を使用してカスタムオーソライザーを作成する AWS CLI](#create-custom-auth-in-cli)

**カスタムオーソライザーを作成するには (コンソール)**

1. [AWS IoT コンソールのカスタムオーソライザーページ](https://console.aws.amazon.com//iot/home#/authorizerhub)を開き、**オーソライザーの作成**を選択します。

1. **[オーソライザーの作成]** で、次のように操作します。

   1. **[オーソライザーの名前]** に、**my-new-authorizer** と入力します。

   1. **[オーソライザーのステータス]** で、**[アクティブ]** にチェックを入れます。

   1. **[オーソライザー関数]** で、前に作成した Lambda 関数を選択します。

   1. **[トークン検証 - オプション]** で次の操作を実行します。

      1. **[トークン検証]** をオンにします。

      1. **[トークンキー名]** に、**tokenKeyName** を入力します。

      1. **[キーの追加]** を選択します。

      1. **[キー名]** で **FirstKey** を入力します。

      1. **[パブリックキー]** で、`public-key.pem` ファイルの内容を入力します。`-----BEGIN PUBLIC KEY-----` と `-----END PUBLIC KEY-----` を含むファイルの行を必ず含め、ラインフィード、キャリッジリターン、またはその他の文字をファイルの内容に追加したり、ファイルの内容から削除したりしないでください。入力する文字列は、この例のように表示されます。

         ```
         -----BEGIN PUBLIC KEY-----
         MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvEBzOk4vhN+3LgslvEWt
         sLCqNmt5Damas3bmiTRvq2gjRJ6KXGTGQChqArAJwL1a9dkS9+maaXC3vc6xzx9z
         QPu/vQOe5tyzz1MsKdmtFGxMqQ3qjEXAMPLEOmqyUKPP5mff58k6ePSfXAnzBH0q
         lg2HioefrpU5OSAnpuRAjYKofKjbc2Vrn6N2G7hV+IfTBvCElf0csalS/Rk4phD5
         oa4Y0GHISRnevypg5C8n9Rrz91PWGqP6M/q5DNJJXjMyleG92hQgu1N696bn5Dw8
         FhedszFa6b2x6xrItZFzewNQkPMLMFhNrQIIyvshtT/F1LVCS5+v8AQ8UGGDfZmv
         QeqAMAF7WgagDMXcfgKSVU8yid2sIm56qsCLMvD2Sq8Lgzpey9N5ON1o1Cvldwvc
         KrJJtgwW6hVqRGuShnownLpgG86M6neZ5sRMbVNZO8OzcobLngJ0Ibw9KkcUdklW
         gvZ6HEJqBY2XE70iEXAMPLETPHzhqvK6Ei1HGxpHsXx6BNft582J1VpgYjXha8oa
         /NN7l7Zbj/euAb41IVtmX8JrD9z613d1iM5L8HluJlUzn62Q+VeNV2tdA7MfPfMC
         8btGYladFAnitThaz6+F0VSBJPu7pZQoLnqyEp5zLMtF+kFl2yOBmGAP0RBivRd9
         JWBUCG0bqcLQPeQyjbXSOfUCAwEAAQ==
         -----END PUBLIC KEY-----
         ```

1. **[オーソライザーの作成]** を選択します。

1. カスタムオーソライザーリソースが作成された場合は、カスタムオーソライザーのリストが表示され、新しいカスタムオーソライザーがそのリストに表示されます。これで、次のセクションに進んでテストできます。

   エラーが表示された場合は、エラーを確認し、カスタムオーソライザーを再度作成して、エントリを再確認してください。各カスタムオーソライザーリソースには一意の名前が必要であることに注意してください。

**カスタムオーソライザーを作成するには (AWS CLI)**

1. `authorizer-function-arn` と `token-signing-public-keys` の値を置き換えてから、次のコマンドを実行します。

   ```
   aws iot create-authorizer \
   --authorizer-name "my-new-authorizer" \
   --token-key-name "tokenKeyName" \
   --status ACTIVE \
   --no-signing-disabled \
   --authorizer-function-arn "arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function" \
   --token-signing-public-keys FirstKey="-----BEGIN PUBLIC KEY-----
   MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAvEBzOk4vhN+3LgslvEWt
   sLCqNmt5Damas3bmiTRvq2gjRJ6KXGTGQChqArAJwL1a9dkS9+maaXC3vc6xzx9z
   QPu/vQOe5tyzz1MsKdmtFGxMqQ3qjEXAMPLEOmqyUKPP5mff58k6ePSfXAnzBH0q
   lg2HioefrpU5OSAnpuRAjYKofKjbc2Vrn6N2G7hV+IfTBvCElf0csalS/Rk4phD5
   oa4Y0GHISRnevypg5C8n9Rrz91PWGqP6M/q5DNJJXjMyleG92hQgu1N696bn5Dw8
   FhedszFa6b2x6xrItZFzewNQkPMLMFhNrQIIyvshtT/F1LVCS5+v8AQ8UGGDfZmv
   QeqAMAF7WgagDMXcfgKSVU8yid2sIm56qsCLMvD2Sq8Lgzpey9N5ON1o1Cvldwvc
   KrJJtgwW6hVqRGuShnownLpgG86M6neZ5sRMbVNZO8OzcobLngJ0Ibw9KkcUdklW
   gvZ6HEJqBY2XE70iEXAMPLETPHzhqvK6Ei1HGxpHsXx6BNft582J1VpgYjXha8oa
   /NN7l7Zbj/euAb41IVtmX8JrD9z613d1iM5L8HluJlUzn62Q+VeNV2tdA7MfPfMC
   8btGYladFAnitThaz6+F0VSBJPu7pZQoLnqyEp5zLMtF+kFl2yOBmGAP0RBivRd9
   JWBUCG0bqcLQPeQyjbXSOfUCAwEAAQ==
   -----END PUBLIC KEY-----"
   ```

**各パラメータの意味は次のとおりです。**
   + `authorizer-function-arn` 値は、カスタムオーソライザー用に作成した Lambda 関数の Amazon リソースネーム (ARN) です。
   + `token-signing-public-keys` 値には、キーの名前、**FirstKey**、および `public-key.pem` ファイルの内容が含まれます。`-----BEGIN PUBLIC KEY-----` と `-----END PUBLIC KEY-----` を含むファイルの行を必ず含め、ラインフィード、キャリッジリターン、またはその他の文字をファイルの内容に追加したり、ファイルの内容から削除したりしないでください。

     注: パブリックキーの値を変更すると使用できなくなるため、パブリックキーの入力には注意してください。

1. カスタムオーソライザーが作成されている場合、コマンドは次のような新しいリソースの名前と ARN を返します。

   ```
   {
       "authorizerName": "my-new-authorizer",
       "authorizerArn": "arn:aws:iot:Region:57EXAMPLE833:authorizer/my-new-authorizer"
   }
   ```

   次のステップで使用するために `authorizerArn` 値を保存します。

   各カスタムオーソライザーリソースには一意の名前が必要であることに注意してください。

### カスタムオーソライザーリソースを承認する
<a name="custom-auth-tutorial-authorizer-permission"></a>

このセクションでは、作成したカスタムオーソライザーリソースに、Lambda 関数を実行するためのアクセス許可を付与します。アクセス許可を付与するには、[add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html) CLI コマンドを使用できます。

**を使用して Lambda 関数にアクセス許可を付与する AWS CLI**

1. 値を挿入したら、次のコマンドを入力します。`statement-id` 値は一意でなければならないことに注意してください。このチュートリアルを以前に実行したことがある場合、または `ResourceConflictException` エラーが発生した場合は、`Id-1234` を別の値に置き換えてください。

   ```
   aws lambda add-permission  \
   --function-name "custom-auth-function" \
   --principal "iot.amazonaws.com" \
   --action "lambda:InvokeFunction" \
   --statement-id "Id-1234" \
   --source-arn authorizerArn
   ```

1. コマンドが成功すると、この例のようなアクセス許可ステートメントが返されます。次のセクションに進んで、カスタムオーソライザーをテストできます。

   ```
   {
       "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\"}}}"
   }
   ```

   コマンドが成功しない場合は、この例のようなエラーが返されます。続行する前に、エラーを確認して修正する必要があります。

   ```
   An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer
   mission on resource: arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function
   ```

## ステップ 4: test-invoke-authorizer を呼び出してオーソライザーをテストする
<a name="custom-auth-tutorial-test"></a>

すべてのリソースを定義したら、このセクションでは、コマンドラインから test-invoke-authorizer を呼び出して、認可パスをテストします。

コマンドラインからオーソライザーを呼び出す場合、`protocolData` は定義されていないため、オーソライザーは常に DENY ドキュメントを返すことに注意してください。ただし、このテストは、Lambda 関数を完全にテストしなくても、カスタムオーソライザーと Lambda 関数が正しく設定されていることを確認します。

**を使用してカスタムオーソライザーとその Lambda 関数をテストするには AWS CLI**

1. 前の手順で作成した `private-key.pem` ファイルがあるディレクトリで、次のコマンドを実行します。

   ```
   echo -n "tokenKeyValue" | openssl dgst -sha256 -sign private-key.pem | openssl base64 -A
   ```

   このコマンドは、次のステップで使用する署名文字列を作成します。署名文字列は次のようになります。

   ```
   dBwykzlb+fo+JmSGdwoGr8dyC2qB/IyLefJJr+rbCvmu9Jl4KHAA9DG+V+MMWu09YSA86+64Y3Gt4tOykpZqn9mn
   VB1wyxp+0bDZh8hmqUAUH3fwi3fPjBvCa4cwNuLQNqBZzbCvsluv7i2IMjEg+CPY0zrWt1jr9BikgGPDxWkjaeeh
   bQHHTo357TegKs9pP30Uf4TrxypNmFswA5k7QIc01n4bIyRTm90OyZ94R4bdJsHNig1JePgnuOBvMGCEFE09jGjj
   szEHfgAUAQIWXiVGQj16BU1xKpTGSiTAwheLKUjITOEXAMPLECK3aHKYKY+d1vTvdthKtYHBq8MjhzJ0kggbt29V
   QJCb8RilN/P5+vcVniSXWPplyB5jkYs9UvG08REoy64AtizfUhvSul/r/F3VV8ITtQp3aXiUtcspACi6ca+tsDuX
   f3LzCwQQF/YSUy02u5XkWn+sto6KCkpNlkD0wU8gl3+kOzxrthnQ8gEajd5Iylx230iqcXo3osjPha7JDyWM5o+K
   EWckTe91I1mokDr5sJ4JXixvnJTVSx1li49IalW4en1DAkc1a0s2U2UNm236EXAMPLELotyh7h+flFeloZlAWQFH
   xRlXsPqiVKS1ZIUClaZWprh/orDJplpiWfBgBIOgokJIDGP9gwhXIIk7zWrGmWpMK9o=
   ```

   この署名文字列をコピーして、次の手順で使用します。余分な文字を含めたり、省略したりしないように注意してください。

1. このコマンドで、`token-signature` 値を前のステップの署名文字列に置き換え、このコマンドを実行してオーソライザーをテストします。

   ```
   aws iot test-invoke-authorizer \
   --authorizer-name my-new-authorizer \
   --token tokenKeyValue \
   --token-signature dBwykzlb+fo+JmSGdwoGr8dyC2qB/IyLefJJr+rbCvmu9Jl4KHAA9DG+V+MMWu09YSA86+64Y3Gt4tOykpZqn9mnVB1wyxp+0bDZh8hmqUAUH3fwi3fPjBvCa4cwNuLQNqBZzbCvsluv7i2IMjEg+CPY0zrWt1jr9BikgGPDxWkjaeehbQHHTo357TegKs9pP30Uf4TrxypNmFswA5k7QIc01n4bIyRTm90OyZ94R4bdJsHNig1JePgnuOBvMGCEFE09jGjjszEHfgAUAQIWXiVGQj16BU1xKpTGSiTAwheLKUjITOEXAMPLECK3aHKYKY+d1vTvdthKtYHBq8MjhzJ0kggbt29VQJCb8RilN/P5+vcVniSXWPplyB5jkYs9UvG08REoy64AtizfUhvSul/r/F3VV8ITtQp3aXiUtcspACi6ca+tsDuXf3LzCwQQF/YSUy02u5XkWn+sto6KCkpNlkD0wU8gl3+kOzxrthnQ8gEajd5Iylx230iqcXo3osjPha7JDyWM5o+KEWckTe91I1mokDr5sJ4JXixvnJTVSx1li49IalW4en1DAkc1a0s2U2UNm236EXAMPLELotyh7h+flFeloZlAWQFHxRlXsPqiVKS1ZIUClaZWprh/orDJplpiWfBgBIOgokJIDGP9gwhXIIk7zWrGmWpMK9o=
   ```

   コマンドが成功すると、この例のように、カスタムオーソライザー関数によって生成された情報が返されます。

   ```
   {
       "isAuthenticated": true,
       "principalId": "principalId",
       "policyDocuments": [
           "{\"Version\":\"2012-10-17\",		 	 	 \"Statement\":[{\"Action\":\"iot:*\",\"Effect\":\"Deny\",\"Resource\":\"arn:aws:iot:Region:57EXAMPLE833:*\"}]}"
       ],
       "refreshAfterInSeconds": 600,
       "disconnectAfterInSeconds": 3600
   }
   ```

   コマンドからエラーが返された場合は、エラーを確認し、このセクションで使用したコマンドを再度確認します。

## ステップ 5: Postman を使用して MQTT メッセージの発行をテストする
<a name="custom-auth-tutorial-postman"></a>

1. コマンドラインからデバイスデータエンドポイントを取得するには、ここに示すように [describe-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) を呼び出します

   ```
   aws iot describe-endpoint --output text --endpoint-type iot:Data-ATS
   ```

   このアドレスを保存して、後のステップで *device\$1data\$1endpoint\$1address* として使用します。

1. 新しい Postman ウィンドウを開き、新しい HTTP POST リクエストを作成します。

   1. コンピュータで、Postman アプリケーションを開きます。

   1. Postman の **[ファイル]** メニューで、**[新規]** を選択します。

   1. **[New]** (新規) ダイアログボックスで、**[Request]** (リクエスト) を選択します。

   1. [Save] (保存) リクエストで、

      1. [**Request name**] (リクエスト名) で、**Custom authorizer test request** と入力します。

      1. **[保存先のコレクションまたはフォルダを選択:]** で、このリクエストを保存するコレクションを選択または作成します。

      1. **[*collection\$1name* に保存]** を選択します。

1. カスタムオーソライザーをテストするための POST リクエストを作成します。

   1. URL フィールドの横にあるリクエストメソッドセレクターで、**[POST]** を選択します。

   1. URL フィールドで、前のステップの *describe-endpoint* コマンドの [device\$1data\$1endpoint\$1address](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot/describe-endpoint.html) とともに次の URL を使用して、リクエスト用の URL を作成します。

      ```
      https://device_data_endpoint_address:443/topics/test/cust-auth/topic?qos=0&actionToken=allow
      ```

      この URL には、 AWS IoTへのアクセスを許可するポリシードキュメントを返すように Lambda 関数に指示する `actionToken=allow` クエリパラメータが含まれていることに注意してください。URL を入力すると、Postman の [**Params**] (パラメータ) タブにもクエリパラメータが表示されます。

   1. **[認証]** タブの **[タイプ]** フィールドで、**[認証なし]** を選択します。

   1. [Headers] (ヘッダー) タブで次の操作を行います。

      1. チェックが入っている **[ホスト]** キーがある場合は、このチェックを解除します。

      1. ヘッダーのリストの一番下に、これらの新しいヘッダーを追加し、チェックが入っていることを確認します。**Host** 値を *device\$1data\$1endpoint\$1address* に置き換え、**x-amz-customauthorizer-signature** 値を前のセクションの **test-invoke-authorize** コマンドで使用した署名文字列に置き換えます。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/custom-auth-tutorial.html)

   1. [Body] (本文) タブで、次の操作を行います。

      1. データ形式オプションボックスで、**[Raw]** を選択します。

      1. データ型リストで、**[JavaScript]** を選択します。

      1. テキストフィールドで、テストメッセージ用の次の JSON メッセージペイロードを入力します。

         ```
         {
             "data_mode": "test",
             "vibration": 200,
             "temperature": 40
         }
         ```

1. **[送信]** を選択してリクエストを送信します。

   リクエストが成功した場合、次を返します。

   ```
   {
       "message": "OK",
       "traceId": "ff35c33f-409a-ea90-b06f-fbEXAMPLE25c"
   }
   ```

   正常なレスポンスは、カスタムオーソライザーが への接続を許可 AWS IoT し、テストメッセージが のブローカーに配信されたことを示します AWS IoT Core。

   エラーが返された場合は、エラーメッセージ、*device\$1data\$1endpoint\$1address*、署名文字列、およびその他のヘッダー値を確認してください。

次のセクションで使用するために、このリクエストを Postman で保持します。

## ステップ 6: MQTT テストクライアントでメッセージを表示する
<a name="custom-auth-tutorial-testclient"></a>

前のステップでは、Postman AWS IoT を使用してシミュレートされたデバイスメッセージを に送信しました。成功した応答は、カスタムオーソライザーが AWS IoT への接続を許可し、テストメッセージが AWS IoT Coreのブローカーに配信されたことを示しました。このセクションでは、 AWS IoT コンソールで MQTT テストクライアントを使用して、他のデバイスやサービスと同様に、そのメッセージからのメッセージの内容を確認します。

**カスタムオーソライザーによって承認されたテストメッセージを表示するには**

1.  AWS IoT コンソールで、[MQTT テストクライアント](https://console.aws.amazon.com//iot/home#/test)を開きます。

1. [**Subscribe to topic**] (トピックへのサブスクライブ) タブの [**Topic filter**] (トピックフィルター) で、前のセクションの Postman の例で使用されているメッセージトピックである **test/cust-auth/topic** を入力します。

1. [**Subscribe**] を選択します。

   次のステップのために、このウィンドウを表示したままにします。

1. Postman で、前のセクションで作成したリクエストで、**[送信]** を選択します。

   応答を確認して、正常に完了したことを確認します。そうでない場合は、前のセクションで説明したようにエラーをトラブルシューティングします。

1. **[MQTT テストクライアント]** に、メッセージトピックを示す新しいエントリが表示され、展開すると、Postman から送信したリクエストからのメッセージペイロードが表示されます。

   **[MQTT テストクライアント]** にメッセージが表示されない場合は、次の点を確認してください。
   + Postman リクエストが正常に返されたことを確認します。が接続 AWS IoT を拒否し、エラーを返した場合、リクエスト内のメッセージはメッセージブローカーに渡されません。
   +  AWS IoT コンソールを開く AWS リージョン ために使用される AWS アカウント と が、Postman URL で使用しているものと同じであることを確認します。
   + カスタムオーソライザーに適切なエンドポイントを使用していることを確認してください。デフォルトの IoT エンドポイントは、Lambda 関数でのカスタムオーソライザーの使用をサポートしていない場合があります。その場合は、ドメイン設定を使用して新しいエンドポイントを定義し、そのエンドポイントをカスタムオーソライザーに指定できます。
   + **MQTT テストクライアント**にトピックを正しく入力したことを確認してください。トピックフィルターでは、大文字と小文字が区別されます。疑わしい場合は、 **\$1**トピックにサブスクライブすることもできます。このトピックは、メッセージブローカーを通過するすべての MQTT メッセージにサブスクライブ AWS アカウント し、 コンソールを開く AWS リージョン AWS IoT ために使用されます。

## ステップ 7: 結果と次のステップを確認する
<a name="custom-auth-tutorial-review"></a>

**このチュートリアルでは、次の作業を行いました。**
+ Lambda 関数をカスタムオーソライザーハンドラーとして作成しました
+ トークン署名を有効にしてカスタムオーソライザーを作成しました
+ **test-invoke-authorizer** コマンドを使用してカスタムオーソライザーをテストしました
+ [Postman](https://www.postman.com/) を使用して MQTT トピックを発行し、カスタムオーソライザーでリクエストを検証しました
+ Postman テストから送信されたメッセージを表示するために **[MQTT テストクライアント]** を使用しました

**次の手順**  
Postman からメッセージを送信してカスタムオーソライザーが機能していることを確認したら、このチュートリアルのさまざまな側面を変更すると結果にどのように影響するかを実験してみてください。手始めにいくつか例を紹介します。
+ 署名文字列を変更して、不正な接続の試みがどのように処理されるかを確認できないようにします。このようなエラー応答が返され、メッセージは **MQTT テストクライアント**に表示されないはずです。

  ```
  {
      "message": "Forbidden",
      "traceId": "15969756-a4a4-917c-b47a-5433e25b1356"
  }
  ```
+  AWS IoT ルールの開発中および使用中に発生する可能性のあるエラーを見つける方法の詳細については、「」を参照してください[モニタリング AWS IoT](monitoring_overview.md)。

## ステップ 8: クリーンアップする
<a name="custom-auth-tutorial-cleanup"></a>

このチュートリアルを繰り返したい場合は、カスタムオーソライザーの一部を削除する必要があります。では、一度に設定 AWS アカウント できるカスタムオーソライザーの数は限られており、既存のカスタムオーソライザーを削除せずに新しいオーソライザーを追加`LimitExceededException`しようとすると、 を取得できます。

**カスタムオーソライザーを削除するには (コンソール)**

1. [AWS IoT コンソールのカスタムオーソライザーページ](https://console.aws.amazon.com//iot/home#/authorizerhub)を開き、カスタムオーソライザーのリストで、削除するカスタムオーソライザーを見つけます。

1. [Custom authorizer details] (カスタムオーソライザーの詳細) ページを開き、[**Actions**] (アクション) メニューから [**Edit**] (編集) を選択します。

1. **[オーソライザーアクティブ化]** のチェックを解除し、**[更新]** を選択します。

   アクティブなカスタムオーソライザーを削除することはできません。

1. [Custom authorizer details] (カスタムオーソライザーの詳細) ページで、[**Actions**] (アクション) メニューを開き、[**Delete**] (削除) を選択します。

**カスタムオーソライザーを削除するには (AWS CLI)**

1. インストールしたカスタムオーソライザーの一覧を表示し、削除するカスタムオーソライザーの名前を見つけます。

   ```
   aws iot list-authorizers 
   ```

1. `Custom_Auth_Name` を、削除するカスタムオーソライザーの `authorizerName` に置き換えた後、このコマンドを実行してカスタムオーソライザーを `inactive` に設定します。

   ```
   aws iot update-authorizer --status INACTIVE --authorizer-name Custom_Auth_Name
   ```

1. `Custom_Auth_Name` を、削除するカスタムオーソライザーの `authorizerName` に置き換えた後、このコマンドを実行してカスタムオーソライザーを削除します。

   ```
   aws iot delete-authorizer --authorizer-name Custom_Auth_Name
   ```