본문 바로가기

AWS

AWS IoT Greengrass 구성요소, 레시피, 아티팩트

728x90

AWS IoT Greengrass는 디바이스에서 IoT 애플리케이션을 구축, 배포 및 관리하는 데 도움이 되는 오픈 소스 IoT(사물 인터넷) 에지 런타임 및 클라우드 서비스입니다. 라고 한다.

 

어떻게 이야기하면, 엣지 컴퓨팅을 실현시켜주는 서비스라고 말할 수도 있을지도 모른다.

스마트 팩토리에 수많은 센서들이 있다고 하자. 그 센서들이 어떤 데이터를 모으면 그 데이터들을 처리해야 하는데, 이때 처리하는 것을 클라우드까지 데이터를 질질 끌고 가는게 아니라 로컬 즉, 센서와 가까운 곳에서 처리할 수 있다는 것이다. 센서값들을 분석하고 저장하고 처리하는 과정을 클라우드까지 가지고 와서 그곳에서 하는 것이 아니라, 센서에게 더 가까운 곳에서 일처리를 한다는 의미이다. 그러면 처리하는 속도가 빨라지고 서비스에 장애가 생겨도 쉽게 대응할 수 있다는 것이다.

 

암튼, AWS에서는 'AWS IoT Greengrass를 사용하여 구성 요소라고 하는 사전 구축된 소프트웨어 모듈을 사용하여 엣지 애플리케이션을 구축할 수 있습니다.' 라고 하는데 오늘은 지금까지 내가 삽질한 구성요소에 대해서 기록할 것이다.

 

 

구성요소란?

Greengrass 코어 디바이스에 배포하는 소프트웨어 모듈이라고 한다. 로컬 장치나 클라우드에서 사용자 지정 구성 요소를 개발할 수 있고 AWS IoT Greengrass 클라우드 서비스를 사용하여 코어 디바이스에 배포할 수 있다.

 

좀 어려운디 구성요소 자체를 이해하는 것보다 그 안에 있는 것들을 이해하면 더 쉽다.

 

구성요소는 레시피, 아티팩트로 구성되어 있다.

레시피는 구성 요소의 세부 정보, 종속성, 아티팩트 및 수명 주기를 정의하는 파일이다.

그럼 아티팩트는 뭐냐..,, 스크립트, 컴파일된 코드, 정적 리소스 및 구성 요소가 사용하는 기타 파일이라고 할 수 있다.

 

정리하자면,

구성요소는 레시피와 아티팩트로 구성되어 있는데, 레시피는 구성요소의 세부 정보(이름, 버전, 작성자, 설명, 매개변수, 아티팩트 등)가 적혀있다. json 또는 yaml 형식이다.

그럼 아티팩트는 무엇이냐? 아티팩트는 파이썬 코드, S3에 업로드 된 실행할 코드 등이다.

 

즉, 아티팩트에 적힌 코드를 레시피에 명시해두고, 구성요소를 배포하면 코어 디바이스에서 레시피에 쓰여져 있는 대로 실행을 시키는 것이다.

좀 어려울 땐 예시를 보는 게 최고다..

 

{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.HelloWorld",
  "ComponentVersion": "1.0.0",
  "ComponentDescription": "My first AWS IoT Greengrass component.",
  "ComponentPublisher": "Amazon",
  "ComponentConfiguration": {
    "DefaultConfiguration": {
      "Message": "world"
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux"
      },
      "Lifecycle": {
        "Run": "python3 -u {artifacts:path}/hello_world.py \"{configuration:/Message}\""
      },
      "Artifacts": [
        {
          "URI": "s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.HelloWorld/1.0.0/hello_world.py"
        }
      ]
    }
  ]
}

위는 AWS IoT Greengrass 자습서에 있는 레시피의 예시이다.

 

