골든 이미지 구조 - AWS 권장 가이드

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

골든 이미지 구조

AWS IoT Greengrass 대규모로 제조되는 코어 디바이스는 일반적으로 Yocto와 같은 도구를 사용하여 구성된 Linux 배포판이 있는 임베디드 Linux 디바이스입니다. 일반적으로 Greengrass 엣지 런타임은 Meta AWS 프로젝트에서 설명한 대로 배포로 베이크됩니다.

이러한 디바이스에는 파일 시스템이 여러 파티션으로 구성된 경우가 많습니다. 이 가이드에서는 골든 이미지를 catch-all 용어로 사용합니다. 디바이스에 여러 개의 골든 이미지가 있어 다양한 파티션을 플래시할 수 있습니다.

골든 이미지는 디바이스의 파일 시스템 전체 또는 일부만 포함할 수 있습니다. 이 가이드에서는 이미지를 더 광범위하게 어셈블하는 방법을 고려 AWS IoT Greengrass하지 않고 고려해야 하는 파일 시스템의 부분에 중점을 둡니다.

Greengrass 디렉터리 트리

이 가이드에서 설명하는 골든 이미지 방법을 이해하려면 다음 표에 표시된 Greengrass 디렉터리 트리의 구조를 검토하세요.

디렉터리

설명

alts

현재 활성 상태인 Greengrass nucleus 버전에 대한 파라미터 및 심볼 링크를 시작합니다.

bin

바이너리가 설치된 경우(예: 해당 구성 요소가 설치된 경우 Greengrass CLI 바이너리). 이 디렉터리는 비어 있는 경우가 많습니다.

cli_ipc_info

Greengrass CLI 프로세스 간 통신(IPC)용 스크래치패드. Greengrass CLI를 설치하지 않은 경우이 디렉터리는 비어 있습니다.

config

구성 요소 구성을 포함한 모든 Greengrass 구성.

deployments

배포 및 롤백 상태를 관리하기 위한 데이터입니다.

logs

nucleus 및 기타 구성 요소에 대한 로그 파일입니다.

packages

모든 구성 요소에 대한 아티팩트 및 레시피입니다.

plugins

수동으로 설치aws.greengrass.plugin한 유형의 구성 요소에 대한 스토리지입니다. 그렇지 않으면이 디렉터리에 데이터가 저장되지 않습니다.

telemetry

Greengrass에서 게시할 준비가 된 원격 측정 데이터를 집계하는 데 사용하는 스크래치패드입니다.

work

구성 요소의 스크래치패드입니다.

logs, telemetrywork 디렉터리에는 임시 데이터만 포함됩니다. 골든 이미지에 포함할 필요가 없으므로 이미지 크기를 최소화하려면 생략하세요.

Greengrass CLI는 일반적으로 프로덕션 디바이스에 설치되지 않으므로 bincli_ipc_info 디렉터리는 비어 있는 경우가 많으며 일반적으로 골든 이미지에 포함될 필요가 없습니다.

plugins 디렉터리에는 Greengrass를 설치할 때 플러그인(예: 플릿 프로비저닝 플러그인 또는 사용자 지정 프로비저닝 플러그인)을 수동으로 설치한 경우에만 데이터가 포함됩니다.

deployments 디렉터리의 데이터는 배포가 진행 중이므로 골든 이미지에 필요하지 않은 경우에만 사용됩니다.

따라서 alts, configpackages 디렉터리가 가장 중요합니다. 이미지 크기를 최소화하려는 경우 골든 이미지에 포함해야 하는 유일한 Greengrass 디렉터리인 경우가 있습니다.

패키지 디렉터리의 내용

패키지 디렉터리에는 다음 표와 같이 세 개의 하위 디렉터리가 있습니다.

하위 디렉터리

설명

artifacts

Greengrass가 배포 중에 다운로드하는 압축 구성 요소 아티팩트입니다.

artifacts-unarchived

.zip 아카이브인 아티팩트의 경우이 디렉터리에는 동일한 아티팩트가 포함되지만 구성 요소가 아티팩트 콘텐츠를 사용할 수 있도록 압축이 풀립니다.

