골든 이미지 프로시저 - AWS 권장 가이드

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

골든 이미지 프로시저

다음 섹션에서는 골든 이미지를 생성하고 프로덕션 라인의 각 디바이스에 해당 이미지를 쓰는 절차를 설명합니다.

골든 디바이스 생성

1단계: Greengrass 설치 및 프로비저닝.

일반적으로와 같이 골든 디바이스에 Greengrass 엣지 런타임을 설치하고 원하는 프로비저닝 방법을 사용하여 프로비저닝합니다.

2단계: 구성 요소를 배포합니다.

클라우드에서 일반적으로와 같이 애플리케이션 구성 요소와 구성을 골든 디바이스에 배포합니다.

골든 디바이스에서 골든 이미지 읽기

이제 골든 디바이스의 스냅샷을 생성하여 골든 이미지를 생성할 수 있습니다.

1단계: Greengrass를 종료합니다.

골든 디바이스에서 Greengrass 서비스를 종료합니다. 예시:

sudo systemctl stop greengrass.service

2단계: Greengrass 파일 트리를 스냅샷합니다.

원하는 골든 메서드에 따라 Greengrass 파일 트리의 전체 또는 부분 스냅샷을 만들어 골든 이미지에 포함합니다.

3단계: 도커 이미지를 복사합니다.

구성 요소가 Docker 이미지를 아티팩트로 사용하는 경우 Docker 이미지 레지스트리의 스냅샷을 만들어 골든 이미지에 포함합니다.

또는 docker save를 사용하여 각 Docker 이미지의 아카이브를 생성하고 골든 디바이스에서 복사할 수 있습니다. 예시:

user@machine:~/environment $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE homeassistant/home-assistant 2024.6 2b4c9de733f1 9 days ago 1.6GB user@machine:~/environment $ docker save homeassistant/home-assistant | gzip > home-assistant.tar.gz

일반적으로이 접근 방식은 골든 이미지에 Docker 이미지 레지스트리를 추가하는 것보다 느립니다.

프로덕션 디바이스에 골든 이미지 쓰기

이제 제조 라인을 통과하는 각 프로덕션 디바이스에 골든 이미지를 작성해야 합니다. 다음 단계는 일반적으로 스크립팅을 사용하여 자동화됩니다.

1단계: 이미지를 작성합니다.

프로덕션 디바이스에 골든 이미지를 씁니다. 해당하는 경우 Greengrass 디렉터리 트리 및 Docker 이미지 레지스트리의 전체 또는 부분 스냅샷이 포함되어 있는지 확인합니다.

2단계: 도커 이미지를 로드합니다.

를 사용하여 골든 디바이스에서 도커 이미지 아티팩트를 docker save 복사하기로 선택한 경우 docker load를 사용하여 이러한 이미지를 프로덕션 디바이스에 로드합니다. 예시:

user@machine:~/environment $ docker load < home-assistant.tar.gz user@machine:~/environment $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE homeassistant/home-assistant 2024.6 2b4c9de733f1 9 days ago 1.6GB

일반적으로이 접근 방식은 골든 이미지에 Docker 이미지 레지스트리를 추가하는 것보다 느립니다.

3단계: 자격 증명을 추가합니다.

디바이스가 플릿 프로비저닝을 사용하지 않는 경우 프로덕션 디바이스에 고유한 X.509 인증서와 프라이빗 키를 설치하여 골든 디바이스 자격 증명을 교체합니다. 이를 달성하는 정확한 방법은 하드웨어 보안 모듈(HSM)과 특정 퍼블릭 키 인프라(PKI)를 사용하는지 여부에 따라 달라집니다.

프로덕션 디바이스 구성

골든 이미지를 작성한 후에는 각 프로덕션 디바이스를 구성해야 합니다. 이 구성은 전체 또는 부분 Greengrass 스냅샷 메서드를 사용하는지 여부에 따라 달라집니다. 단계는 자동화되어야 합니다.

전체 Greengrass 스냅샷 메서드

중요

전체 Greengrass 스냅샷 방법을 사용하는 경우에만 다음 단계를 따르세요.

1단계: 구성을 편집합니다.

config/effectiveConfig.yaml 파일을 편집합니다. 예시:

sudo nano /greengrass/v2/config/effectiveConfig.yaml

2단계: 사물 이름을 설정합니다.

새 프로덕션 디바이스의 사물 이름을 설정하는 데 필요한 작업은 플릿 프로비저닝을 사용하는지 여부에 따라 달라집니다. 사용 사례에 맞게 올바르게 수정합니다.

