AWS IoT Greengrass 구성요소, 레시피, 아티팩트
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 | 이 매니페스트가 지원하는 플랫폼의 운영 체제 이름 - linux - 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 어쩌고~가 찍힌 것을 볼 수 있고,
아래는 그린그래스 코어 소프트웨어의 로그를 볼 수 있다. 배포가 제대로 안되었거나, 인터넷이 연결이 안되었거나 등등을 볼 수 있다.
좀 어려운데 많이 보다보니 알게된 것 같다.
생소하기도 하고, 이런게 된다고ㅗ? 라는 생각 때문인듯..,,