Cara mengonfigurasi akses sumber daya lokal menggunakan AWS antarmuka baris perintah - AWS IoT Greengrass

AWS IoT Greengrass Version 1 memasuki fase umur panjang pada 30 Juni 2023. Untuk informasi selengkapnya, lihat kebijakan AWS IoT Greengrass V1 pemeliharaan. Setelah tanggal ini, tidak AWS IoT Greengrass V1 akan merilis pembaruan yang menyediakan fitur, penyempurnaan, perbaikan bug, atau patch keamanan. Perangkat yang berjalan AWS IoT Greengrass V1 tidak akan terganggu dan akan terus beroperasi dan terhubung ke cloud. Kami sangat menyarankan Anda bermigrasi ke AWS IoT Greengrass Version 2, yang menambahkan fitur baru yang signifikan dan dukungan untuk platform tambahan.

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

Cara mengonfigurasi akses sumber daya lokal menggunakan AWS antarmuka baris perintah

Fitur ini tersedia untuk AWS IoT Greengrass Core v1.3 dan yang lebih baru.

Untuk menggunakan sumber daya lokal, Anda harus menambahkan definisi sumber daya untuk definisi grup yang di-deploy untuk perangkat core Greengrass Anda. Definisi grup juga harus berisi definisi fungsi Lambda di mana Anda memberikan izin akses untuk sumber daya lokal untuk fungsi Lambda Anda. Untuk informasi lebih lanjut, termasuk persyaratan dan kendala, lihat Akses sumber daya lokal dengan fungsi dan konektor Lambda.

Tutorial ini menjelaskan proses untuk membuat sumber daya lokal dan mengonfigurasi akses ke sumber daya lokal menggunakan AWS Command Line Interface (CLI). Untuk mengikuti langkah-langkah dalam tutorial, Anda harus telah membuat grup Greengrass seperti yang dijelaskan di Memulai dengan AWS IoT Greengrass.

Untuk tutorial yang menggunakan AWS Management Console, lihat Cara mengonfigurasi akses sumber daya lokal menggunakan AWS Management Console.

Buat sumber daya lokal

Pertama, Anda menggunakan CreateResourceDefinition perintah untuk membuat definisi sumber daya yang menentukan sumber daya untuk diakses. Dalam contoh ini, kami membuat dua sumber daya, TestDirectory dan TestCamera:

aws greengrass create-resource-definition --cli-input-json '{ "Name": "MyLocalVolumeResource", "InitialVersion": { "Resources": [ { "Id": "data-volume", "Name": "TestDirectory", "ResourceDataContainer": { "LocalVolumeResourceData": { "SourcePath": "/src/LRAtest", "DestinationPath": "/dest/LRAtest", "GroupOwnerSetting": { "AutoAddGroupOwner": true, "GroupOwner": "" } } } }, { "Id": "data-device", "Name": "TestCamera", "ResourceDataContainer": { "LocalDeviceResourceData": { "SourcePath": "/dev/video0", "GroupOwnerSetting": { "AutoAddGroupOwner": true, "GroupOwner": "" } } } } ] } }'

Sumber Daya: Daftar Resource objek di grup Greengrass. Satu grup Greengrass dapat memiliki hingga 50 sumber daya.

Sumber Daya #Id: Pengenal unik sumber daya. ID digunakan untuk merujuk ke sumber daya dalam konfigurasi fungsi Lambda. Panjang maksimal 128 karakter. Pola: [a-zA-Z0-9:_-] +.

Sumber Daya #Name: Nama sumber daya. Nama sumber daya ditampilkan di konsol Greengrass. Panjang maksimal 128 karakter. Pola: [a-zA-Z0-9:_-] +.

LocalDeviceResourceData# SourcePath: Jalur absolut lokal dari sumber daya perangkat. Jalur sumber untuk sumber daya perangkat hanya dapat merujuk ke perangkat karakter atau perangkat blok di bawah /dev.

LocalVolumeResourceData# SourcePath: Jalur absolut lokal dari sumber daya volume pada perangkat inti Greengrass. Lokasi ini berada di luar kontainer yakni fungsi berjalan di. Path sumber untuk jenis sumber daya volume tidak dapat memulai dengan /sys.

LocalVolumeResourceData# DestinationPath: Jalur absolut sumber daya volume di dalam lingkungan Lambda. Lokasi ini adalah di dalam kontainer di mana fungsi berjalan.

GroupOwnerSetting: Memungkinkan Anda mengonfigurasi hak istimewa grup tambahan untuk proses Lambda. Bidang ini bersifat opsional. Untuk informasi selengkapnya, lihat Izin akses file pemilik grup.

