AWS 명령줄 인터페이스를 사용하여 로컬 리소스 액세스를 구성하는 방법 - AWS IoT Greengrass

AWS IoT Greengrass Version 1 는 2023년 6월 30일에 수명 연장 단계에 들어갔습니다. AWS IoT Greengrass V1 관리형 정책에 대한 자세한 정보는 섹션을 참조하세요. 이 날짜 이후에는 기능, 개선 사항, 버그 수정 또는 보안 패치를 제공하는 업데이트를 릴리스하지 AWS IoT Greengrass V1 않습니다. 에서 실행되는 디바이스는 중단 AWS IoT Greengrass V1 되지 않고 계속 작동하며 클라우드에 연결됩니다. 로 마이그레이션 AWS IoT Greengrass Version 2하는 것이 좋습니다. 이 마이그레이션하면 추가 플랫폼 에 대한 중요한 새 기능과 지원이 추가됩니다. https://docs.aws.amazon.com/greengrass/v2/developerguide/operating-system-feature-support-matrix.html

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS 명령줄 인터페이스를 사용하여 로컬 리소스 액세스를 구성하는 방법

이 기능은 AWS IoT Greengrass 코어 v1.3 이상에 사용할 수 있습니다.

로컬 리소스를 사용하려면 Greengrass 코어 디바이스에 배포되는 그룹 정의에 리소스 정의를 추가해야 합니다. 그룹 정의에는 Lambda 함수에 로컬 리소스에 대한 액세스 권한을 부여하는 Lambda 함수 정의도 포함되어야 합니다. 요구 사항과 제한 조건을 비롯한 자세한 내용은 Lambda 함수와 커넥터를 사용하여 로컬 리소스에 액세스 섹션을 참조하십시오.

이 자습서에서는 AWS Command Line Interface(CLI)를 사용하여 로컬 리소스를 만들고 로컬 리소스에 대한 액세스 권한을 구성하는 프로세스에 대해 설명합니다. 자습서의 단계들을 따르려면 시작하기 AWS IoT Greengrass에서 설명한 대로 Greengrass 그룹을 이미 만들었어야 합니다.

AWS Management Console을(를) 사용하는 튜토리얼은 AWS Management Console을 사용하여 로컬 리소스 액세스를 구성하는 방법 섹션을 참조하십시오.

로컬 리소스 생성

먼저, CreateResourceDefinition 명령을 사용하여 액세스할 리소스를 지정하는 리소스 정의를 만듭니다. 이 예에서는 TestDirectoryTestCamera라는 두 개의 리소스를 만듭니다.

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": "" } } } } ] } }'

Resources: Greengrass 그룹의 Resource 객체 목록입니다. 하나의 Greengrass 그룹에는 최대 50개의 리소스가 있을 수 있습니다.

Resource#Id: 리소스의 고유한 식별자입니다. ID는 Lambda 함수 구성에서 리소스를 참조하는 데 사용됩니다. 최대 길이는 128자입니다. 패턴: [a-zA-Z0-9:_-]+.

Resource#Name: 리소스의 이름입니다. 리소스 이름은 Greengrass 콘솔에 표시됩니다. 최대 길이는 128자입니다. 패턴: [a-zA-Z0-9:_-]+.

LocalDeviceResourceData# SourcePath: 기기 리소스의 로컬 절대 경로입니다. 디바이스 리소스의 소스 경로는 /dev에서 문자 디바이스 또는 블록 디바이스만 참조할 수 있습니다.

LocalVolumeResourceData# SourcePath: Greengrass 코어 디바이스에 있는 볼륨 리소스의 로컬 절대 경로입니다. 이 위치는 안에서 함수가 실행되는 컨테이너의 외부입니다. 볼륨 리소스 유형의 소스 경로는 /sys로 시작할 수 없습니다.

LocalVolumeResourceData# DestinationPath: Lambda 환경 내 볼륨 리소스의 절대 경로입니다. 이 위치는 안에서 함수가 실행되는 컨테이너의 내부입니다.

