API에 대한 /api/v1/getcode 앱 URL 경로는 영숫자 코드와 타임스탬프를 포함하는 JSON 응답을 생성합니다.
먼저 @app.route 데코레이터는 get_code 함수가 /api/v1/getcode URL에 대한 요청을 처리하도록 Flask에 지시합니다.
@app.route('/api/v1/getcode', methods=['GET'])
def get_code():
다음으로 앱은 number_url에 있는 URL의 타사 API를 호출하며, 헤더에 있는 키 자격 증명 모음에서 가져온 액세스 키를 제공합니다.
headers = {
'Content-Type': 'application/json',
'x-functions-key': access_key
}
r = requests.get(url = number_url, headers = headers)
if (r.status_code != 200):
return "Could not get you a code.", r.status_code
예제 타사 API는 Azure Functions의 서버리스 환경에 배포됩니다. 헤더의 x-functions-key 속성은 Azure Functions에서 액세스 키가 헤더에 표시되도록 예상하는 방법입니다. 자세한 내용은 Azure Functions HTTP 트리거 - 권한 부여 키참조하세요. 어떤 이유로든 API를 호출하지 못하면 코드는 오류 메시지와 상태 코드를 반환합니다.
API 호출이 성공하고 숫자 값을 반환한다고 가정하면 앱은 해당 숫자와 일부 임의 문자(고유한 random_char 함수 사용)를 사용하여 더 복잡한 코드를 생성합니다.
data = r.json()
chars1 = random_char(3)
chars2 = random_char(3)
code_value = f"{chars1}-{data['value']}-{chars2}"
code = { "code": code_value, "timestamp" : str(datetime.utcnow()) }
여기에 code 변수에는 코드 값과 타임스탬프를 포함하는 앱의 API에 대한 전체 JSON 응답이 포함됩니다. 예제 응답은 {"code":"ojE-161-pTv","timestamp":"2020-04-15 16:54:48.816549"}.
그러나 해당 응답을 반환하기 전에 Queue 클라이언트의 send_message 메서드를 사용하여 스토리지 큐에 메시지를 씁니다.
queue_client.send_message(code)
return jsonify(code)
큐 메시지 처리
큐에 저장된 메시지는 Azure CLI 명령 또는 Azure az storage message get를 사용하여 Azure Portal을 통해 보고 관리할 수 있습니다. 샘플 리포지토리에는 앱 엔드포인트에서 코드를 요청한 다음 메시지 큐를 확인하는 스크립트(test.cmd 및 test.sh)가 포함되어 있습니다.
az storage message clear 명령을 사용하여 큐를 지우는 스크립트도 있습니다.
일반적으로 이 예제의 앱과 같은 앱에는 추가 처리를 위해 큐에서 메시지를 비동기적으로 끌어오는 다른 프로세스가 있습니다. 앞에서 설명한 것처럼 이 API 엔드포인트에서 생성된 응답은 2단계 사용자 인증을 통해 앱의 다른 곳에서 사용될 수 있습니다. 이 경우 앱은 특정 기간(예: 10분) 후에 코드를 무효화해야 합니다. 이 작업을 수행하는 간단한 방법은 사용자 로그인 절차에서 사용하는 유효한 2단계 인증 코드 테이블을 유지하는 것입니다. 그러면 앱은 다음 논리(의사 코드)를 사용하여 대기열 감시 프로세스를 구축합니다.
pull a message from the queue and retrieve the code.
if (code is already in the table):
remove the code from the table, thereby invalidating it
else:
add the code to the table, making it valid
call queue_client.send_message(code, visibility_timeout=600)
이 의사 코드는 큐에 메시지가 표시되기 전의 시간(초)을 지정하는 send_message 메서드의 선택적 visibility_timeout 매개 변수를 사용합니다. 기본 시간 제한은 0이므로 처음에 API 엔드포인트에서 작성한 메시지는 큐 감시 프로세스에 즉시 표시됩니다. 따라서 해당 프로세스는 바로 유효한 코드 테이블에 저장합니다. 프로세스는 10분 후에 코드를 다시 받을 수 있도록 시간 제한으로 동일한 메시지를 다시 큐에 대기합니다. 이때 테이블에서 제거됩니다.
Azure Functions에서 기본 앱 API 엔드포인트 구현
이 문서의 앞에 표시된 코드는 Flask 웹 프레임워크를 사용하여 API 엔드포인트를 만듭니다. Flask는 웹 서버에서 실행해야 하므로 이러한 코드를 Azure App Service 또는 가상 머신에 배포해야 합니다.
대체 배포 옵션은 Azure Functions의 서버리스 환경입니다. 이 경우 모든 시작 코드와 API 엔드포인트 코드는 HTTP 트리거에 바인딩된 동일한 함수 내에 포함됩니다. App Service와 마찬가지로 함수 애플리케이션 설정 사용하여 코드에 대한 환경 변수를 만듭니다.
더 쉽게 구현되는 한 가지 방법은 Queue Storage를 사용하여 인증하는 것입니다. 큐의 URL 및 자격 증명 개체를 사용하여 QueueClient 개체를 가져오는 대신 함수에 대한 큐 스토리지 바인딩 만듭니다. 바인딩은 백그라운드에서 모든 인증을 처리합니다. 이러한 바인딩을 사용하면 함수에 즉시 사용할 수 있는 클라이언트 개체가 매개 변수로 제공됩니다. 자세한 내용 및 예제 코드는 Azure Functions를 Azure Queue Storage 연결하는참조하세요.
다음 단계
이 자습서를 통해 앱이 관리 ID를 사용하여 다른 Azure 서비스에서 인증하는 방법과 앱이 Azure Key Vault를 사용하여 타사 API에 필요한 다른 비밀을 저장하는 방법을 알아보았습니다.
Azure Key Vault 및 Azure Storage와 함께 여기에 설명된 동일한 패턴이 다른 모든 Azure 서비스에 적용됩니다. 중요한 단계는 Azure Portal 또는 Azure CLI를 통해 해당 서비스의 페이지 내에서 앱에 대한 올바른 역할을 할당하는 것입니다. (Azure 역할을 할당하는 방법참조). 서비스 설명서를 확인하여 다른 액세스 정책을 구성해야 하는지 여부를 확인해야 합니다.
로컬 개발에 사용하는 모든 서비스 주체에 동일한 역할 및 액세스 정책을 할당해야 합니다.
즉, 이 연습을 완료한 후 다양한 다른 Azure 서비스 및 기타 외부 서비스 수에 지식을 적용할 수 있습니다.
이 자습서에서 다루지 않은 한 가지 주제는 사용자의 인증입니다. 웹앱에 대한 이 영역을 탐색하려면 Azure App Service 엔드 투 엔드(end-to-end) 사용자 인증 및 권한 부여시작합니다.
참조
- Azure Python 앱을 인증하고 권한을 부여하는 방법
- 실습 샘플: github.com/Azure-Samples/python-integrated-authentication
- microsoft Entra 설명서
- Azure Key Vault 설명서