Dapr 을 사용해 보았습니다. (웹 API 이미지로 로컬 저장소와 GCS를 처리해 보았습니다.)

10609 단어 GCPGCSdaprtech
이 글은 Web API Advent Calendar 2021의 다섯째 날 글입니다.
참고로 4일째는...
@sys_zero선생님의Power Automate for desktop 변수에 대한 Tips "JSON에 null 값이 있을 때 선택적 스왑"
이번에는 이날까지 전혀 내용을 고려하지 않았지만 갑자기 개인적으로Dapr 로컬 스토리지와 Google Cloud Storage(이하 GCS)에 대해 조사를 진행했습니다.

왜 이번에 Dapr?


Dapr을 사용하는 장점 중 하나로 다른 서비스에 연결하는 방법을 HTTP 또는 gRPC로 만들 수 있다.
이것, 다른 서비스, Dapr의 메인 페이지에 있는 것처럼 로컬 저장소,redis와 mysql 등의 저장소, 또는 클라우드 환경.
Daprのコンセプト
https://docs.dapr.io/concepts/overview/의 그림)
앱 측이 접속 목적지가 구체적으로 무엇인지 신경 쓰지 않고 HTTP와 gRPC를 통해 조작할 수 있다는 점이 반가운 대목이다.
저는 개인적으로 지금까지 인프라 시설층으로서 응용 프로그램 측면에서 추상화하려고 노력한 부분은 Dapr의 실시를 통해 디자인의 번거로움을 줄일 수 있다고 생각합니다.
또 언어에 따라 일부 도서관은 서비스가 좀 좋지 않고, 원래 없는 도서관도 있지만, 대프라면 HTTP로 연결될 수 있다.
또 하나의 흥미로운 점은 Dapr의 특징으로 응용 프로그램으로 컴파일된 프로그램 라이브러리로 이동하는 것이 아니라sidecar 형식으로 실제 응용 프로그램과 함께 시작하는 응용 프로그램으로 시작하는 것이다.
따라서 sdk를 사용하지 않으면 http client나 gRPC를 가입한 클라이언트만 있으면 로컬 파일,redis, mysql를 조작할 수 있습니다.이번엔 이 부분을 소개하지 않았지만 실제로 앱을 만들어 확인하는 게 좋을 것 같아요.
Daprアーキテクチャ
https://docs.dapr.io/concepts/overview/의 그림)
단점으로 나는 현재의 물건은 유한하다고 생각한다.
다만, 부족한 부분은 자체 제작하고 대퍼의 인터랙션에 맞춰 앱을 추상화할 수 있다는 점도 작은 문제점으로 꼽힌다.(결국 해야 한다면 마찬가지)

운영 환경


어플리케이션 또는 OS
릴리즈
MacOS Monterey(M1)
12.0.1
Docker Desktop
4.3.0
Dapr
1.5.0
설치는 를 참조하십시오Dapr의 Geting Started.

로컬 스토리지 작업


먼저 로컬 파일의 내용을 가져오고 파일을 만듭니다.
Local Storage binding spec 내용은 대체로 같다

Dapr 어셈블리 만들기


자세한 설명 없이 PATH 섹션은 로컬 파일을 배치하는 위치입니다.
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: storage
  namespace: default
spec:
  type: bindings.localstorage
  version: v1
  metadata:
  - name: rootPath
    value: <PATH>
의 구성은 다음과 같다.
.
└── my-components
    └── test.yaml
다음은 상기 프로그램이 시작된 명령입니다.파일을 지정하지 않아도 됩니다.
$ dapr run --app-id storage-test --dapr-http-port 3500 --components-path ./my-components

파일 만들기


파일 제작이기 때문에operation은create입니다.
참고로 메타데이터를 설치하지 않으면 uid로 파일을 만들 거예요.
$ curl -i -d '{ "operation": "create", "data": "Hello World", "metadata": {"fileName": "sample.txt"} }' http://localhost:3500/v1.0/bindings/storage