GroupOwnerSetting# AutoAddGroupOwner: Jika benar, Greengrass secara otomatis menambahkan pemilik grup Linux OS yang ditentukan dari sumber daya ke hak istimewa proses Lambda. Dengan demikian proses Lambda memiliki izin akses file dari grup Linux yang ditambahkan.

GroupOwnerSetting# GroupOwner: Menentukan nama grup OS Linux yang hak istimewanya ditambahkan ke proses Lambda. Bidang ini bersifat opsional.

Sebuah versi definisi sumber daya ARN dikembalikan oleh CreateResourceDefinition. ARN harus digunakan ketika memperbarui definisi kelompok.

{ "LatestVersionArn": "arn:aws:greengrass:us-west-2:012345678901:/greengrass/definition/resources/ab14d0b5-116e-4951-a322-9cde24a30373/versions/a4d9b882-d025-4760-9cfe-9d4fada5390d", "Name": "MyLocalVolumeResource", "LastUpdatedTimestamp": "2017-11-15T01:18:42.153Z", "LatestVersion": "a4d9b882-d025-4760-9cfe-9d4fada5390d", "CreationTimestamp": "2017-11-15T01:18:42.153Z", "Id": "ab14d0b5-116e-4951-a322-9cde24a30373", "Arn": "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/resources/ab14d0b5-116e-4951-a322-9cde24a30373" }

Buat fungsi Greengrass

Setelah sumber daya dibuat, gunakan CreateFunctionDefinition perintah untuk membuat fungsi Greengrass dan berikan fungsi akses ke sumber daya:

aws greengrass create-function-definition --cli-input-json '{ "Name": "MyFunctionDefinition", "InitialVersion": { "Functions": [ { "Id": "greengrassLraTest", "FunctionArn": "arn:aws:lambda:us-west-2:012345678901:function:lraTest:1", "FunctionConfiguration": { "Pinned": false, "MemorySize": 16384, "Timeout": 30, "Environment": { "ResourceAccessPolicies": [ { "ResourceId": "data-volume", "Permission": "rw" }, { "ResourceId": "data-device", "Permission": "ro" } ], "AccessSysfs": true } } } ] } }'

ResourceAccessPolicies: Berisi resourceId dan permission yang memberikan akses fungsi Lambda ke sumber daya. Sebuah fungsi Lambda dapat mengakses maksimal 20 sumber daya.

ResourceAccessPolicy#Permission: Menentukan izin yang dimiliki fungsi Lambda pada sumber daya. Pilihan yang tersedia adalah rw (baca/tulis) atau ro (hanya baca).

AccessSysfs: Jika benar, proses Lambda dapat memiliki akses baca ke /sys folder pada perangkat inti Greengrass. Ini digunakan dalam kasus-kasus di mana fungsi Lambda Greengrass perlu membaca informasi perangkat dari /sys.

Sekali lagi, CreateFunctionDefinition kembalikan fungsi definisi versi ARN. ARN harus digunakan dalam versi definisi grup Anda.

{ "LatestVersionArn": "arn:aws:greengrass:us-west-2:012345678901:/greengrass/definition/functions/3c9b1685-634f-4592-8dfd-7ae1183c28ad/versions/37f0d50e-ef50-4faf-b125-ade8ed12336e", "Name": "MyFunctionDefinition", "LastUpdatedTimestamp": "2017-11-22T02:28:02.325Z", "LatestVersion": "37f0d50e-ef50-4faf-b125-ade8ed12336e", "CreationTimestamp": "2017-11-22T02:28:02.325Z", "Id": "3c9b1685-634f-4592-8dfd-7ae1183c28ad", "Arn": "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/functions/3c9b1685-634f-4592-8dfd-7ae1183c28ad" }

Tambahkan fungsi Lambda ke grup

Akhirnya, gunakan CreateGroupVersion untuk menambahkan fungsi ke grup. Sebagai contoh:

aws greengrass create-group-version --group-id "b36a3aeb-3243-47ff-9fa4-7e8d98cd3cf5" \ --resource-definition-version-arn "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/resources/db6bf40b-29d3-4c4e-9574-21ab7d74316c/versions/31d0010f-e19a-4c4c-8098-68b79906fb87" \ --core-definition-version-arn "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/cores/adbf3475-f6f3-48e1-84d6-502f02729067/versions/297c419a-9deb-46dd-8ccc-341fc670138b" \ --function-definition-version-arn "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/functions/d1123830-da38-4c4c-a4b7-e92eec7b6d3e/versions/a2e90400-caae-4ffd-b23a-db1892a33c78" \ --subscription-definition-version-arn "arn:aws:greengrass:us-west-2:123456789012:/greengrass/definition/subscriptions/7a8ef3d8-1de3-426c-9554-5b55a32fbcb6/versions/470c858c-7eb3-4abd-9d48-230236bfbf6a"
catatan

