翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Lambda 関数の定義
がオーソライザーを AWS IoT Core 呼び出すと、オーソライザーに関連付けられた Lambda が、次のJSONオブジェクトを含むイベントでトリガーされます。サンプルJSONオブジェクトには、使用可能なすべてのフィールドが含まれます。接続リクエストに関係のないフィールドは含まれていません。
{ "token" :"aToken", "signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature. "protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request. "protocolData": { "tls" : { "serverName": "serverName" // The server name indication (SNI)
host_name
string. }, "http": { "headers": { "#{name}": "#{value}" }, "queryString": "?#{name}=#{value}" }, "mqtt": { "username": "myUserName", "password": "myPassword", // A base64-encoded string. "clientId": "myClientId" // Included in the event only when the device sends the value. } }, "connectionMetadata": { "id": UUID // The connection ID. You can use this for logging. }, }
Lambda 関数は、この情報を使用して着信接続を認証し、接続で許可されるアクションを決定する必要があります。関数は、次の値を含む応答を送信する必要があります。
-
isAuthenticated
: リクエストが認証されるかどうかを示すブール値。 -
principalId
: カスタム認可リクエストによって送信されるトークンの識別子として機能する英数字の文字列。値は、1~128 文字以内の英数字の文字列で、正規表現 (regex) パターン([a-zA-Z0-9]){1,128}
と一致する必要があります。英数字以外の特殊文字は、principalId
の では使用できません AWS IoT Core。に英数字以外の特殊文字が許可されている場合は、他の AWS サービスのドキュメントを参照してくださいprincipalId
。 -
policyDocuments
: 形式の AWS IoT Core ポリシードキュメントのリストポリシーの作成の詳細については AWS IoT Core 、JSON「」を参照してくださいAWS IoT Core ポリシー。ポリシードキュメントの最大数は 10 個です。各ポリシードキュメントでは最大 2,048 文字を使用できます。 -
disconnectAfterInSeconds
: AWS IoT Core ゲートウェイへの接続の最大期間 (秒単位) を指定する整数。最小値は 300 秒で、最大値は 86,400 秒です。デフォルト値は 86,400 です。注記
(Lambda 関数によって
disconnectAfterInSeconds
返される) の値は、接続が確立されると設定されます。この値は、後続のポリシー更新 Lambda 呼び出し中に変更することはできません。 -
refreshAfterInSeconds
: ポリシーの更新の間隔を指定する整数。この時間間隔が経過すると、 AWS IoT Core が Lambda 関数を呼び出してポリシーの更新を許可します。最小値は 300 秒で、最大値は 86,400 秒です。
次のJSONオブジェクトには、Lambda 関数が送信できるレスポンスの例が含まれています。
{ "isAuthenticated":true, //A Boolean that determines whether client can connect. "principalId": "xxxxxxxx", //A string that identifies the connection in logs. "disconnectAfterInSeconds": 86400, "refreshAfterInSeconds": 300, "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Action": "iot:Publish", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:<your_aws_account_id>:topic/customauthtesting" } ] } ] }
policyDocument
値には有効な AWS IoT Core ポリシードキュメントが含まれている必要があります。 AWS IoT Core ポリシーの詳細については、「」を参照してくださいAWS IoT Core ポリシー。 MQTT TLSおよび 接続MQTTでは WebSockets、 は、 refreshAfterInSeconds
フィールドの値で指定された間隔でこのポリシーを AWS IoT Core キャッシュします。HTTP 接続の場合、デバイスがHTTP永続接続 (HTTPキープアライブまたはHTTP接続の再利用とも呼ばれます) を使用している場合を除き、Lambda 関数はすべての認証リクエストに対して呼び出されます。オーソライザーを設定するときにキャッシュを有効にすることができます。この間隔で、 は Lambda 関数を再度トリガーすることなく、このキャッシュされたポリシーに対して確立された接続のアクション AWS IoT Core を承認します。カスタム認証中に障害が発生した場合、 は接続 AWS IoT Core を終了します。 AWS IoT Core また、 disconnectAfterInSeconds
パラメータで指定された値よりも長く開いている場合は接続も終了します。
以下は、MQTTConnect メッセージ内のパスワードを の値で検索test
し、 という名前のクライアント AWS IoT Core に接続myClientName
し、同じクライアント名を含むトピックに発行するアクセス許可を付与するポリシーを返すサンプル Node.js Lambda 関数 JavaScript です。想定されるパスワードが見つからない場合、これらの 2 つのアクションを拒否するポリシーを返します。
// A simple Lambda function for an authorizer. It demonstrates // how to parse an MQTT password and generate a response. exports.handler = function(event, context, callback) { var uname = event.protocolData.mqtt.username; var pwd = event.protocolData.mqtt.password; var buff = new Buffer(pwd, 'base64'); var passwd = buff.toString('ascii'); switch (passwd) { case 'test': callback(null, generateAuthResponse(passwd, 'Allow')); break; default: callback(null, generateAuthResponse(passwd, 'Deny')); } }; // Helper function to generate the authorization response. var generateAuthResponse = function(token, effect) { var authResponse = {}; authResponse.isAuthenticated = true; authResponse.principalId = 'TEST123'; var policyDocument = {}; policyDocument.Version = '2012-10-17'; policyDocument.Statement = []; var publishStatement = {}; var connectStatement = {}; connectStatement.Action = ["iot:Connect"]; connectStatement.Effect = effect; connectStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:client/myClientName"]; publishStatement.Action = ["iot:Publish"]; publishStatement.Effect = effect; publishStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"]; policyDocument.Statement[0] = connectStatement; policyDocument.Statement[1] = publishStatement; authResponse.policyDocuments = [policyDocument]; authResponse.disconnectAfterInSeconds = 3600; authResponse.refreshAfterInSeconds = 300; return authResponse; }
前述の Lambda 関数は、MQTTConnect メッセージtest
で の期待パスワードを受信するJSONと、以下を返します。password
および principalId
プロパティの値は、MQTTConnect メッセージの値になります。
{ "password": "
password
", "isAuthenticated": true, "principalId": "principalId
", "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Action": "iot:Connect", "Effect": "Allow", "Resource": "*" }, { "Action": "iot:Publish", "Effect": "Allow", "Resource": "arn:aws:iot:region
:accountId
:topic/telemetry/${iot:ClientId}" }, { "Action": "iot:Subscribe", "Effect": "Allow", "Resource": "arn:aws:iot:region
:accountId
:topicfilter/telemetry/${iot:ClientId}" }, { "Action": "iot:Receive", "Effect": "Allow", "Resource": "arn:aws:iot:region
:accountId
:topic/telemetry/${iot:ClientId}" } ] } ], "disconnectAfterInSeconds": 3600, "refreshAfterInSeconds": 300 }