Truck Tracker: OpenShift 및 기타 IBM Cloud 서비스를 사용하는 IoT 패턴
IBM Cloud 서비스를 결합하여 다양한 인사이트 창출
Truck Tracker는 전국을 여행하면서 트럭에서 데이터를 수신하는 서비스입니다. 연료 소비량, 운전자 세부 정보, 주변 온도 등 주행 중 측정할 수 있는 모든 데이터(예: 연료 소비량, 운전자 세부 정보, 주변 온도 등)가 될 수 있습니다. 이 게시의 목적상, 트럭의 ID와 위치가 됩니다(위도/경도). Truck Tracker는 다양한 데이터 저장소에 데이터를 저장하고 지도 상에 트럭의 현재 위치도 표시합니다.
일부 앱 사용자는 분석을 실행하기 위해 이 데이터가 필요합니다. 예를 들어, 지난 24시간 동안 차량이 이동한 마일 수 또는 얼마나 많은 연료를 소비했는지 확인할 수 있습니다. 이를 위해 모든 데이터 점을 IBM Cloudant와 같은 신뢰할 수 있는 문서 저장소에 저장할 수 있을 뿐만 아니라 검색 및 집계할 수 있습니다. IBM Cloudant은(는) 워크로드가 많고 빠르게 증가하는 웹 및 모바일 애플리케이션에 최적화된 완전히 관리되는 분산 데이터베이스입니다.
다른 사용자들도 트럭이 현재 있는 위치를 알아야 할 수 있습니다. 이를 위해서 각 트럭의 마지막으로 알려진 위치만 필요합니다. 이 경우 Redis는 완벽한 솔루션으로 키가 고유한 트럭 ID이고 값은 마지막으로 알려진 위치인 빠른 키-값 저장소입니다.
IBM Cloud® Databases for Redis은(는) 데이터베이스, 캐시 및 메시지 브로커로 사용할 수 있는 완전히 관리되는 인메모리 데이터 구조 저장소입니다.
다른 방법으로 액세스하거나 저장해야 하는 데이터에 대한 아직 알 수 없는 다른 용도가 있을 수 있습니다.
따라서 트럭이 전국을 운행하면서 데이터가 쏟아져 나오고 있습니다. 모든 사람이 필요한 데이터를 얻을 수 있도록 하려면 어떻게 해야 합니까? 이벤트가 발생할 때 이벤트에 반응할 수 있는 스마트 앱을 빌드하는 데 도움이 되는 이벤트 스트리밍 플랫폼인 IBM Event Streams를 입력하십시오. 오픈 소스 Apache Kafka 기반의 완전히 관리되는 서비스입니다.
Event Streams는 트럭(데이터 생성자)의 데이터를 사용한 후 이를 사용하는 다양한 애플리케이션(데이터 이용자)에 데이터를 제공할 수 있습니다.
마지막으로, Truck Tracker 서비스를 실행해야 하며, 이를 위해 Red Hat OpenShift on IBM Cloud를 사용하며 Kubernetes 클러스터에서 엔터프라이즈 워크로드를 컨테이너화하고 배치할 수 있는 빠르고 안전한 방법입니다. Red Hat OpenShift on IBM Cloud 클러스터를 프로비저닝하고, 애플리케이션을 배치하여 액세스가 필요한 데이터베이스 서비스에 사용할 수 있도록 합니다. 또한 지도에서 트럭의 위치를 볼 수 있는 공용 애플리케이션을 만들 것입니다. Red Hat OpenShift on IBM Cloud에 대한 자세한 정보.
구축 항목
구축하려는 상위 레벨 시스템입니다.