Untuk mempelajari bagaimana mendapatkan ID grup untuk digunakan dengan perintah ini, lihat Mendapatkan ID grup.

Sebuah versi grup baru dikembalikan:

{ "Arn": "arn:aws:greengrass:us-west-2:012345678901:/greengrass/groups/b36a3aeb-3243-47ff-9fa4-7e8d98cd3cf5/versions/291917fb-ec54-4895-823e-27b52da25481", "Version": "291917fb-ec54-4895-823e-27b52da25481", "CreationTimestamp": "2017-11-22T01:47:22.487Z", "Id": "b36a3aeb-3243-47ff-9fa4-7e8d98cd3cf5" }

Grup Greengrass Anda sekarang berisi fungsi Lambda LraTest yang memiliki akses ke dua sumber daya: dan. TestDirectory TestCamera

Contoh ini fungsi Lambda, lraTest.py, ditulis dengan Python, menulis ke sumber daya volume lokal:

# Demonstrates a simple use case of local resource access. # This Lambda function writes a file test to a volume mounted inside # the Lambda environment under destLRAtest. Then it reads the file and # publishes the content to the AWS IoT LRAtest topic. import sys import greengrasssdk import platform import os import logging # Setup logging to stdout logger = logging.getLogger(__name__) logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) # Create a Greengrass Core SDK client. client = greengrasssdk.client('iot-data') volumePath = '/dest/LRAtest' def function_handler(event, context): try: client.publish(topic='LRA/test', payload='Sent from AWS IoT Greengrass Core.') volumeInfo = os.stat(volumePath) client.publish(topic='LRA/test', payload=str(volumeInfo)) with open(volumePath + '/test', 'a') as output: output.write('Successfully write to a file.') with open(volumePath + '/test', 'r') as myfile: data = myfile.read() client.publish(topic='LRA/test', payload=data) except Exception as e: logger.error('Failed to publish message: ' + repr(e)) return

Perintah ini disediakan oleh API Greengrass untuk membuat dan mengelola definisi sumber daya dan versi definisi sumber daya:

Memecahkan masalah

  • Q: Mengapa deployment grup Greengrass saya gagal dengan kesalahan yang mirip dengan:

    group config is invalid: ggc_user or [ggc_group root tty] don't have ro permission on the file: /dev/tty0

    A: Kesalahan ini menunjukkan bahwa proses Lambda tidak memiliki izin untuk mengakses sumber daya tertentu. Solusinya adalah mengubah izin file dari sumber daya sehingga Lambda dapat mengaksesnya. (Lihat Izin akses file pemilik grup untuk detailnya).

  • Q: Ketika saya mengonfigurasi /var/run sebagai sumber volume, mengapa fungsi Lambda gagal untuk memulai dengan pesan salah di runtime.log:

    [ERROR]-container_process.go:39,Runtime execution error: unable to start lambda container. container_linux.go:259: starting container process caused "process_linux.go:345: container init caused \"rootfs_linux.go:62: mounting \\\"/var/run\\\" to rootfs \\\"/greengrass/ggc/packages/1.3.0/rootfs_sys\\\" at \\\"/greengrass/ggc/packages/1.3.0/rootfs_sys/run\\\" caused \\\"invalid argument\\\"\""

    A: AWS IoT Greengrass core saat ini tidak mendukung konfigurasi /var, /var/run, dan /var/lib sebagai sumber daya volume. Satu solusi adalah untuk pertama me-mount /var, /var/run atau /var/lib di folder yang berbeda dan kemudian mengonfigurasi folder sebagai sumber volume.

  • Q: Ketika saya mengonfigurasi /dev/shm sebagai sumber volume dengan izin baca-saja, mengapa fungsi Lambda gagal untuk memulai dengan kesalahan dalam runtime.log:

    [ERROR]-container_process.go:39,Runtime execution error: unable to start lambda container. container_linux.go:259: starting container process caused "process_linux.go:345: container init caused \"rootfs_linux.go:62: mounting \\\"/dev/shm\\\" to rootfs \\\"/greengrass/ggc/packages/1.3.0/rootfs_sys\\\" at \\\"/greengrass/ggc/packages/1.3.0/rootfs_sys/dev/shm\\\" caused \\\"operation not permitted\\\"\""”

    A: /dev/shm hanya dapat dikonfigurasi sebagai baca/tulis. Ubah izin sumber daya untuk rw untuk menyelesaikan masalah.