GitOps 이해하기

마지막 업데이트: 2022년 4월 28일 | 0개 댓글
  • 네이버 블로그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 트위터 공유하기
  • 카카오스토리 공유하기
▲ Pull Type

범위 바이너리 옵션 타입

Blob(Binary Large Object)

JavaScrpt에서 Blob(Binary Large Object)은 이미지, 사운드, 비디오와 같은 멀티미디어 데이터를 다룰 때 사용한다.

보통 데이터의 크기(Byte) 및 MIME 타입을 알아내거나, 데이터 송수신을 위한 작은 Blob 객체로 나누는 등의 작업에 사용한다.

Blob 생성

const newBlob = new Blob(array, options);

* array

Blob 생성자의 첫번째 인수로 ArrayBuffer, ArrayBufferView, Blob(file), DomString 객체 또는 이러한 객체가 혼합된 Array를 사용할 수 있습니다.

* options

옵션으로는 type 과 endings 를 설정할 수 있다.

type : 데이터의 MIME 타입을 설정하며, 기본값은 "" 입니다.

endings : \n 을 포함하는 문자열 처리를 "transparent" 와 "native" 로 지정할 수 있으며,

기본값은 "transparent" 입니다.

Methods

Blob 객체에서 사용할 수 있는 slice 메소드는 지정된 바이트 범위의 데이터를 포함하는 새로운 Blob 객체를 만드는데 사용된다.

10MB 이상 사이즈가 큰 Blob 객체를 작게 조각내어 사용할 때 유용하다.

const blob = new Blob();

blob.slice(start, end, type);

start : 시작 범위(Byte, Number)

end : 종료 범위(Byte, Number)

type : 새로운 Blob 객체의 MIME 타입을 지정

데브옵스의 확장 모델 – 깃옵스(GitOps) 이해하기

데브옵스 개념이 등장한 지 10년이 흐른 지금, 가치를 따지는 것은 무의미한 일이 되었습니다. 그 동안 축적된 긍정적인 결과들은 데브옵스를 더이상 유행이 아니라 소프트웨어 개발과 운영에 꼭 필요한 표준의 영역으로 이끌었습니다.

개인적으로 데브옵스가 널리 사랑 받게 된 이유는 커다란 목표와 원칙을 공유할 뿐 상세한 규칙이나 절차는 비어 있다는 점, 즉 유연성과 확장성에 있다고 생각합니다. 이는 급변하는 시장에서 살아 남을 수 있는 원동력이 되었고 지금도 여러가지 방식으로 또 데브섹옵스(DevSecOps), 깃옵스(GitOps), AI옵스(AIOps) 등의 다양한 이름으로 진화를 계속해 나가고 있습니다.

이들 중에서 개인적으로 많은 공감을 하였고 최근에 진행한 프로젝트에 직접 적용해 본 “깃옵스(GitOps)”에 대해 설명드리고자 합니다. 깃옵스의 기본 원칙과 패턴에 대해 알아본 다음 구현체 중 하나인 아르고CD(ArgoCD)를 활용하여 샘플 프로젝트에 적용하는 과정을 보여 드리겠습니다.

깃옵스는 위브웍스(Weaveworks Inc.)에서 처음 사용한 용어로 프로젝트에 데브옵스를 적용하는 실천 방법 중 하나입니다. 그 중에서도 클라우드 네이티브 애플리케이션을 대상으로 한 지속적 배포(Continuous Deployment)에 초점을 두고 있습니다.

※ 클라우드 네이티브 애플리케이션이 아니어도 깃옵스를 적용할 수 있으나 아래에서 설명드릴 선언형 모델(Declarative Model)을 지원하는 최근 도구들이 클라우드 네이티브에 중점을 두기 때문에 어려움을 겪을 수 있습니다. 위브웍스는 아예 쿠버네티스 대상이라고 못박고 있습니다.

