View a markdown version of this page

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 otorizer Anda, itu memicu Lambda terkait yang terkait dengan otorizer 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 mengotentikasi koneksi 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 khusus. 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 diperbolehkan untuk digunakan dengan principalId in AWS IoT Core. Lihat dokumentasi untuk AWS layanan lain jika karakter khusus non-alfanumerik diizinkan untuk. principalId

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

  • disconnectAfterInSeconds: Bilangan bulat yang menentukan durasi maksimum (dalam detik) koneksi ke AWS IoT Core gateway. 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 terbentuk. Nilai ini tidak dapat dimodifikasi selama pemanggilan Lambda penyegaran kebijakan berikutnya.

  • refreshAfterInSeconds: Bilangan bulat yang menentukan interval antara penyegaran kebijakan. 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 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 lebih lanjut tentang AWS IoT Core kebijakan, lihatAWS IoT Core kebijakan-kebijakan. Di MQTT melalui TLS dan MQTT melalui WebSockets koneksi AWS IoT Core , menyimpan 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, otor AWS IoT Core isasi tindakan dalam koneksi yang sudah mapan terhadap kebijakan cache ini tanpa memicu fungsi Lambda Anda lagi. Jika kegagalan terjadi selama otentikasi khusus, AWS IoT Core penghentian 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 Node.js Lambda yang mencari kata sandi dalam pesan MQTT Connect dengan nilai test dan mengembalikan kebijakan yang memberikan izin untuk terhubung AWS IoT Core dengan klien bernama myClientName dan menerbitkan ke topik yang berisi nama klien yang sama. Jika tidak menemukan kata sandi yang diharapkan, ia mengembalikan kebijakan yang menolak 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 pesan test MQTT Connect. Nilai principalId properti password dan 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 }