실제 시나리오에서는 아마 MQTT 프로토콜을 사용하여 데이터 생성기(트럭의 IoT 디바이스)가 Event Streams 애플리케이션과 통신하는 방법을 찾아야 할 것입니다. "자동차 여행"(LAToDallas.json
및 boulderToNYC.json
)의 사전 정의된 일련의 위도/경도 쌍에서 읽고 이를 Event Streams에 입력하여 트럭 위치를 생성하는 스크립트(producer.js
)를
사용하여 전국을 돌아다니는 트럭을 시뮬레이션하고 데이터를 전송합니다.
이 학습서를 완료하는 데 약 1시간이 소요됩니다. 사용할 IBM 서비스 중 일부가 무료로 제공되지 않기 때문에 서비스가 무료로 제공되지는 않지만, 완료한 후에 서비스를 디프로비저닝하면 몇 달러 정도만 지불하면 됩니다.
필요한 항목
시작하기 전에 필요한 몇 가지 생산성 도구를 설치하는 것이 좋습니다.
- IBM Cloud 종량과금제 계정(계정에 로그인되어 있는지 확인)
- IBM CLI - IBM API와 상호작용하는 명령행 인터페이스. 다음 플러그인이 있는지 확인해야 합니다.
- openshift(oc)
- container registry(cr)
- Mac 또는 Linux 터미널에 액세스할 수 있는지 확인하십시오.
- Kubernetes CLI - Kubernetes 클러스터에 대해 명령을 실행하기 위한 명령행 인터페이스.
- Terraform - 리소스 프로비저닝 자동화
- Docker Docker를 사용하여 클러스터 내에서 코드를 실행할 이미지를 작성합니다. Docker 계정에 로그인했는지 확인하십시오.
- jq - 유연한 경량의 명령행 JSON 프로세서
- Git - 무료로 제공되는 오픈 소스 분산 버전 제어 시스템
- Node.js 및 npm
단계별 지시사항
1단계: 인프라를 사용자 계정에 배치하기 위한 API 키 얻기
이 문서에서 단계를 수행하여 API 키를 작성하고 2단계를 위한 메모를 작성하십시오.
2단계: 저장소를 복제하고 Terraform 디렉토리에 이동
git clone https://github.com/IBM-Cloud/truck-tracker.git
cd truck-tracker/terraform
다음 필드를 사용하여 terraform.tfvars
(이)라는 문서를 작성하십시오.
ibmcloud_api_key = "<YOUR_API_KEY_FROM_STEP_1>"
region = "eu-gb"
redis_password = "<MAKE_UP_A_PASSWORD>"
terraform.tfvars
문서에는 GitHub 저장소에서 무시하도록 비밀로 유지할 수 있는 변수가 포함되어 있습니다.
3단계: 인프라 작성
TL; DR - Terraform 스크립트 실행:
terraform init
terraform apply --auto-approve
Terraform 폴더에는 여러 개의 간단한 스크립트가 포함되어 있습니다.
main.tf
은(는) Terraform에 IBM Cloud를 사용하도록 지시합니다.variables.tf
에는 terraform.tfvars에서 값이 채워지는 변수 정의가 포함되어 있습니다.cloudant.tf
은(는) 나중에 액세스하는 데 사용할 표준 Cloudant DB 및 일부 신임 정보를 작성합니다.redis.tf
은(는) 나중에 액세스하는 데 사용할 Redis 인스턴스 및 일부 신임 정보를 작성합니다.eventstreams.tf
은(는) 나중에 액세스하는 데 사용할 Event Streams 인스턴스 및 일부 신임 정보를 작성합니다.registry.tf
은(는) 컨테이너 이미지를 보유할 Container Registry를 작성합니다.iam.tf
은(는) Container Registry와 상호작용하는 데 필요한 액세스 키를 작성합니다.vpc.tf
은(는) OpenShift 클러스터를 배치하는 데 필요한 VPC(Virtual Private Cloud) 인프라를 작성합니다. 여기에는 세 개의 서로 다른 가용성 영역에 있는 VPC, 서브넷 및 공용 게이트웨이가 포함됩니다.cos.tf
은(는) 클러스터를 관리하기 위해 OpenShift에 필요한 단일 Cloud Object Storage 인스턴스를 작성합니다.openshift.tf
은(는) VPC 내부에 가상 머신 클러스터를 작성하며, 여기서 애플리케이션을 배치합니다.
데이터베이스 및 기타 리소스가 준비되는 데 몇 분이 소요되지만 이제 VPC 리소스, 가상 머신의 클러스터, IBM Cloud® Databases for Redis 인스턴스, Cloudant 데이터베이스 및 계정의 Event Streams 인스턴스와 컨테이너 이미지에 대한 Container Registry 네임스페이스가 있어야 합니다. IBM Cloud 계정의 리소스 섹션을 방문하여 확인할 수 있습니다.
4단계: 컨테이너 이미지 작성 및 OpenShift에 배치
이 시점에서 모든 인프라는 데이터를 수신할 준비가 되어 있습니다. 이제 지도에 트럭 위치를 표시하는 애플리케이션뿐만 아니라 데이터를 생성하고 이용하는 다른 모듈을 구축하고 배치해야 합니다.
빌드 스크립트를 실행하십시오. 그러나 수행하기 전에 IBM Cloud CLI 및 Docker에 로그인되어 있는지 확인하십시오.
프로젝트의 루트로 이동하여 다음을 입력하십시오.
./build.sh
5단계: 운행 중인 트럭 살펴보기
스크립트의 끝에는 다음과 같은 URL이 출력됩니다(https://some.thing.eu-gb.appdomain.cloud).
생성된 URL을 방문하면 미국 지도가 표시되어야 하며, 몇 초 후에는 맵에 트럭을 나타내는 몇 개의 마커가 표시되어야 합니다.

이러한 마커 중 하나를 확대하면 도로를 따라 이동하는 것을 볼 수 있습니다. 이제 차량 관리자는 모든 트럭이 어디에 있는지 알 수 있습니다.

수행한 사항
build.sh 스크립트
build.sh
스크립트는 다음과 같은 여러 가지 작업을 수행합니다.
- 필요한 각 서비스에 대한 Docker 이미지를 빌드합니다. 생성자, 이용자 및 웹 애플리케이션은 모두 다른 폴더에 있습니다. 각 폴더에는 스크립트가 컨테이너 이미지를 작성하기 위해 사용하는 고유한 Dockerfile 파일이 포함되어 있으며, 이 파일은 IBM Container Registry에 업로드됩니다.
- 다양한 IBM 서비스(IBM Cloudant, Redis 및 Event Streams)에 액세스하는 데 필요한 모든 신임 정보를 사용하여 여러 개의 Kubernetes 시크릿을 작성합니다.
deployment.yml
스크립트에 포함된 지시사항을 사용하여 Red Hat OpenShift on IBM Cloud 클러스터에 애플리케이션 코드(및 시크릿)를 배치합니다.
deployment.yml 스크립트
이 스크립트는 Openshift 클러스터에 있는 머신에 배치할 항목을 Openshift에 알립니다. 이 경우 다음과 같습니다.
- 데이터 생성자(
trucktrackerproducer*
). - 데이터 이용자(
trucktrackerredisconsumer
및trucktrackercloudantconsumer
) - 웹 애플리케이션(
trucktrackerweb
)
모든 경우에 컨테이너 레지스트리에서 이미지를 가져와서 외부 서비스에 액세스하는 데 필요한 신임 정보를 사용하여 일부 환경 변수를 작성합니다.
Truck Tracker 시스템
Truck Tracker 시스템은 다음 네 가지 기본 패키지를 사용하는 간단한 Node.js 스크립트 세트입니다.
- @ibm-cloud/cloudant - IBM Cloudant에 연결하고 데이터를 읽거나 씁니다.
- Redis - Redis 인스턴스에 연결하고 데이터를 읽거나 씁니다.
- kafkajs - Event Streams 인스턴스에 연결합니다.
- Express - 데이터와 상호작용할 수 있는 단순 웹 서버를 사용으로 설정합니다.
5개의 기본 파일이 있습니다.
server.js
: 웹 서버를 실행하고 Redis와 통신합니다. 프론트엔드에서 /data 라우트로 정기적으로 호출합니다. Redis에 연결하고 모든 트럭의 ID 및 위치를 사용하여 오브젝트를 다운로드하고 이를 프론트엔드에 리턴합니다.index.html
: 프론트엔드 애플리케이션의 유일한 페이지입니다. 로드되는 경우 Open Street Map 서비스의 미국 지도를 표시합니다. 그런 다음, 백엔드(server.js
)에 대한 HTTP 요청을 작성하는 5초 루프에 있으며 모든 트럭 및 해당 위치를 검색하고 이를 통해 루프를 순환하여 맵에 최신 위치를 표시합니다. 각 트럭에는 모든 주기마다 위도/경도가 업데이트되는 맵 마커가 있습니다.producer.js
: 스크립트 호출에서 위치 파일 및 truck_id를 가져온 후 위치 파일의 모든 데이터 지점을 순환합니다. 각 데이터 지점은 트럭 ID 및 위도/경도가 포함된 메시지로 전환되며 Event Streams에 초당 한 번씩 게시됩니다. 재미를 더하기 위해, 라우트를 따라 무작위 시작점을 선택하고 위치 파일의 끝에 도달하면 다시 돌아옵니다.cloudantConsumer.js
: 이 스크립트는 아직 없는 경우 Cloudant에 trucktracker 데이터베이스를 작성하며 그런 다음 Event Streams를 정기적으로 폴링하여 더 많은 데이터를 수집합니다. 데이터가 들어오면 Cloudant에 대량으로 기록됩니다.redisConsumer.js
: 이 스크립트는 데이터를 수집하기 위해 정기적으로 Event Streams를 폴링합니다. 데이터가 들어오면 Redis "해시"에 기록되며 여기서 해시 키는 트럭 ID이고 해당 값은 트럭 데이터(위도/경도)입니다. 이 해시 배열을 사용하면 모든 트럭 데이터를 server.js 스크립트를 통해 한 번에 풀다운할 수 있습니다. 좋은 점은 몇 가지 이유로 인해 일부 이용자가 충돌하는 경우 Event Streams가 각 이용자에게 제공된 마지막 데이터 지점을 인식하고 있으므로 데이터를 잃지 않고 중지된 위치를 선택할 수 있습니다. 이러한 방식으로 데이터를 이용하는 시스템에서 데이터를 생성하는 시스템을 분리하는 것은 복원성과 결함 허용을 향상시키는 우수한 설계 사례입니다.
요약
본 학습서에서는 트럭의 인터넷 지원 디바이스에서 다양한 용도로 여러 애플리케이션에서 이용할 수 있는 데이터를 생성하는 현실적인 IoT 패턴을 모델링하기 위해 여러 IBM 서비스를 결합했습니다.
애플리케이션 개발자로서 이러한 모든 서비스의 관리 특성 때문에, 비즈니스 문제점을 해결하는 데 집중하고, 인프라 관리를 집중적으로 수행할 수 있으므로, 서버 프로비저닝, 소프트웨어 배치, 패치 적용, 보안 등과 같은 비핵심적인 활동에 대해 잠재적으로 수 개월의 작업을 줄일 수 있습니다.
이 학습서를 수행한 경우 비용이 발생하지 않도록 인프라를 디프로비저닝해야 합니다. 터미널에서 다음을 수행하십시오.
cd terraform/
terraform destroy
개발자 여정의 다음 단계를 수행하려면 평가판 제공의 일부를 확인하십시오.