이름에서 나타나듯 애플리케이션의 배포와 운영에 관련된 모든 요소를 코드화하여 깃(Git)에서 관리(Ops)하는 것이 깃옵스의 핵심입니다. 기본 개념은 코드를 이용하여 인프라를 프로비저닝 하고 관리하는 IaC(Infrastructure as Code)에서 나온 것으로 깃옵스는 이를 인프라에서 전체 애플리케이션 범위로 확장하였습니다.

Guide to GitOps은 DEV,VCS code base, CI, Container Registry, Confic repo의 과정으로이루어진다.

▲Guide to GitOps

깃옵스의 핵심 아이디어는 다음과 같습니다.

1) 배포에 관련된 모든 것을 선언형 기술서(Declarative Descriptions) 형태로 작성하여 Config Repository(혹은 Environment Repository)에서 관리한다.
2) Config Repository의 선언형 기술서와 운영 환경 간 상태 차이가 없도록 유지시켜주는 자동화 시스템을 구성한다.

깃옵스 환경에서 새로운 버전의 애플리케이션을 배포하거나 기존의 운영 환경을 바꾸고 싶다면 선언형 기술서를 수정한 뒤 Config Repository에 반영하기만 하면 됩니다. 나머지 과정은 자동화된 시스템이 알아서 수행할 것입니다.

깃옵스를 움직이는 핵심 개념들

1) 선언형 모델(Declarative Model)

여러분이 원격에 위치한 대상(서버)에 작업(애플리케이션 배포, 설정 관리 등)을 자동화 한다고 했을 때 가장 먼저 떠오르는 방법은 명령어를 순서대로 나열하는 명령형 모델(Imperative Model)일 것입니다.
“ssh로 접속 → cd로 이동 → mkdir로 디렉토리 생성”

간단한 방법인 만큼 단점도 명확합니다. 우선 예외 상황을 모두 관리(이미 디렉토리가 존재한다면? 권한은? 등)해야 하며 원격 대상에 대한 지식(OS 종류에 따른 명령어 차이 등)도 필요합니다.
다른 방법으로 선언형 모델이 있습니다. 대상이 무엇이 되어야 하는지만 기술하면 됩니다. 이해 하기 쉽도록 예를 들어 보겠습니다.

원격 서버에 ‘/etc/some_directory’ 디렉토리가 필요한 상황입니다. 선언형 모델에서는 아래와 같이 코드 형태로 세부 내용을 작성하기만 하면 됩니다.

- name: Create a directory if it does not exist
file:
path: /etc/some_directory
state: directory
(https://docs.ansible.com/ansible/latest/collections/ansible/builtin/file_module.html)

디렉토리가 이미 존재하는지 확인하거나 OS에 따라 바뀌는 명령어를 사용자가 알아야 할 필요가 없습니다. 이는 선언형 모델 구현체의 몫입니다. 이 중 가장 대표적인 것이 쿠버네티스이며 깃옵스와도 궁합이 잘 맞습니다. 무엇보다도 가장 큰 장점은 인프라를 포함한 애플리케이션 배포와 운영에 관련된 모든 것을 코드로 관리할 수 있다는 점과 이 코드를 이용하여 언제든 똑같은 환경을 다시 만들어내거나 부분 소실 시 복원할 수 있다는 점입니다.

2) 단일 진실 공급원(Single Source Of Truth, SSOT)

같은 데이터가 여러 곳에 있을 경우 문제를 일으킬 수 있습니다. 데이터의 중복은 당연하고 수정 시 한 곳이라도 빠지게 된다면 비정합성까지 발생합니다. 때문에 한 곳에 두고 관리하고 다른 곳에서 필요 시 참조만 하도록 하여 문제를 해결합니다.

대표적으로 데이터 정규화 작업에 이용됩니다. 예를 들어 보겠습니다. “Employee”와 “Employees' Skills” 테이블이 있습니다. 각 레코드들은 Employee Name, Employee Email 정보를 중복해서 포함 하고 있습니다. ‘Tom’의 이메일 주소가 변경되었습니다. 여러 개의 테이블의 레코드를 수정해야 합니다만 하나라도 수정이 이루어지지 않을 경우 모순 상태가 됩니다. 조회하는 테이블에 따라 ‘Tom’ 이메일이 다르게 조회되기 때문입니다.