RecipeFormatVersion 레시피의 템플릿 버전
ComponentName 구성요소의 이름으로, AWS 리전에서 고유해야한다.
형식이 com.example.HelloWorld라고 쓰여있는데 이유는 기업의 도메인과 충돌하지 않도록 한 것이라고 한다.
ComponentVersion 구성요소의 버전
레시피를 작성할 때마다 버전을 하나씩 늘려가야했다. 하나의 레시피를 완성하면, 같은 이름, 같은 버전의 레시피를 수정할 수 없어 매번 하나씩 버전을 더 만들어냈다.
ComponentDescription 구성요소의 설명
ComponentPublisher 구성요소의 게시자 또는 작성자. me 라고 써도 된다 흐흐
ComponentConfiguration 구성 요소의 구성이나 매개 변수를 정의하는 개체
기본 구성을 정의한 다음 구성 요소를 배포할 때 구성 요소에 제공할 구성 개체를 지정할 수 있다. (이에 대해선 이따가 더 자세히)
DefaultConfiguration 구성 요소의 기본 구성을 정의하는 개체
Manifests 플랫폼에 대한 구성 요소의 수명 주기, 매개 변수 및 요구 사항을 각각 정의하는 개체 목록
- 어떤 식으로 코드를 실행할 것인지, 어떤 명령을 사용할 것인지 명시해둔 것이다.
Platform 이 매니페스트가 적용되는 플랫폼을 정의하는 개체
os 이 매니페스트가 지원하는 플랫폼의 운영 체제 이름
- l
inux

- windows
- darwin(맥 OS)
Lifecycle 구성 요소를 설치하고 실행하는 방법을 정의하는 개체 또는 문자열
Run 구성 요소가 시작될 때 실행할 스크립트를 정의하는 개체 또는 문자열
Artifacts 이 매니페스트가 정의하는 플랫폼의 구성 요소에 대한 바이너리 아티팩트를 각각 정의하는 개체 목록
URI S3 버킷에 있는 아티팩트의 URI

 

정리하자면,

{
  "RecipeFormatVersion": "2020-01-25",
  "ComponentName": "com.example.HelloWorld", #구성요소의 이름
  "ComponentVersion": "1.0.0", #버전
  "ComponentDescription": "My first AWS IoT Greengrass component.", #설명
  "ComponentPublisher": "Amazon", #작성자는 Amazon
  "ComponentConfiguration": {
    "DefaultConfiguration": {
      "Message": "world" #구성요소의 'message'라는 개체를 'world'라고 정의
    }
  },
  "Manifests": [
    {
      "Platform": {
        "os": "linux" #플랫폼의 os는 리눅스
      },
      "Lifecycle": {
        "Run": "python3 -u {artifacts:path}/hello_world.py \"{configuration:/Message}\"" #아티팩트에 정의된 uri의 경로에서 hello_world.py 파일을 실행
      },
      "Artifacts": [
        {
          "URI": "s3://DOC-EXAMPLE-BUCKET/artifacts/com.example.HelloWorld/1.0.0/hello_world.py" #실행할 코드를 S3버킷에 담아두었는데, 그 버킷의 uri
        }
      ]
    }
  ]
}

라고 볼 수 있다.

 

아티팩트 = 실행할 코드
레시피 = 설명, 이름, 버전, 작성자, 실행할 명령들, 실행할 코드 등을 명시해 놓은 json 또는 yaml 형식의 파일

이라고 보면 된다.

 

그래서 저걸 AWS IoT Greengrass 콘솔 상에서 [배포]하면 hello_world.py 파일이 실행되는 것이다.

import sys

message = "Hello, %s!" % sys.argv[1]
message += " Greetings from your first Greengrass component."

# Print the message to stdout, which Greengrass saves in a log file.
print(message)

위 코드는 hello_world.py 파일로 세 번째 줄인 message = "Hello, %s!"에 레시피에 명시해둔 "world"라는 문자열이 들어가게 된다

 

그럼 출력은 "Hello, world! Greetings from your first Greengrass component."가 되어 코어디바이스의 로그에 찍히게 되는 것이다.

 

sudo tail -f /greengrass/v2/logs/com.example.HelloWorld.log
sudo tail -f /greengrass/v2/logs/greengrass.log

위는 구성요소의 로그 hello world 어쩌고~가 찍힌 것을 볼 수 있고,

아래는 그린그래스 코어 소프트웨어의 로그를 볼 수 있다. 배포가 제대로 안되었거나, 인터넷이 연결이 안되었거나 등등을 볼 수 있다.

 

 

 

좀 어려운데 많이 보다보니 알게된 것 같다.

생소하기도 하고, 이런게 된다고ㅗ? 라는 생각 때문인듯..,,

728x90