GroupOwnerSetting: Lambda 프로세스에 대한 추가 그룹 권한을 구성할 수 있습니다. 이 필드는 선택 사항입니다. 자세한 설명은 그룹 소유자 파일 액세스 권한 섹션을 참조하세요.

GroupOwnerSetting# AutoAddGroupOwner: true인 경우 Greengrass는 리소스의 지정된 Linux OS 그룹 소유자를 Lambda 프로세스 권한에 자동으로 추가합니다. 따라서 Lambda 프로세스는 추가된 Linux 그룹의 파일 액세스 권한을 갖게 됩니다.

GroupOwnerSetting# GroupOwner: Lambda 프로세스에 권한이 추가된 Linux OS 그룹의 이름을 지정합니다. 이 필드는 선택 사항입니다.

리소스 정의 버전 ARN은 CreateResourceDefinition에서 반환됩니다. ARN은 그룹 정의를 업데이트할 때 사용해야 합니다.

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

Greengrass 함수 생성

리소스를 만든 후에는 CreateFunctionDefinition 명령을 사용하여 Greengrass 함수를 만들고 리소스에 함수 액세스 권한을 부여하십시오.

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: Lambda 함수에 리소스에 대한 액세스 권한을 permission 부여하는 resourceId 및 를 포함합니다. Lambda 함수는 최대 20개의 리소스에 액세스할 수 있습니다.

ResourceAccessPolicy#Permission: Lambda 함수가 리소스에 대해 갖는 권한을 지정합니다. 사용 가능한 옵션은 rw(읽기/쓰기) 또는 ro(읽기 전용)입니다.

AccessSysfs: true인 경우 Lambda 프로세스는 Greengrass 코어 /sys 디바이스의 폴더에 대한 읽기 액세스 권한을 가질 수 있습니다. 이는 Greengrass Lambda 함수가 /sys에서 디바이스 정보를 읽어야 하는 경우에 사용됩니다.

다시 말하지만, CreateFunctionDefinition은 함수 정의 버전 ARN을 반환합니다. ARN은 그룹 정의 버전에서 사용해야 합니다.

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

그룹에 Lambda 함수를 추가합니다.

마지막으로 CreateGroupVersion를 사용하여 그룹에 함수를 추가하십시오. 예:

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"
참고

이 명령과 함께 사용할 그룹 ID를 가져오는 방법을 알아보려면 그룹 ID 가져오기 단원을 참조하십시오.

새 그룹 버전이 반환됩니다.

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

이제 Greengrass 그룹에 두 리소스인 및 에 액세스할 수 있는 LraTest Lambda 함수가 포함됩니다. TestDirectory TestCamera

다음은 Python으로 작성된 Lambda 함수 lraTest.py의 예제입니다. 이 함수는 로컬 볼륨 리소스에 씁니다.

# 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

이 명령은 Greengrass API에서 제공하며 리소스 정의 및 리소스 정의 버전을 작성하고 관리합니다.

문제 해결

  • Q: Greengrass 그룹 배포가 다음과 같은 오류와 함께 실패하는 이유는 무엇입니까?

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

    A: 이 오류는 Lambda 프로세스에 지정된 리소스에 대한 권한이 없음을 나타냅니다. 해결 방법은 Lambda가 리소스에 액세스할 수 있도록 리소스의 파일 권한을 변경하는 것입니다. (자세한 내용은 그룹 소유자 파일 액세스 권한 단원을 참조하십시오).

  • Q: /var/run을 볼륨 리소스로 구성할 때 Lambda 함수가 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 코어는 현재 /var, /var/run/var/lib의 구성을 볼륨 리소스로 지원하지 않습니다. 한 가지 해결 방법은 먼저 /var, /var/run 또는 /var/lib를 다른 폴더에 탑재한 다음 해당 폴더를 볼륨 리소스로 구성하는 것입니다.

  • Q: /dev/shm을 읽기 전용 권한을 가진 볼륨 리소스로 구성할 때 runtime.log에 오류가 발생하면서 Lambda 함수가 시작하지 못하는 이유는 무엇입니까?

    [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은 읽기/쓰기로만 구성할 수 있습니다. 리소스 권한을 rw로 변경하면 문제가 해결됩니다.