디바이스에 새로운 인증서를 배포하는 방법

  1. 새로운 인증서 생성 및 등록: 이미 앞서 설명한 것처럼 새로운 인증서를 생성하고 AWS IoT에 등록 및 활성화한다.
  2. 새로운 인증서와 키 파일 디바이스에 전달: 새로운 인증서와 프라이빗 키 파일을 디바이스에 전달합니다. 이를 위해 여러 가지 방법을 사용할 수 있다.
  3. 디바이스 소프트웨어 업데이트: 디바이스 소프트웨어를 업데이트하여 새로운 인증서를 사용하도록 구성한다.

1. 새로운 인증서 생성 및 등록

앞서 설명한 방법을 통해 새로운 인증서를 생성하고 AWS IoT에 등록.

2. 새로운 인증서와 키 파일 디바이스에 전달

디바이스에 새로운 인증서와 프라이빗 키 파일을 전달하는 방법

A. 수동 업데이트

디바이스에 물리적으로 접근할 수 있는 경우, USB 드라이브 등을 이용하여 수동으로 파일을 업데이트합니다.

  1. 파일 복사: 새로운 인증서(newDeviceCert.pem)와 프라이빗 키(newDevicePrivateKey.pem) 파일을 USB 드라이브 등에 복사합니다.
  2. 디바이스에 연결: USB 드라이브를 디바이스에 연결하고 파일을 디바이스의 적절한 위치에 복사합니다.

B. OTA(Over-The-Air) 업데이트

디바이스가 원격에서 업데이트를 받을 수 있는 경우, OTA 업데이트를 통해 인증서를 배포할 수 있습니다.

  1. 서버에 파일 업로드: 새로운 인증서와 프라이빗 키 파일을 서버에 업로드합니다.
  2. 디바이스 소프트웨어 업데이트: 디바이스가 서버로부터 새로운 인증서와 키 파일을 다운로드하고, 이를 적용하도록 소프트웨어를 업데이트합니다.

3. 디바이스 소프트웨어 업데이트

디바이스 소프트웨어를 업데이트하여 새로운 인증서를 사용하도록 구성합니다. 디바이스 소프트웨어가 MQTT를 통해 AWS IoT와 통신하는 경우, 보통 다음과 같은 단계를 따릅니다.

예시: Node.js 기반 디바이스 소프트웨어 업데이트

디바이스 소프트웨어가 Node.js 기반이라고 가정하면, 다음과 같은 코드로 새로운 인증서를 적용할 수 있습니다.

const mqtt = require('mqtt');
const fs = require('fs');

// 인증서 및 키 파일 경로
const KEY = fs.readFileSync('path/to/newDevicePrivateKey.pem');
const CERT = fs.readFileSync('path/to/newDeviceCert.pem');
const CA = fs.readFileSync('path/to/AmazonRootCA1.pem'); // AWS 루트 CA

// MQTT 클라이언트 설정
const options = {
    key: KEY,
    cert: CERT,
    ca: CA,
    clientId: 'yourDeviceClientId',
    host: 'your-iot-endpoint',
    port: 8883,
    protocol: 'mqtts'
};

// MQTT 클라이언트 생성
const client = mqtt.connect(options);

client.on('connect', () => {
    console.log('Connected to AWS IoT');
    // 추가 MQTT 핸들러 코드
});

client.on('error', (err) => {
    console.error('Connection error: ', err);
});

예시: C 기반 디바이스 소프트웨어 업데이트

디바이스 소프트웨어가 C 기반이라고 가정하면, 다음과 같이 새로운 인증서를 적용할 수 있습니다.

#include "aws_iot_mqtt_client_interface.h"

// 인증서 및 키 파일 경로
#define AWS_IOT_PRIVATE_KEY_PATH "path/to/newDevicePrivateKey.pem"
#define AWS_IOT_CERTIFICATE_PATH "path/to/newDeviceCert.pem"
#define AWS_IOT_ROOT_CA_PATH "path/to/AmazonRootCA1.pem"

// MQTT 클라이언트 설정
AWS_IoT_Client mqttClient;
IoT_Client_Init_Params mqttInitParams = iotClientInitParamsDefault;
IoT_Client_Connect_Params mqttConnectParams = iotClientConnectParamsDefault;

mqttInitParams.pHostURL = "your-iot-endpoint";
mqttInitParams.port = 8883;
mqttInitParams.pRootCALocation = AWS_IOT_ROOT_CA_PATH;
mqttInitParams.pDeviceCertLocation = AWS_IOT_CERTIFICATE_PATH;
mqttInitParams.pDevicePrivateKeyLocation = AWS_IOT_PRIVATE_KEY_PATH;

