기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
를 사용한 토큰 검증 AWS Lambda
FHIR 지원 데이터 스토어에서 HealthLake SMART를 생성할 때는 요청에 AWS Lambda 함수의 ARN을 제공해야 합니다. Lambda 함수의 ARN은 CreateFHIRDatastoreIdpLambdaArn 파라미터를 사용하여 IdentityProviderConfiguration 객체에 지정됩니다.
FHIR 지원 데이터 스토어에서 SMART를 생성하기 전에 Lambda 함수를 생성해야 합니다. 데이터 스토어를 생성한 후에는 Lambda ARN을 변경할 수 없습니다. 데이터 스토어가 생성될 때 지정한 Lambda ARN을 보려면 API 작업을 사용합니다.DescribeFHIRDatastore
FHIR REST 요청이 FHIR 지원 데이터 스토어의 SMART에서 성공하려면 Lambda 함수가 다음을 수행해야 합니다.
-
HealthLake 데이터 스토어 엔드포인트에 대한 응답을 1초 이내에 반환합니다.
-
클라이언트 애플리케이션에서 보낸 REST API 요청의 권한 부여 헤더에 제공된 액세스 토큰을 디코딩합니다.
-
FHIR REST API 요청을 수행할 수 있는 충분한 권한이 있는 IAM 서비스 역할을 할당합니다.
-
FHIR REST API 요청을 완료하려면 다음 클레임이 필요합니다. 자세한 내용은 필수 클레임를 참조하세요.
-
nbf -
exp -
isAuthorized -
aud -
scope
-
Lambda로 작업할 때는 Lambda 함수 외에도 실행 역할과 리소스 기반 정책을 생성해야 합니다. Lambda 함수의 실행 역할은 함수에 런타임에 필요한 AWS 서비스 및 리소스에 액세스할 수 있는 권한을 부여하는 IAM 역할입니다. 제공하는 리소스 기반 정책은 HealthLake가 사용자를 대신하여 함수를 호출하도록 허용해야 합니다.
이 주제의 섹션에서는 클라이언트 애플리케이션의 예제 요청과 디코딩된 응답, AWS Lambda 함수를 생성하는 데 필요한 단계, HealthLake가 수임할 수 있는 리소스 기반 정책을 생성하는 방법을 설명합니다.
AWS Lambda 함수 생성
이 주제에서 생성된 Lambda 함수는 HealthLake가 FHIR 지원 데이터 스토어의 SMART에 대한 요청을 수신할 때 트리거됩니다. 클라이언트 애플리케이션의 요청에는 REST API 호출과 액세스 토큰이 포함된 권한 부여 헤더가 포함됩니다.
GET https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/ Authorization: Bearer i8hweunweunweofiwweoijewiwe
이 주제의 Lambda 함수 예제에서는 AWS Secrets Manager 를 사용하여 권한 부여 서버와 관련된 자격 증명을 가립니다. Lambda 함수에서 직접 권한 부여 서버 로그인 세부 정보를 제공하지 않는 것이 좋습니다.
예 권한 부여 보유자 토큰이 포함된 FHIR REST 요청 검증
예제 Lambda 함수는 FHIR 지원 데이터 스토어의 SMART로 전송된 FHIR REST 요청을 검증하는 방법을 보여줍니다. 이 Lambda 함수를 구현하는 방법에 대한 step-by-steps 지침은 섹션을 참조하세요를 사용하여 Lambda 함수 생성 AWS Management Console.
FHIR REST API 요청에 유효한 데이터 스토어 엔드포인트, 액세스 토큰 및 REST 작업이 포함되어 있지 않으면 Lambda 함수가 실패합니다. 필요한 권한 부여 서버 요소에 대한 자세한 내용은 섹션을 참조하세요필수 클레임.
import base64 import boto3 import logging import json import os from urllib import request, parse logger = logging.getLogger() logger.setLevel(logging.INFO) ## Uses Secrets manager to gain access to the access key ID and secret access key for the authorization server client = boto3.client('secretsmanager', region_name="region-of-datastore") response = client.get_secret_value(SecretId='name-specified-by-customer-in-secretsmanager') secret = json.loads(response['SecretString']) client_id = secret['client_id'] client_secret = secret['client_secret'] unencoded_auth = f'{client_id}:{client_secret}' headers = { 'Authorization': f'Basic {base64.b64encode(unencoded_auth.encode()).decode()}', 'Content-Type': 'application/x-www-form-urlencoded' } auth_endpoint = os.environ['auth-server-base-url'] # Base URL of the Authorization server user_role_arn = os.environ['iam-role-arn'] # The IAM role client application will use to complete the HTTP request on the datastore def lambda_handler(event, context): if 'datastoreEndpoint' not in event or 'operationName' not in event or 'bearerToken' not in event: return {} datastore_endpoint = event['datastoreEndpoint'] operation_name = event['operationName'] bearer_token = event['bearerToken'] logger.info('Datastore Endpoint [{}], Operation Name: [{}]'.format(datastore_endpoint, operation_name)) ## To validate the token auth_response = auth_with_provider(bearer_token) logger.info('Auth response: [{}]'.format(auth_response)) auth_payload = json.loads(auth_response) ## Required parameters needed to be sent to the datastore endpoint for the HTTP request to go through auth_payload["isAuthorized"] = bool(auth_payload["active"]) auth_payload["nbf"] = auth_payload["iat"] return {"authPayload": auth_payload, "iamRoleARN": user_role_arn} ## access the server def auth_with_provider(token): data = {'token': token, 'token_type_hint': 'access_token'} req = request.Request(url=auth_endpoint + '/v1/introspect', data=parse.urlencode(data).encode(), headers=headers) with request.urlopen(req) as resp: return resp.read().decode()
다음 절차에서는 SMART on FHIR 지원 데이터 스토어에서 FHIR REST API 요청을 처리할 때 HealthLake가 수임할 서비스 역할을 이미 생성했다고 가정합니다. 서비스 역할을 생성하지 않은 경우에도 Lambda 함수를 생성할 수 있습니다. Lambda 함수가 작동하려면 먼저 서비스 역할의 ARN을 추가해야 합니다. 서비스 역할을 생성하고 Lambda 함수에서 지정하는 방법에 대한 자세한 내용은 섹션을 참조하세요. JWT를 디코딩하는 데 사용되는 AWS Lambda 함수에 사용할 HealthLake 서비스 역할 생성
Lambda 함수를 생성하려면(AWS Management Console)
-
Lambda 콘솔의 함수 페이지
를 엽니다. -
함수 생성을 선택합니다.
-
새로 작성을 선택합니다.
-
기본 정보에서 함수 이름을 입력합니다. 런타임에서 Python 기반 런타임을 선택합니다.
-
Execution role(실행 역할)에서 Create a new role with basic Lambda permissions(기본 Lambda 권한을 가진 새 역할 생성)를 선택합니다.
Lambda는 Amazon CloudWatch에 대한 로그 업로드 권한을 함수에 부여하는 실행 역할을 생성합니다. Lambda 함수는 함수를 호출할 때 실행 역할을 수임하고 실행 역할을 사용하여 AWS SDK에 대한 자격 증명을 생성합니다.
-
코드 탭을 선택하고 샘플 Lambda 함수를 추가합니다.
Lambda 함수가 사용할 서비스 역할을 아직 생성하지 않은 경우 샘플 Lambda 함수가 작동하기 전에 생성해야 합니다. Lambda 함수에 대한 서비스 역할 생성에 대한 자세한 내용은 섹션을 참조하세요JWT를 디코딩하는 데 사용되는 AWS Lambda 함수에 사용할 HealthLake 서비스 역할 생성.
import base64 import boto3 import logging import json import os from urllib import request, parse logger = logging.getLogger() logger.setLevel(logging.INFO) ## Uses Secrets manager to gain access to the access key ID and secret access key for the authorization server client = boto3.client('secretsmanager', region_name="region-of-datastore") response = client.get_secret_value(SecretId='name-specified-by-customer-in-secretsmanager') secret = json.loads(response['SecretString']) client_id = secret['client_id'] client_secret = secret['client_secret'] unencoded_auth = f'{client_id}:{client_secret}' headers = { 'Authorization': f'Basic {base64.b64encode(unencoded_auth.encode()).decode()}', 'Content-Type': 'application/x-www-form-urlencoded' } auth_endpoint = os.environ['auth-server-base-url'] # Base URL of the Authorization server user_role_arn = os.environ['iam-role-arn'] # The IAM role client application will use to complete the HTTP request on the datastore def lambda_handler(event, context): if 'datastoreEndpoint' not in event or 'operationName' not in event or 'bearerToken' not in event: return {} datastore_endpoint = event['datastoreEndpoint'] operation_name = event['operationName'] bearer_token = event['bearerToken'] logger.info('Datastore Endpoint [{}], Operation Name: [{}]'.format(datastore_endpoint, operation_name)) ## To validate the token auth_response = auth_with_provider(bearer_token) logger.info('Auth response: [{}]'.format(auth_response)) auth_payload = json.loads(auth_response) ## Required parameters needed to be sent to the datastore endpoint for the HTTP request to go through auth_payload["isAuthorized"] = bool(auth_payload["active"]) auth_payload["nbf"] = auth_payload["iat"] return {"authPayload": auth_payload, "iamRoleARN": user_role_arn} ## Access the server def auth_with_provider(token): data = {'token': token, 'token_type_hint': 'access_token'} req = request.Request(url=auth_endpoint + '/v1/introspect', data=parse.urlencode(data).encode(), headers=headers) with request.urlopen(req) as resp: return resp.read().decode()
Lambda 함수의 실행 역할 수정
Lambda 함수를 생성한 후 Secrets Manager를 호출하는 데 필요한 권한을 포함하도록 실행 역할을 업데이트해야 합니다. Secrets Manager에서 생성하는 각 보안 암호에는 ARN이 있습니다. 최소 권한을 적용하려면 실행 역할에 Lambda 함수가 실행되는 데 필요한 리소스에만 액세스할 수 있어야 합니다.
IAM 콘솔에서 검색하거나 Lambda 콘솔에서 구성을 선택하여 Lambda 함수의 실행 역할을 수정할 수 있습니다. Lambda 함수 실행 역할 관리에 대한 자세한 내용은 섹션을 참조하세요Lambda 실행 역할.
예 에 대한 액세스 권한을 부여하는 Lambda 함수 실행 역할 GetSecretValue
실행 역할에 IAM 작업을 추가GetSecretValue하면 샘플 Lambda 함수가 작동하는 데 필요한 권한이 부여됩니다.
이 시점에서 FHIR 지원 데이터 스토어의 SMART로 전송된 FHIR REST 요청의 일부로 제공된 액세스 토큰을 검증하는 데 사용할 수 있는 Lambda 함수를 생성했습니다.
JWT를 디코딩하는 데 사용되는 AWS Lambda 함수에 사용할 HealthLake 서비스 역할 생성
페르소나: IAM 관리자
IAM 정책을 추가 또는 제거하고 새 IAM 자격 증명을 생성할 수 있는 사용자입니다.
- 서비스 역할
-
서비스 역할은 서비스가 사용자를 대신하여 작업을 수행하는 것으로 가정하는 IAM 역할입니다. IAM 관리자는 IAM 내에서 서비스 역할을 생성, 수정 및 삭제할 수 있습니다. 자세한 정보는 IAM 사용 설명서의 Create a role to delegate permissions to an AWS 서비스를 참조하세요.
JSON 웹 토큰(JWT)이 디코딩된 후 Lambda는 IAM 역할 ARN도 반환해야 합니다. 이 역할에는 REST API 요청을 수행하는 데 필요한 권한이 있어야 합니다. 그렇지 않으면 권한 부족으로 인해 실패합니다.
IAM을 사용하여 사용자 지정 정책을 설정할 때는 필요한 최소 권한을 부여하는 것이 가장 좋습니다. 자세한 내용은 IAM 사용 설명서의 최소 권한 적용을 참조하세요.
권한 부여 Lambda 함수에서 지정할 HealthLake 서비스 역할을 생성하려면 두 단계가 필요합니다.
-
먼저 IAM 정책을 생성해야 합니다. 정책은 권한 부여 서버에서 범위를 제공한 FHIR 리소스에 대한 액세스를 지정해야 합니다.
-
둘째, 서비스 역할을 생성해야 합니다. 역할을 생성할 때 신뢰 관계를 지정하고 1단계에서 생성한 정책을 연결합니다. 신뢰 관계는 HealthLake를 서비스 보안 주체로 지정합니다. 이 단계에서는 HealthLake 데이터 스토어 ARN과 AWS 계정 ID를 지정해야 합니다.
새 IAM 정책 생성
권한 부여 서버에서 정의한 범위에 따라 인증된 사용자가 HealthLake 데이터 스토어에서 액세스할 수 있는 FHIR 리소스가 결정됩니다.
생성한 IAM 정책은 정의한 범위에 맞게 조정할 수 있습니다.
IAM 정책 설명의 Action 요소에 다음 작업을 정의할 수 있습니다. 테이블의 각 Action에 대해를 정의할 수 있습니다Resource types. HealthLake에서 데이터 스토어는 IAM 권한 정책 문의 Resource 요소에 정의할 수 있는 유일하게 지원되는 리소스 유형입니다.
개별 FHIR 리소스는 IAM 권한 정책에서 요소로 정의할 수 있는 리소스가 아닙니다.
| 작업 | 설명 | 액세스 레벨 | 리소스 유형(필수) |
|---|---|---|---|
CreateResource |
리소스 생성 권한을 부여합니다. |
쓰기 | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id |
| DeleteResource | 리소스를 삭제할 수 있는 권한을 부여합니다. |
쓰기 | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id |
| ReadResource | 리소스를 읽을 수 있는 권한을 부여합니다. |
Read | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id |
| SearchWithGet | GET 메소드로 리소스를 검색할 수 있는 권한을 부여합니다. |
Read | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id |
| SearchWithPost | POST 메소드를 사용하여 리소스를 검색할 수 있는 권한을 부여합니다. | Read | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id |
| StartFHIRExportJobWithPost | GET을 사용하여 FHIR 내보내기 작업을 시작할 수 있는 권한을 부여합니다. |
쓰기 | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id |
| UpdateResource | 리소스를 업데이트할 수 있는 권한을 부여합니다. |
쓰기 | 데이터 스토어 ARN: arn:aws:healthlake:your-region:111122223333:datastore/fhir/your-datastore-id |
시작하려면를 사용할 수 있습니다AmazonHealthLakeFullAccess. 이 정책은 데이터 스토어에 있는 모든 FHIR 리소스에 대한 읽기, 쓰기, 검색 및 내보내기를 부여합니다. 데이터 스토어에 대한 읽기 전용 권한을 부여하려면를 사용합니다AmazonHealthLakeReadOnlyAccess.
AWS Management Console AWS CLI또는 IAM SDKs를 사용하여 사용자 지정 정책을 생성하는 방법에 대한 자세한 내용은 IAM 사용 설명서의 IAM 정책 생성을 참조하세요.
HealthLake에 대한 서비스 역할 생성(IAM 콘솔)
이 절차를 사용하여 서비스 역할을 생성합니다. 서비스를 생성할 때 IAM 정책도 지정해야 합니다.
HealthLake에 대한 서비스 역할을 생성하려면(IAM 콘솔)
-
에 로그인 AWS Management Console 하고 https://console.aws.amazon.com/iam/
IAM 콘솔을 엽니다. -
IAM 콘솔의 탐색 창에서 역할을 선택합니다.
-
그런 다음 역할 생성을 선택합니다.
-
신뢰 엔터티 선택 페이지에서 사용자 지정 신뢰 정책을 선택합니다.
-
그런 다음 사용자 지정 신뢰 정책에서 다음과 같이 샘플 정책을 업데이트합니다.
your-account-id를 계정 번호로 바꾸고 가져오기 또는 내보내기 작업에 사용할 데이터 스토어의 ARN을 추가합니다. -
그런 다음 다음을 선택합니다.
-
권한 추가 페이지에서 HealthLake 서비스가 수임할 정책을 선택합니다. 정책을 찾으려면 권한 정책에서 해당 정책을 검색합니다.
-
그런 다음 정책 연결을 선택합니다.
-
그런 다음 역할 이름 아래의 이름, 검토 및 생성 페이지에서 이름을 입력합니다.
-
(선택 사항) 그런 다음 설명에서 역할에 대한 간단한 설명을 추가합니다.
-
가능한 경우 이 역할의 목적을 식별하는 데 도움이 되는 역할 이름이나 역할 이름 접미사를 입력합니다. 역할 이름은 AWS 계정내에서 고유해야 합니다. 대소문자는 구별하지 않습니다. 예를 들어, 이름이
PRODROLE과prodrole, 두 가지로 지정된 역할을 만들 수는 없습니다. 다양한 주체가 역할을 참조할 수 있기 때문에 역할이 생성된 후에는 역할 이름을 편집할 수 없습니다. -
역할 세부 정보를 검토한 다음 역할 생성을 선택합니다.
샘플 Lambda 함수에서 역할 ARN을 지정하는 방법을 알아보려면 섹션을 참조하세요AWS Lambda 함수 생성.
Lambda 실행 역할
Lambda 함수의 실행 역할은 함수에 AWS 서비스 및 리소스에 액세스할 수 있는 권한을 부여하는 IAM 역할입니다. 이 페이지에서는 Lambda 함수의 실행 역할을 생성하고 보고 관리하는 방법에 대한 정보를 제공합니다.
기본적으로 Lambda는를 사용하여 새 Lambda 함수를 생성할 때 최소한의 권한으로 실행 역할을 생성합니다 AWS Management Console. 실행 역할에 부여된 권한을 관리하려면 Lambda 개발자 안내서의 IAM 콘솔에서 실행 역할 생성을 참조하세요.
이 주제에 제공된 샘플 Lambda 함수는 Secrets Manager를 사용하여 권한 부여 서버의 자격 증명을 가립니다.
생성하는 모든 IAM 역할과 마찬가지로 최소 권한 모범 사례를 따르는 것이 중요합니다. 개발 문구 중에 필요한 것 이상의 권한을 부여하는 경우가 있습니다. 모범 사례로 프로덕션 환경에 함수를 게시하기 전에 필요한 권한만 포함하도록 정책을 조정하는 것이 가장 좋습니다. 자세한 내용은 IAM 사용 설명서의 최소 권한 적용을 참조하세요.
HealthLake가 Lambda 함수를 트리거하도록 허용
HealthLake가 사용자를 대신하여 Lambda 함수를 호출할 수 있도록 다음을 수행해야 합니다.
-
HealthLake가
요청에서 호출할 Lambda 함수의 ARN과CreateFHIRDatastoreIdpLambdaArn동일하게를 설정해야 합니다. -
HealthLake가 사용자를 대신하여 Lambda 함수를 호출하도록 허용하는 리소스 기반 정책이 필요합니다.
HealthLake가 FHIR 지원 데이터 스토어의 SMART에서 FHIR REST API 요청을 수신하면 사용자를 대신하여 데이터 스토어 생성 시 지정된 Lambda 함수를 호출할 권한이 필요합니다. HealthLake 액세스 권한을 부여하려면 리소스 기반 정책을 사용합니다. Lambda 함수에 대한 리소스 기반 정책 생성에 대한 자세한 내용은 AWS Lambda 개발자 안내서의 AWS 서비스에서 Lambda 함수를 호출하도록 허용을 참조하세요.
Lambda 함수에 대한 동시성 프로비저닝
중요
HealthLake를 사용하려면 Lambda 함수의 최대 실행 시간이 1초(1000밀리초) 미만이어야 합니다.
Lambda 함수가 실행 시간 제한을 초과하면 TimeOut 예외가 발생합니다.
이 예외가 발생하지 않도록 프로비저닝된 동시성을 구성하는 것이 좋습니다. 호출이 증가하기 전에 프로비저닝된 동시성을 할당하면 짧은 지연 시간으로 초기화된 인스턴스에서 모든 요청을 처리하도록 할 수 있습니다. 프로비저닝된 동시성 구성에 대한 자세한 내용은 Lambda 개발자 안내서의 프로비저닝된 동시성 구성을 참조하세요.
Lambda 함수의 평균 실행 시간을 보려면 현재 Lambda 콘솔에서 Lambda 함수의 모니터링 페이지를 사용합니다. 기본적으로 Lambda 콘솔은 함수 코드가 이벤트를 처리하는 데 소요되는 평균, 최소 및 최대 시간을 보여주는 기간 그래프를 제공합니다. Lambda 함수 모니터링에 대한 자세한 내용은 Lambda 개발자 안내서의 Lambda 콘솔에서 함수 모니터링을 참조하세요.
Lambda 함수에 대한 동시성을 이미 프로비저닝하고 이를 모니터링하려면 Lambda 개발자 안내서의 동시성 모니터링을 참조하세요.