플릿 프로비저닝을 사용하지 않는 경우 thingName 속성을 편집하여 골든 디바이스 사물 이름을 프로덕션 디바이스 사물 이름으로 대체하여 프로덕션 디바이스의 사물 이름을 설정할 수 있습니다. 예시:

system: certificateFilePath: "/greengrass/v2/thingCert.crt" privateKeyPath: "/greengrass/v2/privKey.key" rootCaPath: "/greengrass/v2/rootCA.pem" rootpath: "/greengrass/v2" thingName: "ProductionDeviceThingName1"

플릿 프로비저닝을 사용하는 경우 먼저 골든 디바이스 구성의 일부를 삭제하여 플릿 프로비저닝 플러그인이 프로덕션 디바이스에서 실행되도록 해야 합니다. thingName 속성의 골든 디바이스 사물 이름을 빈 문자열로 바꾸면 됩니다. 예시:

system: certificateFilePath: "/greengrass/v2/thingCert.crt" privateKeyPath: "/greengrass/v2/privKey.key" rootCaPath: "/greengrass/v2/rootCA.pem" rootpath: "/greengrass/v2" thingName: ""

또한 플릿 프로비저닝 플러그인 구성을 services 속성에 추가하고 프로덕션 디바이스 사물 이름을 templateParameters 속성 내의 속성으로 전달해야 합니다. 다음 예제에서는 플릿 프로비저닝 템플릿에 라는 파라미터가 ThingName있으므로 플러그인 구성templateParameters의 내에 ThingName 속성이 있다고 가정합니다.

system: certificateFilePath: "/greengrass/v2/thingCert.crt" privateKeyPath: "/greengrass/v2/privKey.key" rootCaPath: "/greengrass/v2/rootCA.pem" rootpath: "/greengrass/v2" thingName: "" services: aws.greengrass.FleetProvisioningByClaim: configuration: rootPath: "/greengrass/v2" awsRegion: "us-east-1" iotDataEndpoint: "<prefix>-ats.iot.us-east-1.amazonaws.com" iotCredentialEndpoint: "<prefix>.credentials.iot.us-east-1.amazonaws.com" iotRoleAlias: "GreengrassCoreTokenExchangeRoleAlias" provisioningTemplate: "GreengrassFleetProvisioningTemplate" claimCertificatePath: "/greengrass/v2/claim-certs/claim.pem.crt" claimCertificatePrivateKeyPath: "/greengrass/v2/claim-certs/claim.private.pem.key" rootCaPath: "/greengrass/v2/rootCA.pem" templateParameters: ThingName: "ProductionDeviceThingName1"

사용 사례에는 여기에 표시된 것과 다른 플릿 프로비저닝 플러그인 구성 파라미터가 필요할 수 있습니다. 자세한 내용은 AWS IoT Greengrass 설명서의 AWS IoT 플릿 프로비저닝 플러그인 구성을 참조하세요.

3단계: 보간된 사물 이름을 업데이트합니다.

iot:thingName 레시피 변수를 사용하여 사물 이름을 보간하는 구성 요소가 있는 경우 골든 디바이스 사물 이름이 보간된 액세스 제어 문이 있을 수 있습니다. 예를 들어 Certificate Rotator 커뮤니티 구성 요소의 경우:

services: aws.greengrass.labs.CertificateRotator: componentType: "GENERIC" configuration: accessControl: aws.greengrass.ipc.mqttproxy: aws.greengrass.labs.CertificateRotator:mqttproxy:1: operations: - "aws.greengrass#PublishToIoTCore" policyDescription: "Allows access to publish to relevant topics" resources: - "$aws/things/GoldenDeviceThingName/jobs/+/get" - "$aws/things/GoldenDeviceThingName/jobs/+/update" - "awslabs/things/GoldenDeviceThingName/certificate/create" - "awslabs/things/GoldenDeviceThingName/certificate/commit" aws.greengrass.labs.CertificateRotator:mqttproxy:2: operations: - "aws.greengrass#SubscribeToIoTCore" policyDescription: "Allows access to subscribe to relevant topics" resources: - "$aws/things/GoldenDeviceThingName/jobs/notify-next" - "$aws/things/GoldenDeviceThingName/jobs/+/get/accepted" - "$aws/things/GoldenDeviceThingName/jobs/+/get/rejected" - "$aws/things/GoldenDeviceThingName/jobs/+/update/accepted" - "$aws/things/GoldenDeviceThingName/jobs/+/update/rejected" - "awslabs/things/GoldenDeviceThingName/certificate/create/accepted" - "awslabs/things/GoldenDeviceThingName/certificate/create/rejected" - "awslabs/things/GoldenDeviceThingName/certificate/commit/accepted" - "awslabs/things/GoldenDeviceThingName/certificate/commit/rejected" keyAlgorithm: "RSA-2048" signingAlgorithm: "SHA256WITHRSA"

