Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Convalida dei token utilizzando AWS Lambda
Quando si crea un archivio dati HealthLake SMART su FHIR abilitato, è necessario fornire l'ARN della funzione AWS Lambda nella richiesta. L'ARN della funzione Lambda è specificato nell'CreateFHIRDatastoreIdentityProviderConfigurationoggetto utilizzando il parametro. IdpLambdaArn
È necessario creare la funzione Lambda prima di creare l'archivio dati abilitato per SMART on FHIR. Una volta creato il data store, l'ARN Lambda non può essere modificato. Per visualizzare l'ARN Lambda specificato al momento della creazione del data store, utilizza l'azione API. DescribeFHIRDatastore
Affinché una richiesta REST FHIR abbia esito positivo su un data store abilitato SMART on FHIR, la funzione Lambda deve eseguire le seguenti operazioni:
-
Restituisce una risposta in meno di 1 secondo all'endpoint del HealthLake data store.
-
Decodifica il token di accesso fornito nell'intestazione di autorizzazione della richiesta API REST inviata dall'applicazione client.
-
Assegna un ruolo di servizio IAM con autorizzazioni sufficienti per eseguire la richiesta API REST FHIR.
-
Le seguenti affermazioni sono necessarie per completare una richiesta API REST FHIR. Per ulteriori informazioni, consulta Richieste necessarie.
-
nbf -
exp -
isAuthorized -
aud -
scope
-
Quando lavori con Lambda, devi creare un ruolo di esecuzione e una policy basata sulle risorse oltre alla funzione Lambda. Il ruolo di esecuzione di una funzione Lambda è un ruolo IAM che concede alla funzione l'autorizzazione ad accedere ai servizi e alle risorse AWS necessari in fase di esecuzione. La policy basata sulle risorse che fornisci deve consentire di richiamare la tua funzione HealthLake per tuo conto.
Le sezioni di questo argomento descrivono una richiesta di esempio da un'applicazione client e una risposta decodificata, i passaggi necessari per creare una funzione AWS Lambda e come creare una politica basata sulle risorse che possa presupporre. HealthLake
Creazione di una funzione AWS Lambda
La funzione Lambda creata in questo argomento viene attivata quando HealthLake riceve una richiesta a un data store abilitato SMART on FHIR. La richiesta proveniente dall'applicazione client contiene una chiamata API REST e un'intestazione di autorizzazione contenente un token di accesso.
GET https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/ Authorization: Bearer i8hweunweunweofiwweoijewiwe
L'esempio della funzione Lambda in questo argomento utilizza AWS Secrets Manager per oscurare le credenziali relative al server di autorizzazione. Consigliamo vivamente di non fornire i dettagli di accesso al server di autorizzazione direttamente in una funzione Lambda.
Esempio convalida di una richiesta FHIR REST contenente un token del portatore di autorizzazione
La funzione Lambda di esempio mostra come convalidare una richiesta FHIR REST inviata a un archivio dati SMART su FHIR abilitato. Per informazioni step-by-steps su come implementare questa funzione Lambda, vedere. Creazione di una funzione Lambda utilizzando il AWS Management Console
Se la richiesta API REST FHIR non contiene un endpoint di data store, un token di accesso e un'operazione REST validi, la funzione Lambda avrà esito negativo. Per ulteriori informazioni sugli elementi richiesti del server di autorizzazione, consulta. Richieste necessarie
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()
La procedura seguente presuppone che tu abbia già creato il ruolo di servizio che desideri assumere quando gestisci una richiesta API REST FHIR su un data store abilitato HealthLake per SMART on FHIR. Se non hai creato il ruolo di servizio, puoi comunque creare la funzione Lambda. È necessario aggiungere l'ARN del ruolo di servizio prima che la funzione Lambda funzioni. Per ulteriori informazioni sulla creazione di un ruolo di servizio e sulla sua specificazione nella funzione Lambda, consulta Creazione di un ruolo HealthLake di servizio da utilizzare nella funzione AWS Lambda utilizzata per decodificare un JWT
Per creare una funzione Lambda ()AWS Management Console
-
Aprire la pagina Funzioni
della console Lambda. -
Scegli Crea funzione.
-
Scegli Crea da zero.
-
In Informazioni di base, inserisci il nome di una funzione. In Runtime scegli un runtime basato su Python.
-
In Execution role (Ruolo di esecuzione), scegli Create a new role with basic Lambda permissions (Crea un nuovo ruolo con le autorizzazioni Lambda di base).
Lambda crea un ruolo di esecuzione che concede alla funzione l'autorizzazione a caricare i log su Amazon. CloudWatch La funzione Lambda assume il ruolo di esecuzione quando richiami la funzione e utilizza il ruolo di esecuzione per creare credenziali per l'SDK. AWS
-
Scegliete la scheda Codice e aggiungete la funzione Lambda di esempio.
Se non hai ancora creato il ruolo di servizio per la funzione Lambda da utilizzare, dovrai crearlo prima che la funzione Lambda di esempio funzioni. Per ulteriori informazioni sulla creazione di un ruolo di servizio per la funzione Lambda, vedere. Creazione di un ruolo HealthLake di servizio da utilizzare nella funzione AWS Lambda utilizzata per decodificare un JWT
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()
Modifica del ruolo di esecuzione di una funzione Lambda
Dopo aver creato la funzione Lambda, è necessario aggiornare il ruolo di esecuzione per includere le autorizzazioni necessarie per chiamare Secrets Manager. In Secrets Manager, ogni segreto creato ha un ARN. Per applicare il privilegio minimo, il ruolo di esecuzione deve avere accesso solo alle risorse necessarie per l'esecuzione della funzione Lambda.
Puoi modificare il ruolo di esecuzione di una funzione Lambda cercandola nella console IAM o scegliendo Configurazione nella console Lambda. Per ulteriori informazioni sulla gestione del ruolo di esecuzione delle funzioni Lambda, consulta. Ruolo di esecuzione di Lambda
Esempio Ruolo di esecuzione della funzione Lambda che concede l'accesso a GetSecretValue
L'aggiunta dell'azione IAM GetSecretValue al ruolo di esecuzione concede l'autorizzazione necessaria per il funzionamento della funzione Lambda di esempio.
A questo punto hai creato una funzione Lambda che può essere utilizzata per convalidare il token di accesso fornito come parte della richiesta FHIR REST inviata al tuo data store abilitato SMART on FHIR.
Creazione di un ruolo HealthLake di servizio da utilizzare nella funzione AWS Lambda utilizzata per decodificare un JWT
Persona: amministratore IAM
Un utente che può aggiungere o rimuovere policy IAM e creare nuove identità IAM.
- Ruolo del servizio
-
Un ruolo di servizio è un ruolo IAM che un servizio assume per eseguire operazioni per tuo conto. Un amministratore IAM può creare, modificare ed eliminare un ruolo di servizio dall'interno di IAM. Per ulteriori informazioni, consulta la sezione Create a role to delegate permissions to an Servizio AWS nella Guida per l'utente IAM.
Dopo la decodifica del JSON Web Token (JWT), l'autorizzazione necessaria a Lambda deve restituire anche un ruolo IAM ARN. Questo ruolo deve disporre delle autorizzazioni necessarie per eseguire la richiesta API REST o fallirà a causa di autorizzazioni insufficienti.
Quando si configura una policy personalizzata utilizzando IAM, è meglio concedere le autorizzazioni minime richieste. Per ulteriori informazioni, consulta Applica le autorizzazioni con privilegi minimi nella Guida per l'utente IAM.
La creazione di un ruolo di HealthLake servizio da designare nella funzione di autorizzazione Lambda richiede due passaggi.
-
Innanzitutto, è necessario creare una policy IAM. La policy deve specificare l'accesso alle risorse FHIR per le quali sono stati forniti gli ambiti nel server di autorizzazione.
-
In secondo luogo, è necessario creare il ruolo di servizio. Quando si crea il ruolo, si designa una relazione di fiducia e si allega la politica creata nella prima fase. La relazione di fiducia viene designata HealthLake come responsabile del servizio. In questo passaggio è necessario specificare un ARN del HealthLake data store e un ID AWS account.
Creazione di una nuova policy IAM
Gli ambiti definiti nel server di autorizzazione determinano a quali risorse FHIR un utente autenticato ha accesso in un HealthLake archivio dati.
La policy IAM che crei può essere personalizzata per corrispondere agli ambiti che hai definito.
È possibile definire le seguenti azioni nell'Actionelemento di una dichiarazione di policy IAM. Per ognuno Action nella tabella puoi definire unResource types. In HealthLake un data store è l'unico tipo di risorsa supportato che può essere definito nell'Resourceelemento di una dichiarazione di policy di autorizzazione IAM.
Le singole risorse FHIR non sono una risorsa che è possibile definire come elemento in una politica di autorizzazione IAM.
| Operazioni | Descrizione | Livello di accesso | Tipo di risorsa (obbligatorio) |
|---|---|---|---|
CreateResource |
Concede l'autorizzazione a creare una risorsa |
Scrittura | ARN dell'archivio dati: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
| DeleteResource | Concede l'autorizzazione per eliminare la risorsa |
Scrittura | ARN dell'archivio dati: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
| ReadResource | Concede l'autorizzazione per leggere la risorsa |
Lettura | ARN dell'archivio dati: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
| SearchWithGet | Concede l'autorizzazione per cercare risorse con il metodo GET |
Lettura | ARN dell'archivio dati: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
| SearchWithPost | Concede l'autorizzazione per cercare risorse con il metodo POST | Lettura | ARN dell'archivio dati: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
| Inizia FHIRExport JobWithPost | Concede il permesso di iniziare un lavoro in FHIR Export con GET |
Scrittura | ARN dell'archivio dati: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
| UpdateResource | Concede l'autorizzazione per aggiornare la risorsa |
Scrittura | ARN dell'archivio dati: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
Per iniziare, puoi usare. AmazonHealthLakeFullAccess Questa politica garantirebbe la lettura, la scrittura, la ricerca e l'esportazione su tutte le risorse FHIR presenti in un archivio dati. Per concedere autorizzazioni di sola lettura su un data store, utilizzare. AmazonHealthLakeReadOnlyAccess
Per ulteriori informazioni sulla creazione di una policy personalizzata utilizzando o IAM AWS Management Console AWS CLI SDKs, consulta Creating IAM policies nella IAM User Guide.
Creazione di un ruolo di servizio per HealthLake (console IAM)
Utilizzare questa procedura per creare un ruolo di servizio. Quando crei un servizio, dovrai anche designare una policy IAM.
Per creare il ruolo di servizio per HealthLake (console IAM)
-
Accedi AWS Management Console e apri la console IAM all'indirizzo https://console.aws.amazon.com/iam/
. -
Nel pannello di navigazione della console IAM seleziona Ruoli.
-
Quindi seleziona Create role (Crea ruolo).
-
Nella pagina Seleziona un'entità fiduciaria, scegli Politica di fiducia personalizzata.
-
Successivamente, in Politica di fiducia personalizzata, aggiorna la politica di esempio come segue. Sostituisci
your-account-idcon il tuo numero di account e aggiungi l'ARN del data store che desideri utilizzare nei processi di importazione o esportazione. -
Quindi, selezionare Next (Successivo).
-
Nella pagina Aggiungi autorizzazioni, scegli la politica che desideri che il HealthLake servizio assuma. Per trovare la tua politica, cercala in Politiche di autorizzazione.
-
Quindi, scegli Allega politica.
-
Quindi nella pagina Nome, rivedi e crea in Nome del ruolo, inserisci un nome.
-
(Facoltativo) Quindi, in Descrizione, aggiungi una breve descrizione del tuo ruolo.
-
Se possibile, specifica un nome del ruolo o un suffisso del nome del ruolo per facilitare l'identificazione dello scopo del ruolo. I nomi dei ruoli devono essere univoci all'interno dell' Account AWS. Non fanno distinzione tra maiuscole e minuscole. Ad esempio, non è possibile creare ruoli denominati sia
PRODROLEcheprodrole. Poiché varie entità possono fare riferimento al ruolo, non è possibile modificare il nome del ruolo dopo averlo creato. -
Controlla i dettagli del ruolo, quindi scegli Crea ruolo.
Per informazioni su come specificare il ruolo ARN nella funzione Lambda di esempio, vedere. Creazione di una funzione AWS Lambda
Ruolo di esecuzione di Lambda
Il ruolo di esecuzione di una funzione Lambda è un ruolo IAM che concede alla funzione il permesso di accedere a AWS servizi e risorse. Questa pagina fornisce informazioni su come creare, visualizzare e gestire il ruolo di esecuzione di una funzione Lambda.
Per impostazione predefinita, Lambda crea un ruolo di esecuzione con autorizzazioni minime quando si crea una nuova funzione Lambda utilizzando. AWS Management Console Per gestire le autorizzazioni concesse nel ruolo di esecuzione, consulta Creazione di un ruolo di esecuzione nella console IAM nella Lambda Developer Guide.
La funzione Lambda di esempio fornita in questo argomento utilizza Secrets Manager per oscurare le credenziali del server di autorizzazione.
Come per qualsiasi ruolo IAM creato, è importante seguire le best practice con privilegi minimi. Durante la fase di sviluppo, a volte potresti concedere autorizzazioni oltre a quelle richieste. Prima di pubblicare la funzione nell'ambiente di produzione, una best practice consiste nel modificare la policy in modo da includere solo le autorizzazioni richieste. Per ulteriori informazioni, consulta Apply least-privilege nella IAM User Guide.
Consenti HealthLake di attivare la funzione Lambda
Quindi HealthLake puoi invocare la funzione Lambda per tuo conto, devi fare quanto segue:
-
È necessario impostare
IdpLambdaArnuguale all'ARN della funzione Lambda che si desidera HealthLake richiamare nella richiesta.CreateFHIRDatastore -
È necessaria una politica basata sulle risorse che consenta di HealthLake richiamare la funzione Lambda per conto dell'utente.
Quando HealthLake riceve una richiesta API REST FHIR su un data store abilitato SMART on FHIR, ha bisogno delle autorizzazioni per richiamare la funzione Lambda specificata al momento della creazione del data store per conto dell'utente. Per concedere HealthLake l'accesso, utilizzerai una politica basata sulle risorse. Per ulteriori informazioni sulla creazione di una politica basata sulle risorse per una funzione Lambda, consulta Consentire AWS a un servizio di chiamare una funzione Lambda nella Developer Guide.AWS Lambda
Fornire la concorrenza per la funzione Lambda
Importante
HealthLake richiede che il tempo di esecuzione massimo per la funzione Lambda sia inferiore a un secondo (1000 millisecondi).
Se la funzione Lambda supera il limite di tempo di esecuzione, si ottiene un'eccezione. TimeOut
Per evitare che si verifichi questa eccezione, consigliamo di configurare la concorrenza fornita. Allocando la simultaneità fornita prima di un aumento delle chiamate, è possibile assicurarsi che tutte le richieste siano servite da istanze inizializzate con latenza bassa. Per ulteriori informazioni sulla configurazione della concorrenza predisposta, consulta Configuring provisioned concurrency nella Lambda Developer Guide
Per vedere il tempo di esecuzione medio della tua funzione Lambda, utilizza attualmente la pagina Monitoraggio della funzione Lambda sulla console Lambda. Per impostazione predefinita, la console Lambda fornisce un grafico della durata che mostra il tempo medio, minimo e massimo impiegato dal codice della funzione per l'elaborazione di un evento. Per ulteriori informazioni sul monitoraggio delle funzioni Lambda, consulta Monitoring functions in Lambda console Lambda nella Lambda Developer Guide.
Se hai già predisposto la concorrenza per la tua funzione Lambda e desideri monitorarla, consulta Monitoring concurrency nella Lambda Developer Guide.