[Employee] Table
employee_name employee_email
———————————————
Jack [email protected]
Tom [email protected]

[Employees' Skills] Table
employee_name employee_email skill
——————————————————————
Jack [email protected] Typing
Tom [email protected] Speaking ← 수정 실패

이런 경우 “Employees’ Skills” 테이블에서 Employee Email을 제거하고 employee_name를 이용해 “Employee” 테이블을 참조하도록 합니다. Employee Email 정보는 오직 “Employee”라는 하나의 테이블에서만 관리하도록 하는 것입니다.

깃옵스에서도 마찬가지입니다. 깃을 단일 진실 공급원으로 지정하고 오직 이 곳에서만 관리하도록 합니다. 모든 운영 활동의 시작은 깃이므로 사람 GitOps 이해하기 혹은 시스템 간의 혼선을 최소화 할 수 있습니다. 그리고 개발 단계에서만 누릴 수 있었던 깃의 강력하고 익숙한 기능을 운영 단계에서도 활용할 수 있게 됩니다. (History, Commit, Merge Request/ Review, Revert 등)

깃옵스 구현

실제로 깃옵스를 프로젝트에 적용할 때 고려해야 할 점들을 알아보겠습니다. 깃옵스는 어디까지나 방법론이기 때문에 정해진 도구가 따로 없습니다. 각자 익숙한 도구를 이용하면 됩니다.
그리고 깃옵스는 빌드와 테스트가 끝난 바이너리(이미지)를 저장소에 등록한 이후의 단계를 다루고 있기 때문에 지속적 통합(Continuous Integration) 부분은 생략하겠습니다.

1) 저장소 전략

최소 2개 이상의 Git 저장소를 사용하는 것을 권장합니다.
• 애플리케이션 저장소: 애플리케이션 소스 코드와 애플리케이션 배포를 위한 배포 매니페스트(예: kubernetes yaml)를 포함합니다.
• 배포 환경 구성 저장소: 배포 환경에 대한 모든 매니페스트를 포함합니다. 애플리케이션과 인프라 서비스(모니터링, 메시지 브로커 등)가 어떤 버전으로 어떻게 구성되어야 하는지에 대한 정보가 들어있습니다.

애플리케이션 배포 매니페스트를 별도의 깃 저장소에 보관해도 되고 템플릿 형태로만 가지고 있다가 배포 시 배포 환경 구성 저장소와 합쳐서 매니페스트를 생성하는 방식으로도 사용이 가능합니다.

2) 배포 전략

깃옵스에서는 푸시 타입(Push Type)과 풀 타입(Pull Type), 두 가지의 배포 전략을 가이드 하고 있습니다. 두 옵션 간의 차이점은 저장소에 있는 매니페스트와 배포 환경의 상태를 일치시키는 방법입니다. 무엇을 선택해도 상관없으나 깃옵스는 보안상의 이유로 풀 타입 배포 전략을 권장하고 있습니다. 각각에 대해 간략히 알아보겠습니다.

Push Type의 상세 과정에 대한 설명

▲ Push Type

■ 푸시 타입(Push Type)
저장소에 있는 매니페스트가 변경되었을 때 배포 파이프라인을 실행시키는 구조입니다. 아키텍처가 단순하여 인기 있는 방법이며 젠킨스(Jenkins), 서클CI(CircleCI) 등의 구현에 사용할 수 있는 도구들도 다양합니다. 가장 큰 특징으로 배포 환경(Environment)의 개수에 영향을 받지 않습니다. 접속 정보를 추가하거나 수정하는 것만으로도 간단하게 배포 환경을 추가하거나 변경할 수 있습니다.

그러나 항상 연결되어 있는 상태가 아니라서 실제 배포 작업이 수행되는 시점에 실패할 수도 있습니다. 그리고 배포 환경이 손상되어 배포 환경 구성 저장소의 내용과 다를 경우 차이를 감지하고 배포 파이프라인을 다시 실행시키거나 알림을 줄 수 있는 별도의 모니터링 시스템이 필요합니다.