이러한 모든 경우 골든 디바이스 사물 이름의 모든 인스턴스를 프로덕션 디바이스 사물 이름으로 바꿔야 합니다.

4단계: 골든 디바이스 보안 암호를 제거합니다.

골든 디바이스에 저장된 암호화된 보안 암호가 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"

프로덕션 디바이스가 골든 디바이스로 암호화된 보안 암호를 해독하려고 시도하지 않도록 하려면이 보안 암호를 삭제해야 합니다. secretResponse 속성을 삭제합니다. 예시:

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: version: "2.1.8"

5단계: 변경된 구성을 적용합니다.

변경된 구성을 적용하여를 업데이트합니다config/config.tlog. 예시:

sudo java -Droot="/greengrass/v2" \ -jar /greengrass/v2/alts/current/distro/lib/Greengrass.jar \ --start false \ --init-config /greengrass/v2/config/effectiveConfig.yaml

부분 Greengrass 스냅샷 메서드

부분 Greengrass 스냅샷 방법을 사용하는 경우 프로덕션 디바이스의 구성은 매우 간단합니다. 절차는 Greengrass를 설치할 때 일반 부트스트랩 부분 구성 절차와 동일합니다. 단, 초기 구성은 이미 설치된 Greengrass 런타임으로 전달됩니다.

중요

부분 Greengrass 스냅샷 메서드를 사용하는 경우에만 다음 단계를 따르세요.

1단계: 구성을 생성합니다.

필요한 부분 구성은 플릿 프로비저닝을 사용하는지 여부에 따라 달라집니다. 사용 사례에 맞게 올바르게 수정해야 합니다.

플릿 프로비저닝을 사용하지 않는 경우 플릿 프로비저닝 플러그인에 대한 구성을 포함하지 않는 부분 구성 파일을 생성할 수 있습니다. thingName 속성을 프로덕션 디바이스 사물 이름으로 설정합니다. 예시:

system: certificateFilePath: "/greengrass/v2/device.pem.crt" privateKeyPath: "/greengrass/v2/private.pem.key" rootCaPath: "/greengrass/v2/AmazonRootCA1.pem" rootpath: "/greengrass/v2" thingName: "ProductionDeviceThingName1" services: aws.greengrass.Nucleus: componentType: "NUCLEUS" version: "2.12.6" configuration: awsRegion: "us-east-1" iotRoleAlias: "GreengrassCoreTokenExchangeRoleAlias" iotDataEndpoint: "<prefix>-ats.iot.us-east-1.amazonaws.com" iotCredEndpoint: "<prefix>.credentials.iot.us-east-1.amazonaws.com"

플릿 프로비저닝을 사용하는 경우 부분 구성에는 플릿 프로비저닝 플러그인에 대한 구성이 포함되어야 합니다. 이 구성은 프로덕션 디바이스 사물 이름을 속성 내의 templateParameters 속성으로 전달해야 합니다. 다음 예제에서는 플릿 프로비저닝 템플릿에 라는 파라미터가 ThingName있으므로 플러그인 구성templateParameters의 내에 ThingName 속성이 있다고 가정합니다.

services: aws.greengrass.Nucleus: version: "2.12.6" aws.greengrass.FleetProvisioningByClaim: configuration: rootPath: "/greengrass/v2" awsRegion: "us-east-1" iotDataEndpoint: "<prefix>-ats.iot.us-east-1.amazonaws.com" iotCredentialEndpoint: "<prefix>.credentials.iot.us-east-1.amazonaws.com" iotRoleAlias: "GreengrassCoreTokenExchangeRoleAlias" provisioningTemplate: "GreengrassFleetProvisioningTemplate" claimCertificatePath: "/greengrass/v2/claim-certs/claim.pem.crt" claimCertificatePrivateKeyPath: "/greengrass/v2/claim-certs/claim.private.pem.key" rootCaPath: "/greengrass/v2/AmazonRootCA1.pem" templateParameters: ThingName: "ProductionDeviceThingName1"

사용 사례에는 여기에 표시된 것과 다른 플릿 프로비저닝 플러그인 구성 파라미터가 필요할 수 있습니다. 자세한 내용은 AWS IoT Greengrass 설명서의 AWS IoT 플릿 프로비저닝 플러그인 구성을 참조하세요.

2단계: 구성을 적용합니다.

구성을 적용하여를 생성합니다config/config.tlog. 예시:

sudo java -Droot="/greengrass/v2" \ -jar /greengrass/v2/alts/current/distro/lib/Greengrass.jar \ --start false \ --init-config config.yaml