HTTP/1.1 200 OK
Server: fasthttp
Date: Sat, 04 Dec 2021 13:05:16 GMT
Content-Type: application/json
Content-Length: 25
Traceparent: 00-a1f93ae88050c49941bc194378f8bd7d-43cc4ecc7cd8071b-01

{"fileName":"sample.txt"}
구성 요소가 지정한 위치에서 만들었을 것이다sample.txt.
겸사겸사 다시 집행하면 200을 돌려주고 책을 외운다.

파일 가져오기


파일을 가져오는 내용은operation get입니다.
$ curl -i -d '{ "operation": "get", "metadata": { "fileName": "sample.txt" }}' http://localhost:3500/v1.0/bindings/storage

HTTP/1.1 200 OK
Server: fasthttp
Date: Sat, 04 Dec 2021 13:21:38 GMT
Content-Type: application/json
Content-Length: 11
Traceparent: 00-f112a8e70c0cd249d2334935e81520ff-d8622ed38d2bfd3d-01

Hello World
이렇게 얻을 수 있습니다.
대상 파일이 없으면 500을 되돌려줍니다.이 일대는 아마도 다시 한 번 조사할 수 있을 것이다.
이번에는 소개가 없지만 delete와list는 가능합니다.

GCS 작업


로컬과 달리 gcs에 접근해야 하기 때문에 GCP의 서비스 account의 json 정보를 기록합니다.
기본적으로GCP Storage Bucket binding spec는 같다.
이번에 버킷과 서비스 계정 제작법은 생략했지만 미리 제작할 필요가 있다.
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: storage-2
  namespace: default
spec:
  type: bindings.gcp.bucket
  version: v1
  metadata:
  - name: bucket
    value: <bucketname>
  - name: type
    value: service_account
  - name: client_email
    value: <client email>
  - name: private_key
    value: "  "
주의해야 할 것은 상기 메타데이터의 값은 오류가 발생하더라도 이동하고 파일 제작도 이동한다.또한 참고측에서 매개 변수는 필수적인 것이 많지만 검증을 통해 자신의 경험에 있어서 이것은 필요 없는 것이고 문제없이 이동했다.
여기의component는 방금의local과 같은 파일에 기록되어 있어도 문제가 없습니다.(k8s의yaml의 인상).

파일 만들기


파일 제작이기 때문에operation은create입니다.
로컬과 같습니다.파일에 이름을 쓸 때만 키로 지정합니다.
$ curl -i -d '{ "operation": "create", "data": "Hello World", "metadata": {"key": "sample.txt"} }' http://localhost:3500/v1.0/bindings/storage-2

HTTP/1.1 200 OK
Server: fasthttp
Date: Sat, 04 Dec 2021 14:24:52 GMT
Content-Type: application/json
Content-Length: 79
Traceparent: 00-2c99123f4379b2106fe61daa558762ea-34873aa800a6b22c-01

{"objectURL":"https://storage.googleapis.com/<bucketname>/sample.txt"}
구성 요소가 지정한 위치에서 만들었을 것이다sample.txt.
겸사겸사 다시 집행하면 200을 돌려주고 책을 외운다.

파일 가져오기


파일을 가져오는 내용은operation get입니다.아까처럼 파일을 지정할 때 키를 사용합니다.
$ curl -i -d '{ "operation": "get", "metadata": { "key": "sample.txt" }}' http://localhost:3500/v1.0/bindings/storage-2

HTTP/1.1 200 OK
Server: fasthttp
Date: Sat, 04 Dec 2021 13:21:38 GMT
Content-Type: application/json
Content-Length: 11
Traceparent: 00-f112a8e70c0cd249d2334935e81520ff-d8622ed38d2bfd3d-01

Hello World
이렇게 얻을 수 있습니다.
로컬과 마찬가지로list도 사용할 수 있습니다.

총결산


트위터에서도 화제가 되고 신경 쓰이지만 실제로 사용해 보면 더 좋을 것 같아요.
이번 binding의 store과에 관해서는pubsub 등도 있기 때문에 API로 각 서비스를 처리하기 때문에 반드시 시도해 보십시오.

좋은 웹페이지 즐겨찾기