CosmosDB 및 devcontainers로 로컬 개발 개선

작년에 나는 에 글을 썼고 그 이후로 나는 그 패턴을 응용 프로그램을 만들기 위해 여러 번 사용했지만, 나를 계속 괴롭히는 한 가지가 있었는데, Node.js에 대해 SSL을 비활성화해야 했습니다.

물론 NODE_TLS_REJECT_UNAUTHORIZED로 SSL을 비활성화하는 것은 큰 고통이 아니었지만 더러운 작은 해결 방법처럼 느껴졌고 닷넷 프로젝트에도 걸림돌이 되었습니다.

FSharp.CosmosDb에서 사용하는 devcontainer에 CosmosDB 에뮬레이터를 추가해야겠다는 생각이 들었습니다. 작업할 때 사이에 사용했던 Azure 리소스를 계속 삭제했기 때문입니다. 그러나 연결 문자열에 대해 계정 호스트를 https://cosmos:8081로 설정하면 자체 서명된 인증서가 거부되어 쿼리를 수행하지 못합니다.

인증서를 설치할 때가 된 것 같습니다.

에뮬레이터는 다음을 사용하여 가져올 수 있는 잘 알려진 엔드포인트에서 인증서를 제공합니다cURL.

curl -k https://$ipaddr:8081/_explorer/emulator.pem > emulatorcert.crt


하지만 언제 실행해야 하며 Cosmos 에뮬레이터 컨테이너의 IP는 무엇입니까?

인증서 설치



컨테이너가 시작될 때까지 기다려야 하므로 postCreateCommand 파일에서 devcontainer.json를 사용하고 bash 스크립트를 호출하도록 합니다. bash 스크립트는 다음과 같습니다.

#!/usr/bin/env bash

set -euxo pipefail

ipAddress=https://$(docker inspect cosmos -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'):8081

# Try to get the emulator cert in a loop
until sudo curl -ksf "${ipAddress}/_explorer/emulator.pem" -o '/usr/local/share/ca-certificates/emulator.crt'; do
  echo "Downloading cert from $ipAddress"
  sleep 1
done

sudo update-ca-certificates


에뮬레이터의 IP를 얻기 위해 docker inspect를 사용하고 docker-compose에서 컨테이너의 이름을 설정했습니다. , Compose 이름 컨테이너 방식을 기반으로 하지만 이것이 가장 안전함) JSON 응답에서 IP를 가져오는 템플릿을 제공합니다 - cosmos . 이것은 프로토콜/포트 정보와 결합되어 IP 주소에 대한 변수를 만든 다음 인증서를 described here으로 다운로드하고 설치합니다.

연결 정보 설정



인증서가 설치된 상태에서 사용할 수 있도록 연결 문자열 정보를 설정하는 것이 편리할 수 있습니다. 처음에는 환경 변수(bash 변수로 IP가 있으므로)를 사용하고 {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} NuGet 패키지와 함께 로드하여 bash 스크립트 끝에 Microsoft.Extensions.Configuration.EnvironmentVariables를 추가하거나 변수는 dotnet 구성 시스템으로 구문 분석하기가 더 쉽지만 export ipAddress s에서 변수를 내보낼 수 없습니다(this issue 참조).

테이블에서 벗어났기 때문에 대체 솔루션은 정보를 디스크의 파일로 덤프하는 것입니다. 내 프로젝트에 대한 dotnet 접근 방식은 다음과 같습니다. 프로젝트 요구 사항에 맞게 파일(및 해당 콘텐츠)을 조정하기만 하면 됩니다.

if [! -f ./samples/FSharp.CosmosDb.Samples/appsettings.Development.json]
then
  echo '{ "Cosmos": { "EndPoint" : "'$ipAddress'" } }' >> ./samples/FSharp.CosmosDb.Samples/appsettings.Development.json
fi


참고: postCreateCommand 파일에 코스모스에 대한 액세스 키가 있지만 원하는 경우 여기에 덤프할 수도 있습니다.

이를 통해 컨테이너가 시작되면 Cosmos에 대한 연결이 애플리케이션에서 사용할 준비가 됩니다.

요약



이 게시물에서는 VS Code devcontainer를 사용하여 앱 컨테이너와 Docker CosmosDB 에뮬레이터를 나란히 실행하는 방법을 살펴보았습니다. 내 프로젝트에 대해 게시한 전체 정의can be found here .

이제 이 작업을 수행하는 방법을 알아냈으므로 Node.js 앱에 대한 SSL 유효성 검사를 비활성화할 필요가 없도록 다시 돌아가서 다른 저장소를 개조하여 로컬에서 실행하는 것이 더 안전하도록 할 것입니다. .

부록



이 게시물을 작성하고 일부 JavaScript/Node.js 프로젝트로 돌아가서 확인해보니 유효하지 않은 인증서로 인해 여전히 실패하고 있는 것으로 나타났습니다. Linux에서 실행되는 dotnet 애플리케이션은 인증서 저장소를 존중하지만 Node.js 앱은 그렇지 않은 것 같습니다. 따라서 read the docs fully 환경 변수를 사용하여 인증서를 명시적으로 추가해야 하므로 docker-composeNODE_EXTRA_CA_CERTS에 추가했습니다. ) 섹션"NODE_EXTRA_CA_CERTS": "/usr/local/share/ca-certificates/emulator.crt" 파일... 한숨.

좋은 웹페이지 즐겨찾기