Mendefinisikan fungsi Lambda Anda - AWS IoT Core

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mendefinisikan fungsi Lambda Anda

Saat AWS IoT Core memanggil otorisasi Anda, itu memicu Lambda terkait yang terkait dengan otorisasi dengan peristiwa yang berisi objek JSON berikut. Contoh objek JSON berisi semua bidang yang mungkin. Bidang apa pun yang tidak relevan dengan permintaan koneksi tidak disertakan.

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

Fungsi Lambda harus menggunakan informasi ini untuk mengautentikasi koneksi yang masuk dan memutuskan tindakan apa yang diizinkan dalam koneksi. Fungsi harus mengirim respons yang berisi nilai-nilai berikut.

  • isAuthenticated: Nilai Boolean yang menunjukkan apakah permintaan diautentikasi.

  • principalId: String alfanumerik yang bertindak sebagai pengidentifikasi untuk token yang dikirim oleh permintaan otorisasi kustom. Nilai harus berupa string alfanumerik dengan setidaknya satu, dan tidak lebih dari 128, karakter dan cocok dengan pola ekspresi reguler (regex) ini:. ([a-zA-Z0-9]){1,128} Karakter khusus yang tidak alfanumerik tidak diizinkan untuk digunakan dengan in. principalId AWS IoT Core Lihat dokumentasi untuk AWS layanan lain jika karakter khusus non-alfanumerik diizinkan untuk. principalId

  • policyDocuments: Daftar dokumen AWS IoT Core kebijakan berformat JSON Untuk informasi selengkapnya tentang membuat AWS IoT Core kebijakan, lihat. AWS IoT Core kebijakan Jumlah maksimum dokumen kebijakan adalah 10 dokumen kebijakan. Setiap dokumen kebijakan dapat berisi maksimal 2.048 karakter.

  • disconnectAfterInSeconds: Sebuah integer yang menentukan durasi maksimum (dalam detik) dari koneksi ke gateway. AWS IoT Core Nilai minimum adalah 300 detik, dan nilai maksimum adalah 86.400 detik. Nilai defaultnya adalah 86.400.

    catatan

    Nilai disconnectAfterInSeconds (dikembalikan oleh fungsi Lambda) diatur saat koneksi dibuat. Nilai ini tidak dapat diubah selama pemanggilan Lambda refresh kebijakan berikutnya.

  • refreshAfterInSeconds: Sebuah integer yang menentukan interval antara kebijakan refresh. Ketika interval ini berlalu, AWS IoT Core memanggil fungsi Lambda untuk mengizinkan refresh kebijakan. Nilai minimum adalah 300 detik, dan nilai maksimum adalah 86.400 detik.

 Objek JSON berikut berisi contoh respons yang dapat dikirim oleh fungsi Lambda Anda.

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

policyDocumentNilai harus berisi dokumen AWS IoT Core kebijakan yang valid. Untuk informasi selengkapnya tentang AWS IoT Core kebijakan, lihatAWS IoT Core kebijakan. Di MQTT melalui TLS dan MQTT melalui WebSockets koneksi, AWS IoT Core cache kebijakan ini untuk interval yang ditentukan dalam nilai bidang. refreshAfterInSeconds Dalam kasus koneksi HTTP, fungsi Lambda dipanggil untuk setiap permintaan otorisasi kecuali perangkat Anda menggunakan koneksi persisten HTTP (juga disebut HTTP keep-alive atau penggunaan kembali koneksi HTTP) Anda dapat memilih untuk mengaktifkan caching saat mengonfigurasi otorisasi. Selama interval ini, AWS IoT Core mengotorisasi tindakan dalam koneksi yang dibuat terhadap kebijakan cache ini tanpa memicu fungsi Lambda Anda lagi. Jika kegagalan terjadi selama otentikasi kustom, AWS IoT Core menghentikan koneksi. AWS IoT Core juga mengakhiri koneksi jika telah terbuka lebih lama dari nilai yang ditentukan dalam disconnectAfterInSeconds parameter.

Berikut ini JavaScript berisi contoh fungsi Lambda Node.js yang mencari kata sandi dalam pesan MQTT Connect dengan nilai test dan mengembalikan kebijakan yang memberikan izin untuk terhubung dengan klien myClientName bernama dan memublikasikan AWS IoT Core ke topik yang berisi nama klien yang sama. Jika tidak menemukan kata sandi yang diharapkan, ia mengembalikan kebijakan yang menyangkal kedua tindakan tersebut.

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

Fungsi Lambda sebelumnya mengembalikan JSON berikut ketika menerima kata sandi yang diharapkan dari dalam test pesan MQTT Connect. Nilai password dan principalId properti akan menjadi nilai dari pesan 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 }