Pull Type의 상세 과정에 대한 설명

▲ Pull Type

■ 풀 타입(Pull Type)
배포 환경에 위치한 별도의 오퍼레이터가 배포 파이프라인을 대신합니다. 이 오퍼레이터는 저장소의 매니페스트와 배포 환경을 지속적으로 비교하다가 차이가 발생할 경우 저장소의 매니페스트를 기준으로 배포 환경을 유지시켜 줍니다. 만약 GitOps 이해하기 누군가가 직접 손으로(허가 받지 않은 작업) 배포 환경을 변경했을 때도 다시 되돌려지게 되는데 이는 배포 환경의 변경은 저장소의 매니페스트를 통해서만 유효하다는 것을 보장해줍니다. 다시 말해 배포 환경에 대한 모든 이력은 배포 환경 구성 저장소 즉, 깃에 존재한다는 것을 의미합니다. 이런 방식을 지원하는 도구로는 아르고CD, 젠킨스X(JenkinsX), 그리고 깃옵스라는 용어를 만든 위브웍스에서 제작한 플럭스(Flux)가 있습니다.

앞에서 보안상의 이유로 깃옵스는 풀 타입 배포 전략을 권장한다고 언급했습니다. 이는 구조적 차이에서 발생하는 것으로 푸시 타입의 경우 배포 환경에 대한 자격 증명 정보를 외부에서 관리할 수 밖에 없습니다. 배포 환경 입장에서는 배포 파이프라인 자체가 외부 도메인이기 때문입니다. 그리고 일반적으로 배포 파이프라인에게 배포 환경에 대한 읽기?쓰기 권한을 부여하기 때문에 만의 하나 노출된다면 큰 피해를 볼 수도 있습니다.

반면 풀 타입의 경우 오퍼레이터가 애플리케이션과 동일한 환경에서 동작 중이어서 자격 증명 정보가 외부에 노출될 일이 없습니다. 그리고 배포 환경에 대한 자격 증명 정보도 오퍼레이터 관리를 위한 최소한의 인력으로 한정 지을 수 있습니다. 신경 써야 할 것은 배포 환경에서 깃 저장소와 이미지 저장소로의 접근 정도입니다.

깃옵스 장점

배포 빈도 및 속도 상승, 생산성 향상, 오류 감소 등 여러 장점들이 있지만 이들 대부분은 다른 데브옵스 구현 방법을 사용해서도 달성할 수 있는 것들입니다. 그렇기 때문에 깃옵스만의 장점을 설명드리겠습니다.

1) 신뢰할 수 있는 정보의 공유

“스테이지 환경에 배포된 A 서비스의 설정 값이 뭐지?”
필자가 개발과 운영을 하던 당시 적지 않게 묻고 대답했던 것 같습니다. 적어도 깃옵스를 사용한다면 누군가의 희미한 기억에 의존하거나 제때 업데이트를 하고 있는지 파악하기 위해 문서를 찾아 본다거나 직접 서버에 접속하기 위해 힘겹게 ssh 명령어를 입력할 필요가 없습니다. 깃 이력을 보면 현재 상태는 물론 누가, 언제, 왜, 어느 곳을 수정했는지 쉽게 알 수 있기 때문입니다. 지금까지의 모든 이력을 포함하고 있는 이 시스템은 부가적인 문서 작업을 없애는 좋은 수단이기도 합니다.

※ 에러 복구 시간 감소
새롭게 서비스를 배포했는데 장애가 발생했을 때 해야 할 일은 ‘git revert’ 명령어, 그리고 배포 환경이 이전 버전으로 롤백될 때까지 기다리는 것입니다.

2) 익숙한 절차

“git commit → push → merge request → review → merge”
개발자에게 굉장히 익숙한 절차입니다. 그렇기 때문에 애플리케이션 배포를 위한 별도의 절차를 만들거나 교육시킬 필요가 없습니다. 그리고 리뷰 절차를 통해 휴먼 에러를 조기에 발견하고 책임을 나눌 수 있습니다.