recipes

구성 요소 레시피 파일입니다.

artifacts

의 다음 예제 트리 목록은 아티팩트가 저장되는 방법을 packages/artifacts 보여줍니다.

user@machine:~$ sudo tree /greengrass/v2/packages/artifacts /greengrass/v2/packages/artifacts ├── aws.greengrass.DockerApplicationManager ├── aws.greengrass.LogManager │ └── 2.3.7 │ └── aws.greengrass.LogManager.jar ├── aws.greengrass.Nucleus │ └── 2.12.6 │ └── aws.greengrass.nucleus.zip ├── aws.greengrass.SecretManager │ └── 2.1.8 │ └── aws.greengrass.SecretManager.jar ├── aws.greengrass.SecureTunneling │ └── 1.0.19 │ └── GreengrassV2SecureTunnelingComponent-1.0-all.jar ├── aws.greengrass.labs.CertificateRotator │ └── 1.1.0 │ └── certificate-rotator.zip ├── aws.greengrass.labs.HomeAssistant │ └── 1.0.0 │ └── home-assistant.zip └── aws.greengrass.telemetry.NucleusEmitter └── 1.0.8 └── aws.greengrass.telemetry.NucleusEmitter.jar 15 directories, 7 files

아티팩트-아카이빙되지 않음

다음 예제 트리 목록은 .zip 파일에서 추출된 아티팩트를 packages/artifacts-unarchived 보여줍니다.

user@machine:~$ sudo tree /greengrass/v2/packages/artifacts-unarchived /greengrass/v2/packages/artifacts-unarchived ├── aws.greengrass.Nucleus │ └── 2.12.6 │ └── aws.greengrass.nucleus │ ├── LICENSE │ ├── NOTICE │ ├── README.md │ ├── THIRD-PARTY-LICENSES │ ├── bin │ │ ├── greengrass.exe │ │ ├── greengrass.service │ │ ├── greengrass.service.procd.template │ │ ├── greengrass.service.template │ │ ├── greengrass.xml.template │ │ ├── loader │ │ └── loader.cmd │ ├── conf │ │ └── recipe.yaml │ └── lib │ └── Greengrass.jar ├── aws.greengrass.SecureTunneling │ └── 1.0.19 ├── aws.greengrass.labs.CertificateRotator │ └── 1.1.0 │ └── certificate-rotator │ ├── __pycache__ │ │ ├── config.cpython-310.pyc │ │ ├── config.cpython-311.pyc │ │ ├── effective_config.cpython-310.pyc │ │ ├── effective_config.cpython-311.pyc │ │ ├── main.cpython-311.pyc │ │ ├── pki.cpython-310.pyc │ │ ├── pki.cpython-311.pyc │ │ ├── pki_file.cpython-310.pyc │ │ ├── pki_file.cpython-311.pyc │ │ ├── pki_hsm.cpython-310.pyc │ │ ├── pki_hsm.cpython-311.pyc │ │ ├── pubsub.cpython-310.pyc │ │ ├── pubsub.cpython-311.pyc │ │ ├── state.cpython-310.pyc │ │ ├── state.cpython-311.pyc │ │ ├── state_committing_certificate.cpython-310.pyc │ │ ├── state_committing_certificate.cpython-311.pyc │ │ ├── state_creating_certificate.cpython-310.pyc │ │ ├── state_creating_certificate.cpython-311.pyc │ │ ├── state_getting_job.cpython-310.pyc │ │ ├── state_getting_job.cpython-311.pyc │ │ ├── state_idle.cpython-310.pyc │ │ ├── state_idle.cpython-311.pyc │ │ ├── state_machine.cpython-310.pyc │ │ ├── state_machine.cpython-311.pyc │ │ ├── state_updating_job.cpython-310.pyc │ │ ├── state_updating_job.cpython-311.pyc │ │ ├── topic_base.cpython-310.pyc │ │ └── topic_base.cpython-311.pyc │ ├── config.py │ ├── effective_config.py │ ├── main.py │ ├── pki.py │ ├── pki_file.py │ ├── pki_hsm.py │ ├── pubsub.py │ ├── requirements.txt │ ├── scripts │ │ └── run.cmd │ ├── state.py │ ├── state_committing_certificate.py │ ├── state_creating_certificate.py │ ├── state_getting_job.py │ ├── state_idle.py │ ├── state_machine.py │ ├── state_updating_job.py │ └── topic_base.py └── aws.greengrass.labs.HomeAssistant └── 1.0.0 └── home-assistant ├── config │ ├── automations.yaml │ ├── configuration.yaml │ ├── groups.yaml │ ├── scenes.yaml │ └── scripts.yaml ├── docker-compose.yml ├── install.py └── secret.py 17 directories, 67 files