// MQTT 클라이언트 초기화 및 연결
rc = aws_iot_mqtt_init(&mqttClient, &mqttInitParams);
if (SUCCESS != rc) {
    printf("aws_iot_mqtt_init returned error : %d ", rc);
    return rc;
}

rc = aws_iot_mqtt_connect(&mqttClient, &mqttConnectParams);
if (SUCCESS != rc) {
    printf("Error(%d) connecting to %s:%d", rc, mqttInitParams.pHostURL, mqttInitParams.port);
    return rc;
}

printf("Connected to AWS IoT\n");
// 추가 MQTT 핸들러 코드

결론

디바이스에 새로운 인증서를 배포하는 과정은 디바이스의 특성에 따라 다르지만, 일반적으로 새로운 인증서를 생성하고, 이를 디바이스에 전달한 후, 디바이스 소프트웨어를 업데이트하여 새로운 인증서를 사용하도록 구성하는 방식으로 진행됩니다. OTA 업데이트를 지원하는 경우, 원격으로 인증서를 배포하는 것이 가장 효율적이다.

Ubuntu 20.04.6 LTS

 

1. 서비스 파일 만들기 

/etc/systemd/system 디렉토리에 파일을 만든다.

 

vi myservice.service

[Unit]
Description=서비스 설명 
Wants=network.target
After=network.target

[Service]
Type=simple
WorkingDirectory=작업디렉토리 /home/ubuntu/myservice
Environment="PATH=/home/ubuntu/.nvm/versions/node/v16.10.0/bin:$PATH"
ExecStart=/opt/conda/envs/pytorch/bin/uvicorn main:app --reload --host=0.0.0.0 --port=8000
Restart=on-failure
RestartSec=3s
StandardOutput=file:/var/log/myservice/log.log
StandardError=file:/var/log/myservice/log.log

[Install]
WantedBy=multi-user.target

 

2. 서비스 등록 및 실행

* 서비스 데몬 재실행

systemctl daemon-reload

 

* 서비스활성화

systemctl enable myservice.service

 

* 서비스 시작

systemctl start myservice.service

 

* 서비스 상태 확인

systemctl status myservice.service

 

3. 트러블슈팅

로그 파일 경로의 디렉토리가 없다면 만들어준다.

 

 

참고 https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html

5년전부터에 AWS Beanstalk으로 돌리던 서버에 유저도 다 떨어지고 Beanstalk의 nodejs 버전도 지원이 중단된 상태가 되었다.

Beanstalk은 하나의 환경마다 LB가 붙어서 비용도 아낄겸 ECS로 옮겼다.

기존에 사용하던 Nodejs 버전이 10.15.3 이라서 Docker에 nodejs:10.15.3으로 올렸다.

오늘 디비도 정리하려고 마이그레이션 해놓고 디비 스트링을 바꾸고 커밋했는데 갑자기 docker 빌드가 안된다.

3일전만해도 됐었는데 말이지. 참 어이가 없어 ㅠㅠ

 

빌드 로그를 보니 nodejs 의존성 모듈중에 apt를 사용해서 설치하는 것이 있는데 apt udpate가 안되는 것이었다.

그런데 docker nodejs 깃헙에 가보니 몇년전부터 발생한 이슈라네? 3일전에는 왜 된거야-_-

 

https://bbs.ruliweb.com/community/board/300779/read/41745001

 

되는데 이유를 모르겠어!!!!!!!!.jpg | (백업)유머 게시판(2018-2020) | 루리웹

되는데 이유를 모르겠어!!!!!!!!.jpg

bbs.ruliweb.com

이분은 뭐하고 계실까?

 

아무튼 그냥 ubuntu에 nvm으로 node 설치하려고 했더니 PATH 때문에 잘 안되더라.

아 귀찮아 진짜!!!

docker ubuntu 에 nvm 사용해서 nodejs 설치하는 방법

#dockerfile
FROM ubuntu

SHELL ["/bin/bash", "--login", "-c"]

ENV NVM_DIR="/root/.nvm"
ENV NODE_VERSION 10.15.3

RUN curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash \
    && . $NVM_DIR/nvm.sh && nvm install $NODE_VERSION

ENV NODE_PATH $NVM_DIR/versions/node/v$NODE_VERSION/lib/node_modules
ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH
RUN node -v
RUN npm -v

 

+ Recent posts