GitOps 적용

풀 타입 구현체 중 하나인 아르고CD를 이용하여 깃옵스 시스템을 구축하겠습니다.
그리고 저장소에 있는 배포 관련 디스크립션을 수정했을 때 아르고CD가 배포 환경(Kubernetes)에 변경 사항을 잘 반영하는지도 확인해 보겠습니다.

1) Config Repo 생성

깃허브(GitHub)에 개인 프로젝트를 생성하고 쿠버네티스용 디스크립션을 작성합니다.

# example/nginx_deploy.yaml at main · iwin100/example (github.com)
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
. . .

2) 애플리케이션 생성

아르고CD 실행화면

이제 아르고CD에게 일을 시켜보겠습니다. 로그인 후 왼쪽 상단의 “+NEW APP” 혹은 중앙의 “CREATE APPLICATION” 클릭 하고 생성에 필요한 정보를 입력 합니다.

표 1. 광의의 기준정보 유형 및 주요 특징
Application Name 아르고CD 에서 사용할 애플리케이션 이름입니다
Project 애플리케이션들을 구분하고 관리하기 위한 논리적 그룹입니다. 프로젝트 단위로 배포 환경에 대한 권한이나 사용할 수 있는 자원들(Cluster, Namespace, Source 등)을 허용하거나 제한할 수 있습니다.
SYNC POLICY
(Manual | Automatic)
깃에 정의된 디스크립션과 배포 환경을 비교하고 유지하는 작업을 주기적(3초)으로 수행할 지, 수동으로 수행할 지를 선택합니다.
Repository URL 깃 저장소 주소입니다.
Revision 리비전 정보입니다. 브랜치명 이외에 태그도 가능합니다.
Path 깃 저장소 내에 디스크립션이 위치한 디렉토리 정보를 입력합니다.
Cluster Url 아르고CD와 동일한 환경에 배포하려면“https://kubernetes.default.svc”를 입력합니다. 다른 클러스터에 배포할 수 있습니다.
Namespace 쿠버네티스 namespace 정보입니다.

작성 후 “Create” 버튼을 누르면 내부적인 검증 작업을 거친 뒤 신규 애플리케이션이 생성되며, SYNC POLICY 값을 Automatic으로 설정했다면 아래처럼 배포까지 진행됩니다.

아르고CD 실행화면

애플리케이션 카드를 클릭하면 아래와 같이 각각의 쿠버네티스 리소스에 대한 정보는 물론 동작 상태에 대한 상세 정보가 제공됩니다.

아르고CD 실행화면

3) 감시 기능 확인

마지막으로 아르고CD의 감시 기능이 제대로 동작하는지 확인하기 위해 깃에서 Deployment-replicas 값을 1에서 2로 수정하고 커밋하겠습니다.

아르고CD 실행화면

잠시 후 아르고CD에서 “nginx-deployment” pod가 두 개로 늘어난 것을 확인할 수 있습니다.

아르고CD 실행화면

데브섹옵스, 깃옵스, AI옵스 등 데브옵스를 확장하거나 특정 기술 혹은 업무에 특화된 모델들이 몇 해 전부터 등장하고 있습니다. 이는 데브옵스가 도입기를 넘어 모델의 다양성이 가속화 되는 성장기 혹은 그 다음 단계로 진입했음을 보여주는 것이라고 생각합니다.

깃옵스도 지금까지 소개된 많은 모델 중 하나지만 대상과 장점이 아주 명확합니다. 그렇기 때문에 클라우드 네이티브 대상, 그 중에서도 쿠버네티스로의 배포를 고려 중이거나 보안에 민감하여 권한과 정보를 엄격하게 관리하는 프로젝트일 경우 깃옵스는 좋은 선택지가 될 것입니다.

새롭게 데브옵스 환경을 구축할 계획을 가지고 있거나 기존의 것이 아쉬운 개발자 분들에게 본 아티클이 조금이나마 도움이 되기를 바랍니다.