alts 디렉터리는의 Nucleus .jar 파일에 연결됩니다packages/artifacts-unarchived. 예시:

user@machine:~$ sudo ls -l /greengrass/v2/alts/init total 8 lrwxrwxrwx 1 root root 97 Jun 27 08:12 distro -> /greengrass/v2/packages/artifacts-unarchived/aws.greengrass.Nucleus/2.12.6/aws.greengrass.nucleus -rw-r--r-- 1 root root 16 Jun 27 07:07 launch.params

따라서는 골든 이미지에 포함되어야 packages/artifacts-unarchived 합니다.

recipes

의 다음 예제 트리 목록은 레시피가 저장되는 방법을 packages/recipes 보여줍니다. 목록에서 알 수 있듯이 레시피는 다이제스트와 함께 저장되므로 Greengrass가 배포를 수신할 때 이미 올바른 파일이 있는지 확인할 수 있습니다. 이 매우 구체적인 형식은 골든 이미지를 구성하기 어렵게 만듭니다. 따라서 골든 디바이스의 스냅샷을 생성하는 것이 골든 이미지를 생성하는 데 권장되는 방법입니다.

user@machine:~$ sudo tree /greengrass/v2/packages/recipes /greengrass/v2/packages/recipes ├── 0ya1warrMfzlq5PUTvOgfHOununru_xCLUFACECM_R0@2.3.7.metadata.json ├── 0ya1warrMfzlq5PUTvOgfHOununru_xCLUFACECM_R0@2.3.7.recipe.yaml ├── 89r1-ak7xPauDt4O7EG03sSXVUO8ysdHTk-YdF0NAAc@2.12.6.metadata.json ├── 89r1-ak7xPauDt4O7EG03sSXVUO8ysdHTk-YdF0NAAc@2.12.6.recipe.yaml ├── VAZ-Grqe5g43yO7UtasQOR5jcQGILgPeRZQhVikLd9o@1.0.0.metadata.json ├── VAZ-Grqe5g43yO7UtasQOR5jcQGILgPeRZQhVikLd9o@1.0.0.recipe.yaml ├── ViMYPYs99-AzSt1gL2L2YD5P7sIN-yEhy23wWJK_JN8@1.0.8.metadata.json ├── ViMYPYs99-AzSt1gL2L2YD5P7sIN-yEhy23wWJK_JN8@1.0.8.recipe.yaml ├── _1hT2A6X0ZYtB_CfI_ZUOEMDV96DfQVkSmZh2bbGYXg@1.0.19.metadata.json ├── _1hT2A6X0ZYtB_CfI_ZUOEMDV96DfQVkSmZh2bbGYXg@1.0.19.recipe.yaml ├── gQWwM7MSL2kOsBADU9bOQJ1QqO8ZI3hqpbKT5Bv4Ijk@1.1.0.metadata.json ├── gQWwM7MSL2kOsBADU9bOQJ1QqO8ZI3hqpbKT5Bv4Ijk@1.1.0.recipe.yaml ├── j_j5Seyy01FOcIh95nBFy4HYf8P1kT-jW_nmV18ldbk@2.1.8.metadata.json └── j_j5Seyy01FOcIh95nBFy4HYf8P1kT-jW_nmV18ldbk@2.1.8.recipe.yaml 0 directories, 14 files

시스템 서비스

일반적으로 임베디드 Linux 디바이스와 마찬가지로 Greengrass가 시스템 서비스로 설치된 경우 골든 이미지에는 systemd 시작 스크립트가 포함된 디렉터리도 포함되어야 합니다.

