Azure Functions는 Amazon의 Lambdas 또는 Google의 Cloud Functions(일명 "서버리스" 아키텍처)에 대한 Microsoft의 답변입니다. 작은 코드 조각을 배포하고 기본 서버는 Azure가 처리하도록 할 수 있는 방법을 제공합니다. 저는 한 번도 사용해 본 적이 없었기 때문에 "Hello, World"를 넘어 Couchbase Server와 함께 작동하도록 하여 사용해 보려고 생각했습니다.
다음이 있습니다. 더 많은 옵션 에서 단순한 HTTP 이벤트(예: Blob 트리거, GitHub 웹후크, Azure 저장소 큐 트리거 등) 이상의 기능을 사용할 수 있습니다. 하지만 이 블로그 게시물에서는 HTTP 이벤트에만 집중하겠습니다. Couchbase Server와 상호 작용하는 간단한 "Get" 및 "Set" 엔드포인트를 만들어 보겠습니다.
시작하기 전에 다음과 같이 따라할 수 있습니다. 이 블로그 게시물의 소스 코드 에서 확인하세요.
또한 카우치베이스 서버를 사용한 Azure 함수 및 지연 초기화 게시물. 여기에는 카우치베이스 서버 및 Azure 함수 사용에 대한 중요한 업데이트가 포함되어 있습니다.
Azure 함수 개발을 위한 설정하기
이 블로그 게시물에서는 Visual Studio 미리보기.
제가 이렇게 한 이유는 제작을 위한 편리한 도구 Visual Studio의 Azure 함수 프로젝트.
하지만 현재로서는 프리뷰 버전에서만 작동합니다. Azure 함수를 개발하기 위해 이러한 도구를 사용할 필요는 없지만 프로세스가 더 간단해졌습니다.
이 도구가 준비되면 파일→새로 만들기→프로젝트로 이동하기만 하면 됩니다. 그런 다음 "클라우드"에서 "Azure 함수"를 선택합니다.
이렇게 하면 몇 개의 JSON 파일이 있는 빈 프로젝트가 생깁니다. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 항목을 추가한 다음 "Azure 함수"를 선택합니다.
다음으로 어떤 종류의 Azure 함수를 만들 것인지 선택해야 합니다. 저는 "HttpTrigger"를 선택했습니다. 또한 이 게시물을 단순하게 유지하기 위해 "익명"을 선택했지만 사용 사례에 따라 인증 토큰이 필요할 수도 있습니다. 이렇게 하면 매우 간단한 함수 셸이 생성됩니다(C# 클래스로). 이 함수를 로컬에서 실행할 수 있으므로(실제로 local.settings.json 파일의 용도가 바로 이것입니다) 아직 Azure에 배포하지 않고도 테스트해 볼 수 있습니다.
"Get" 함수 작성
먼저, ID로 데이터를 '가져오는' 함수와 주어진 데이터를 새로 '설정'하는 함수 두 가지를 만들기로 결정했습니다. 저는 간단한 C# POCO로 데이터의 모양을 정의하는 것으로 시작했습니다:
1 2 3 4 5 6 |
public 클래스 내 문서 { public 문자열 이름 { get; set; } public int 신발 사이즈 { get; set; } public 십진수 잔액 { get; set; } } |
다음은 카우치베이스 서버에서 해당 문서를 '가져오기' 위해 작성한 Azure 함수입니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public 정적 비동기 작업<HttpResponseMessage> Get([HttpTrigger(권한 수준.익명, "get", 경로 = null)]HttpRequestMessage req, TraceWriter 로그) { // 쿼리 매개변수 파싱 var id = req.쿼리 이름 값 쌍() .첫 번째 또는 기본값(q => 문자열.비교(q.키, "id", true) == 0) .가치; 사용 (var 클러스터 = GetCluster()) { 사용 (var 버킷 = GetBucket(클러스터)) { var doc = 기다림 버킷.GetAsync<내 문서>(id); 반환 req.CreateResponse(HttpStatusCode.확인, doc.가치, new JsonMediaTypeFormatter()); } } } |
몇 가지 주의해야 할 사항:
- 나는
"post"
툴링에 의해 생성된 것만"get"
함수입니다. - 쿼리 매개변수를 구문 분석하는 것은 이 간단한 경우에 많은 추가 코드가 필요한 것처럼 보입니다. 또는 "매개 변수가 있는 함수"를 만들 수 있습니다.
GetCluster
그리고GetBucket
에 대한 자세한 내용은 이 글의 뒷부분에서 설명하겠습니다. 하지만 간단히 설명하자면 이 코드가 로컬에서 작동하고 Azure에 배포되기를 원한다는 것입니다.
그런 다음 이 함수를 로컬에서 실행하면 다음과 비슷한 콘솔 화면이 표시됩니다:
하단에서 Azure 함수 URL을 확인할 수 있습니다. Couchbase에 문서가 있다고 가정하고(아직 없습니다), 다음과 같이 HTTP 요청을 만들 수 있습니다. 포스트맨과 같은 도구 에: http://localhost:7071/api/HttpTriggerCsharpGet?id=123456
현재 이렇게 하면 유효성 검사나 오류 검사 코드가 없으므로 응답으로 "null"이 반환됩니다. 이제 넘어가서 "Set" 함수를 만들어 보겠습니다.
"집합" 함수 작성
"설정" 기능은 약간 다릅니다. 문서 정보를 게시하고 "ID 123456으로 삽입된 새 문서"와 같은 메시지를 반환하기를 원합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public 정적 비동기 작업<HttpResponseMessage> 설정([HttpTrigger(권한 수준.익명, "post", 경로 = null)] 내 문서 req, TraceWriter 로그) { var id = Guid.NewGuid().ToString(); 사용 (var 클러스터 = GetCluster()) { 사용 (var 버킷 = GetBucket(클러스터)) { 기다림 버킷.InsertAsync(id, req); } } 반환 new HttpResponseMessage { 콘텐츠 = new StringContent($"{id} ID로 삽입된 새 문서"), 상태 코드 = HttpStatusCode.확인 }; } |
이 함수는 Get 함수와 모양이 비슷하지만 몇 가지 중요한 사항에 유의해야 합니다:
- 오직
"post"
를 추가합니다. - 대신
HttpRequestMessage
를 첫 번째 매개 변수로 사용하기로 결정했습니다.내 문서
를 클릭하고 Azure 함수가 바인딩을 수행하도록 합니다. - 저는
HttpRequestMessage
를 호출할 수 없습니다.CreateResponse
메서드를 사용할 수 없으므로 대신 새로운HttpResponseMessage
를 직접 입력하면 마지막에 성공 메시지를 반환합니다.
Postman에서 요청을 만들려면 다음 URL을 사용하겠습니다. http://localhost:7071/api/HttpTriggerCsharpSet
. 헤더에서 콘텐츠 유형
을 "application/json"으로 변경합니다. 마지막으로 본문은 JSON이 됩니다:
1 2 3 4 5 |
{ "이름": "matthew", "균형": 107.18, "ShoeSize": 14 } |
이제 엔드포인트에 해당 문서를 게시하면 "ID f05ea97e-7c2f-4f88-b72d-19756f6a6f35로 새 문서가 삽입되었습니다"라는 응답 메시지를 받게 됩니다.
카우치베이스 서버에 연결
이러한 기능이 Couchbase Server에 어떻게 연결되는지 간략하게 설명했습니다.
앞서 두 가지 방법을 언급했습니다, GetCluster
그리고 GetBucket
를 생성하여 각각 클러스터와 버킷에 연결합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
비공개 정적 클러스터 GetCluster() { var uri = 구성 관리자.앱 설정["couchbaseUri"]; 반환 new 클러스터(new 클라이언트 구성 { 서버 = new 목록<Uri> { new Uri(uri) } }); } 비공개 정적 IBucket GetBucket(클러스터 클러스터) { var 버킷 이름 = 구성 관리자.앱 설정["couchbase버킷이름"]; var 버킷 비밀번호 = 구성 관리자.앱 설정["couchbaseBucketPassword"]; 반환 클러스터.OpenBucket(버킷 이름, 버킷 비밀번호); } |
이 시점에서 이 코드의 대부분은 이전에 Couchbase Server와 Couchbase .NET SDK를 사용해 본 적이 있다면 익숙할 것입니다. 단일 노드 클러스터에 연결한 다음 비밀번호가 설정된 버킷을 연결하고 있습니다(저는 Couchbase Server 4.6을 사용하고 있습니다).
하지만 여기서 지적해야 할 중요한 점은 Configuration.AppSettings
. 에서 local.settings.json
파일에서 값 섹션에 이러한 Couchbase 설정을 추가했습니다:
1 2 3 4 5 6 7 8 9 10 |
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "", "AzureWebJobsDashboard": "", "couchbaseUri": "http://localhost:8091", "couchbase버킷이름": "azurefunctions", "couchbaseBucketPassword": "Password88!" } } |
Azure 함수를 로컬에서 실행할 때 이 파일은 구성에 사용됩니다. 저는 "azurefunctions"라는 버킷을 사용하여 로컬에서 Couchbase Server를 실행하고 있습니다. "Values"의 모든 항목은 다음을 통해 액세스할 수 있습니다. Configuration.AppSettings
.
Azure에 배포
Azure 함수를 배포하기 전에 Azure에서 Couchbase 클러스터를 만들어야 합니다. Azure Marketplace에 대한 Ben Lackey의 훌륭한 작업 덕분에 이 작업은 매우 쉽습니다. 일단 배포가 완료되면 Visual Studio 덕분에 Azure 함수를 배포하는 것도 쉽습니다.
Couchbase Server를 Azure에 배포하기
다음은 Azure에서 Couchbase Server 클러스터를 만드는 과정을 안내하는 짧은 동영상입니다.
[유튜브 https://www.youtube.com/watch?v=q9mBBu0YqJI&w=560&h=315]
제 예에서는 해당 동영상을 자세히 따라했습니다. 다음은 사용자 이름, 비밀번호 및 리소스 그룹을 구성하는 1단계입니다.
두 번째 단계에서는 가장 작고 저렴한 VM(DS1 v2)에 단일 노드 클러스터만 생성했습니다. 이 예제에서는 동기화 게이트웨이를 사용하지 않으므로 동기화 게이트웨이 노드를 0개 만들었습니다.
3단계는 요약이고 4단계는 확인입니다. Couchbase 클러스터가 Azure에서 시작되는 데 3~5분 정도 걸립니다.
클러스터가 생성되면 클러스터의 첫 번째 노드에 대한 URL을 찾습니다(위 동영상에서 설명한 대로). 제 URL은 다음과 같습니다: http://vm0.server-hsmkrefstzg2t.northcentralus.cloudapp.azure.com:8091
. 이 URL로 이동하여 로그인하고 버킷을 만듭니다(저는 로컬에서 했던 것처럼 "azurefunctions"라고 이름 지었습니다).
Azure 함수를 Azure에 배포하기
이제 Couchbase Server가 실행 중입니다. 이제 이 서버와 상호 작용할 Azure 함수를 배포해 보겠습니다.
시작하려면 Visual Studio에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "게시"를 선택합니다. 이 작업을 처음 수행할 때 새 게시 프로필을 만들어야 하지만 이는 간단합니다.
함수에 앱 이름을 지정하고, 구독을 선택하고, 리소스 그룹을 선택하고(새 그룹을 만들거나 위에서 Couchbase용으로 만든 것과 동일한 그룹을 사용할 수 있음), 서비스 요금제를 선택한 다음 마지막으로 저장소 계정을 선택합니다. 필요한 경우 새 계정을 만들 수 있습니다.
"만들기"를 클릭하면 이러한 항목이 Azure에서 만들어지기 시작합니다(1~2분 정도 걸릴 수 있음).
Azure 기능 사용해 보기
마지막으로, Azure 함수가 Couchbase Server에 연결하려면 URI, 버킷 이름 및 비밀번호를 알아야 한다는 점을 기억하세요. 해당 정보는 local.settings.json에 있지만 이 파일은 실제 Azure 배포에는 사용되지 않습니다.
Azure 포털에서 Azure 함수(저는 cbazurefunctions라고 합니다)로 이동한 다음 "애플리케이션 설정"을 선택합니다. "앱 설정"에서 세 가지 설정인 couchbaseUri, couchbaseBucketName 및 couchbaseBucketPassword를 입력합니다.
이제 위에서 설명한 Postman 프로세스를 반복하여 Azure 기능을 사용해 보고 작동하는지 확인합니다. URL은 다를 수 있지만 제 URL은 다음과 같습니다. http://cbazurefunctions.azurewebsites.net/.
요약
Azure 함수를 사용해 본 것은 이번이 처음입니다. 이 블로그 게시물에서는 간단한 데모를 보여 드리지만 프로덕션 환경에서 사용하기 전에 고려해야 할 다른 요소도 있습니다:
- 인증 - 간단하게 유지하기 위해 익명의 Azure 함수를 사용했습니다. Azure 함수는 인증 토큰을 제공하여 권한이 있는 사용자 외에는 액세스하지 못하도록 할 수도 있습니다.
- 앱 설정 - 포털에서 수동으로 설정하는 것이 최선의 해결책이 아닐 수 있습니다. 이 부분을 자동화할 수 있는 방법이 있을 것입니다.
- HTTPS/TLS - Azure 함수에 데이터를 가져오고 게시할 때 일정 수준의 암호화가 필요할 수 있습니다. 위의 예는 모든 것을 일반 텍스트로 전송합니다.
제가 놓친 것이 있나요? 이 과정을 더 쉽게 또는 더 좋게 만들기 위해 공유할 팁이나 제안이 더 있나요? 아래에 댓글을 남기거나 다음 주소로 핑을 보내주세요. 트위터 @mgroves.