▶ 해당 콘텐츠는 저작권법에 의하여 보호받는 저작물로 기고자에게 저작권이 있습니다.
▶ 해당 콘텐츠는 사전 동의 없이 2차 가공 및 영리적인 이용을 금하고 있습니다.

톡상담

검색

본 자료는 개발하시는데 참고자료 용도로 사용하실 수 있으며 저작권 표시 없이 복사,게재, 출판 하실 수 없습니다. 외부 게재 사용 시 반드시 출처 항목에 회사명과 사이트 주소를 반드시 명시해 주시기 바랍니다.
[표기 예] 출처 : ㈜에이치앤에스(www.hnsts.co.kr) 또는 ㈜HNS(www.hnsts.co.kr)

2. 제품 개발 시 내용과 예제 코드는 수정 및 검증작업을 직접 하셔야 하며 문제 발생에 대한 책임은 ㈜HNS사와 무관합니다.

본사는 자료를 최신내용으로 유지하기 위해 노력하고 있으며 제공되는 정보의 오류 및 내용이 정확하지 않을 경우 사전 공지 없이 업데이트 될 수 있습니다. 자료의 문제점 발견 시 본사로 문의주시면 검토하여 자료를 수정하도록 하겠습니다.

본 문서는
1. 바이너리(Binary) 데이터 타입과 텍스트(Text) 데이터 타입의 차이
2. 데이터 전송을 위한 변환 과정
3. 485통신 모드버스 예제 소스 코드
4. Encoding과 Decoding 구현 예제(SmartSerialPort 사용)
순서로 진행합니다.

다양한 통신 환경에서 데이터 송신 시 데이터를 전송하기 전에 데이터의 인코딩(원데이터→바이트 배열)이 필요하며 데이터 수신 시 수신한 데이터를 원본 데이터로 되돌리는 처리인 디코딩(바이트 배열→원데이터)이 필요합니다. 데이터 인코딩/디코딩 방식에 따라 데이터 타입이 Binary 데이터 타입 또는 Text 데이터 타입으로 나뉩니다.

바이너리(Binary) 데이터 타입 텍스트(Text) 데이터 타입
Binary 데이터 타입은 데이터를 이진화하여 전송하며 Text 타입에 비해 훨씬 적은 공간을 차지하고, 인코딩/디코딩 속도가 빠릅니다. 하지만 이진 데이터이므로 가독성이 떨어지고 관리 및 디버깅이 어렵습니다. Text 데이터 타입은 데이터를 ASCII, Unicode 등의 Text로 처리하여 전송하는 방식으로 인간이 이해할 수 있는 언어를 사용하기 때문에 가독성이 높고 관리 및 디버깅이 쉽습니다. 하지만 Binary 타입에 비해 많은 공간을 요구하고 인코딩/디코딩 속도가 느립니다.

예를 들어 32비트 부동 소수점값 IEEE754 형식의 데이터 0x40490FDB를 전송하려면, Binary 데이터 타입의 경우 4바이트의 크기지만 Text 데이터 타입의 경우 3.1415927를 전송해야 하므로 ASCII의 경우 9바이트 크기가 됩니다.(Unicode의 경우 18Byte)

일반적으로 데이터를 전송하기 위해 Binary화하여 처리하게 됩니다. 아래는 GitOps 이해하기 Binary Data의 인코딩 및 디코딩 처리에 관한 설명입니다.

private void Form1_Load( object sender, EventArgs e)

StructureData sd1 = new StructureData ();
sd1.iA = 50;
sd1.fB = 77.77777f;
sd1.sC = "ABCDE" ;

// Unicode라서 *2해줌
sd1.byLength = ( byte )( sd1.sC.Length * 2);

// 전송 데이터(구조체 타입)
// "ABCDE"가 Unicode라서 10 더해줌
byte [] byteRAW = new byte [4 + 4 + 1 + 10];

