View a markdown version of this page

Scrittura della funzione Lambda - AWS IoT Core

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Scrittura della funzione Lambda

Quando AWS IoT Core richiama l'autorizzatore, attiva la Lambda associata all'autorizzatore con un evento che contiene il seguente oggetto JSON. L'oggetto JSON di esempio contiene tutti i campi possibili. I campi non rilevanti per la richiesta di connessione non sono inclusi.

{     "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.     }, }

La funzione Lambda deve utilizzare queste informazioni per autenticare la connessione in ingresso e decidere quali azioni sono consentite nella connessione. La funzione deve inviare una risposta che contiene i seguenti valori.

  • isAuthenticated: valore booleano che indica se la richiesta è stata autenticata.

  • principalId: Una stringa alfanumerica che funge da identificatore per il token inviato dalla richiesta di autorizzazione personalizzata. Il valore deve essere una stringa alfanumerica con almeno uno e non più di 128 caratteri e corrisponde a questo pattern di espressione regolare (regex):([a-zA-Z0-9]){1,128}. I caratteri speciali che non sono alfanumerici non possono essere utilizzati con l'in. principalId AWS IoT Core Consulta la documentazione per altri AWS servizi se sono consentiti caratteri speciali non alfanumerici per. principalId

  • policyDocuments: Un elenco di documenti JSON-formatted AWS IoT Core politici Per ulteriori informazioni sulla creazione di AWS IoT Core politiche, vedere. AWS IoT Core policies Il numero massimo di documenti di policy è di 10. Ogni documento di policy può contenere un massimo di 2.048 caratteri.

  • disconnectAfterInSeconds: numero intero che specifica la durata massima (in secondi) della connessione al gateway di AWS IoT Core . Il valore minimo è 300 secondi e il valore massimo è 86400 secondi. Il valore predefinito è 86.400.

    Nota

    Il valore di disconnectAfterInSeconds (restituito dalla funzione Lambda) viene impostato quando viene stabilita la connessione. Questo valore non può essere modificato durante le successive chiamate Lambda per l'aggiornamento delle politiche.

  • refreshAfterInSeconds: numero intero che specifica l'intervallo tra gli aggiornamenti delle policy. Passato questo intervallo, AWS IoT Core richiama la funzione Lambda per consentire gli aggiornamenti delle policy. Il valore minimo è 300 secondi e il valore massimo è 86400 secondi.

 Il seguente oggetto JSON contiene un esempio di risposta che la funzione Lambda può inviare.

{ "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"             }          ]        }     ] }

Il policyDocument valore deve contenere un documento di policy valido. AWS IoT Core Per ulteriori informazioni sulle AWS IoT Core politiche, vedereAWS IoT Core policies. In MQTT su TLS e MQTT sulle WebSockets connessioni, questa policy viene memorizzata nella AWS IoT Core cache per l'intervallo specificato nel valore del campo. refreshAfterInSeconds Nel caso di connessioni HTTP, la funzione Lambda viene richiamata per ogni richiesta di autorizzazione a meno che il dispositivo non utilizzi connessioni persistenti HTTP (chiamate anche HTTP keep-alive o riutilizzo della connessione HTTP), è possibile scegliere di abilitare la memorizzazione nella cache durante la configurazione dell'autorizzatore. Durante questo intervallo, AWS IoT Core autorizza le azioni in una connessione stabilita rispetto a questa policy memorizzata nella cache senza attivare nuovamente la funzione Lambda. Se si verificano errori durante l'autenticazione personalizzata, interrompe la connessione. AWS IoT Core AWS IoT Core interrompe anche la connessione se è rimasta aperta per più tempo del valore specificato nel parametro. disconnectAfterInSeconds

Quanto segue JavaScript contiene un esempio di funzione Node.js Lambda che cerca una password nel messaggio MQTT Connect con il valore di test e restituisce una policy che concede l'autorizzazione a connettersi AWS IoT Core con un client denominato myClientName e pubblicare un argomento che contiene lo stesso nome del cliente. Se non trova la password prevista, restituisce una policy che nega queste due operazioni.

// 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; }

La suddetta funzione Lambda restituisce il seguente JSON quando riceve la password prevista di test nel messaggio MQTT Connect. I valori delle proprietà password e principalId saranno i valori del messaggio MQTT Connect.

{ "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 }