도커 이미지

디바이스에서 Docker 이미지를 아티팩트로 사용하는 AWS IoT Greengrass 구성 요소를 사용하는 경우 이러한 아티팩트는 Greengrass 디렉터리 트리 외부에 있습니다. 따라서 골든 이미지에 골든 디바이스의 Docker 이미지 레지스트리를 포함해야 합니다. 이 레지스트리는 일반적으로에 저장됩니다/var/lib/docker.

또는 Docker 명령을 사용하여 골든 디바이스에 저장된 Docker 이미지를 복사한 다음 해당 Docker 이미지를 제조 라인의 각 디바이스에 로드할 수 있습니다. 일반적으로이 방법은 속도가 느리고 도커 이미지 수가 증가함에 따라 확장성이 떨어집니다.

암호

디바이스가 보안 암호 관리자 구성 요소를 사용하여의 보안 암호를 동기화하는 경우 AWS Secrets Manager이러한 보안 암호는 골든 디바이스의 Greengrass 디렉터리 트리에 있는 config/config.tlog 파일에 저장됩니다. 예시:

{"TS":1718878001465, "TP":["services","aws.greengrass.SecretManager","runtime","secretResponse"], "W":"changed", "V":"{\"secrets\":[ { \"arn\":\"arn:aws:secretsmanager:us-east-1:111122223333:secret:greengrass-home-assistant-KIzJfZ\", \"name\":\"greengrass-home-assistant\", \"versionId\":\"8e481177-9250-4458-9f1f-3690d28e4ae9\", \"encryptedSecretString\":\"AgV4j+We ... A7QjdE1w==\", \"versionStages\":[\"AWSCURRENT\"], \"createdDate\":1660648425915 } ] } "}

이러한 보안 암호는 해당 config/effectiveConfig.yaml 파일에도 저장됩니다.

aws.greengrass.SecretManager: componentType: "PLUGIN" configuration: cloudSecrets: - arn: "arn:aws:secretsmanager:us-east-1:111122223333:secret:greengrass-home-assistant-KIzJfZ" dependencies: - "aws.greengrass.Nucleus:SOFT" lifecycle: {} runtime: secretResponse: "{\"secrets\":[{\"arn\":\"arn:aws:secretsmanager:us-east-1:111122223333:secret:greengrass-home-assistant-KIzJfZ\"\ ,\"name\":\"greengrass-home-assistant\",\"versionId\":\"8e481177-9250-4458-9f1f-3690d28e4ae9\"\ ,\"encryptedSecretString\":\"AgV4Rpc9 ... MYeVALYQ==\"\ ,\"versionStages\":[\"AWSCURRENT\"],\"createdDate\":1660648425915}]}" version: "2.1.8"

골든 이미지에 config 디렉터리를 포함하더라도 Greengrass 보안 암호 관리자 구성 요소가 골든 디바이스의 프라이빗 키로 보안 암호를 암호화한다는 점을 기억해야 합니다. 각 디바이스에는 고유한 프라이빗 키가 있으므로 골든 디바이스로 암호화된 키는 프로덕션 디바이스에서 복호화할 수 없습니다.

따라서 프로덕션 디바이스가 골든 디바이스 보안 암호를 잘못 해독하지 않도록 골든 이미지에서 암호화된 보안 암호를 제거하는 것이 좋습니다. 디바이스가 클라우드와 처음 통신하기 전에 디스크에 보안 암호가 없는 경우 애플리케이션 구성 요소가 제대로 작동하거나 적어도 정상적으로 실패해야 합니다.

보안 암호가 엄격한 요구 사항인 경우

조직에서 제조 중에 프로덕션 디바이스를 보안 암호로 채워야 하는 경우 각 프로덕션 디바이스에 보안 암호를 채우려면 프로덕션 라인에 보안 암호 관리자 구성 요소의 동작을 복제하는 스크립트 또는 프로그램이 필요합니다. 이 접근 방식은 복잡하고 보안 암호가 프로덕션 프로그래밍 스테이션의 일반 텍스트에 잠시 보관될 가능성이 있으므로 권장하지 않습니다.