// 디코딩(BYTE[] → 원데이터 변환)
// Buffer.BlockCopy는 특정 오프셋에서 시작하는 소스 배열에서 특정 오프셋에서 시작하는 대상 배열로 지정된 바이트 수를 복사
System.Buffer.BlockCopy( BitConverter .GetBytes(te.iA), 0, byteRAW, 0, sizeof( int ));
System.Buffer.BlockCopy( BitConverter .GetBytes(te.fB), 0, byteRAW, sizeof ( int ), sizeof ( float ));

// C나 C++의 경우 문자열의 끝을 NULL문자를 확인하여 구분하지만 C#의 경우 문자열의 앞부분에 문자열의 길이를 명시해야 함

// Unicode라서 *2해줌
System.Buffer.BlockCopy( Encoding .Unicode.GetBytes(sd1.sC),
0, byteRAW, sizeof ( int ) + sizeof ( float ) + sizeof ( byte ),
(sd1.sC.Length * 2));

// 인코딩(원데이터 → 바이트 배열 변환). 리턴 타입이 TEST
static StructureData ByteToStructure ( byte [] data)

StructureData BinaryReader1 = new StructureData ();
// 기본 데이터 형식을 특정 인코딩의 이진값으로 읽음
using (BinaryReader reader = new BinaryReader
( new MemoryStream(data, false ), Encoding .Unicode))

BinaryReader1.iA = reader.ReadInt32();
// 현재 스트림에서 부호있는 4바이트 정수를 읽기
BinaryReader1.fB = reader.ReadSingle();
// 현재 스트림에서 4바이트 부동 소수점값을 읽기
BinaryReader1.sC = reader.ReadString();

※ 일반 데이터(수치, 문자)와 구조체 데이터는 코딩은 달라도 바이너리 데이터는 동일합니다.

private void ReadData()
<

// 아래에서 입력이 정상적으로 완료됐는지 확인하기 위해 선언과 동시에 Error 코드를 저장
SmartX. SmartModbus.EXCEPTIONCODE retStatus = SmartX. SmartModbus.EXCEPTIONCODE .
SLAVEADDRESS_ERROR;

// 값을 읽어서 저장할 바이트 배열
byte [] ReadData = new byte [4];
// IEEE754로 변환하여 저장할 변수
float retData1= new float ();

// SlaveAddress : 01, FunctionCode : 03, StartAddress : 00 2A, DataLength : 00 02
retStatus = smartModbus1.ReadHoldingRegister(100, 2, ref ReadData);

// 정상 수신 할때만 변환 실행
if (retStatus == SmartX. SmartModbus.EXCEPTIONCODE .SUCCESS)

[STEP-1] IEC-Series내의 사용할 포트의 TX와 RX를 결선합니다.
[STEP-2] PortNo(포트 넘버)와 BaudRate(통신 속도), ReadTimeOut과 BufferSize를 지정합니다.
[STEP-3] Open 버튼을 클릭하여 통신 포트를 오픈합니다.
[STEP-4] 전송 데이터를 일반 데이터의 조합 또는 구조체 데이터로 보낼지를 지정합니다.
[STEP-5] 송신 데이터의 수정을 위해 각 Value값을 클릭하면 SmartKeyboard가 Open되고 데이터를 수정 후 X버튼을 클릭합니다.
[STEP-6] Send 버튼을 클릭하여 STEP-5에서 입력한 데이터가 수신 측(하단 SmartListBox)에 정상 표시되는지 확인합니다.
※ 연속으로 10개의 데이터를 전송하려는 경우 Send(Auto)버튼을 클릭합니다.

그룹 및 사용자를 Cloud Search ID 소스에 동기화하기

Google Cloud Search는 ID 소스를 사용하여 타사 저장소에서 사용자 ID를 매핑합니다. 사용자 ID는 Microsoft Active Directory와 같은 경량 디렉터리 액세스 프로토콜(LDAP) 서버에 저장될 수 있습니다. Google Cloud Directory Sync (GCDS)를 사용하면 Active Directory 그룹을 ID 소스와 동기화할 수 있습니다.

참고: 동기화하려는 사용자 ID가 특정 검색 및 제외 규칙에 의해 정의된 경우에는 새 맞춤 스키마를 해당 사용자 그룹에 적용하고, 그 외의 경우에는 모든 사용자 계정에 적용합니다.

시작하기 전에

    하여 Active Directory의 데이터를 동기화합니다. 합니다.
  • 관리 콘솔에서 ID 소스를 생성하여 ID 소스의 ID를 복사합니다.

1단계: ID 매핑 그룹 설정하기

  1. 명령줄에서 다음 명령어 중 하나를 입력합니다.
    • Linux(설치 디렉터리에서): $ ./config-manager --enable-img
    • Microsoft Windows: > config-manager.exe --enable-img
    를 엽니다.
  2. 왼쪽 패널에서 일반 설정을 클릭합니다.
  3. ID 매핑 그룹 체크박스를 선택합니다.

ID 매핑 그룹 옵션이 왼쪽 패널에 표시됩니다.

2단계: 동기화에 그룹 추가하기

  • 검색 규칙을 추가한 후 테스트하려면 LDAP 쿼리 테스트를 클릭하세요.
  • 검색 규칙은 여러 개 추가할 수 있으며 GDCS에서 모두 자동 동기화합니다. LDAP 검색 규칙을 추가하여 데이터를 동기화하는 방법 자세히 알아보기
  • 검색 규칙에서 반환된 그룹을 제외하려면 제외 규칙 탭을 클릭합니다. GCDS에서 제외 규칙을 사용하는 방법 알아보기

3단계: 사용자 ID를 Cloud Search에 동기화하기

  1. 왼쪽 패널에서 맞춤 스키마를 클릭합니다
  2. 스키마 추가를 클릭합니다.
  3. 맞춤검색 규칙 정의 또는 '사용자 계정'에 정의된 사용자 규칙을 선택합니다. 자세한 내용은 맞춤 스키마로 맞춤 사용자 입력란 동기화하기를 참고하세요.
  4. 스키마 이름에 ID 소스 ID를 입력합니다. ID에는 'identitysources'를 포함하지 않습니다.
  5. LDAP 입력란 이름에는 외부 사용자 식별자가 포함된 LDAP 입력란을 입력합니다. 이 식별자는 identitysources/source-id/users/user-identifier 형식이며 Cloud Search 사용자 주 구성원에 사용됩니다.
  6. Google 입력란 이름에는 ID 소스 ID에 '_identifier'를 추가하여 입력합니다. 예를 들어 ID 소스 ID가 02b392ce3a23이면 02b392ce3a23_identifier를 입력합니다.
  7. Google 입력란 유형에서는 문자열을 선택하고 입력란에 하나의 값만 포함하도록 합니다.
  8. 확인을 클릭합니다.

자세한 내용은 ID 소스 생성하기를 참고하세요.

4단계: 동기화 일정 설정하기

  1. 구성 관리자를 엽니다.
  2. 왼쪽 패널에서 동기화를 클릭합니다.

동기화를 시뮬레이션하거나 설정을 저장할 수 있습니다. 동기화 프로세스를 자동화하는 방법 자세히 알아보기

바이너리 속성 인코딩

바이너리 속성(예: objectSid 또는 objectGUID)을 그룹 이름 또는 사용자 이메일 속성으로 사용하는 경우 인코딩 스키마를 사용하여 바이너리 속성이 문자열로 변환됩니다. 지원되는 인코딩 스키마는 다음과 같습니다.

  • Base16(16진수)
  • Base32
  • Base32Hex
  • Base64
  • Base64URL

인코딩 스키마를 변경하려면 구성 파일을 수동으로 업데이트합니다.

    구성 파일을 열고 태그 아래에서 을 찾습니다.

이 표시되지 않으면 기존 Base64 인코딩 스킴을 사용 중입니다. 아래에서 을 추가합니다.

다음 옵션 중 하나를 선택하여 을 업데이트합니다.

:

BASE16


Google, Google Workspace 및 관련 마크와 로고는 Google LLC의 상표입니다. 기타 모든 회사명 및 제품명은 해당 업체의 상표입니다.


0 개 댓글

답장을 남겨주세요