Validation des jetons en utilisant AWS Lambda - AWS HealthLake

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Validation des jetons en utilisant AWS Lambda

Lorsque vous créez un magasin de données compatible HealthLake SMART sur FHIR, vous devez fournir l'ARN de la AWS Lambda fonction dans la CreateFHIRDatastore demande. L'ARN de la fonction Lambda est spécifié dans l'IdentityProviderConfigurationobjet à l'aide du IdpLambdaArn paramètre.

Vous devez créer la fonction Lambda avant de créer votre magasin de données compatible SMART on FHIR. Une fois que vous avez créé le magasin de données, l'ARN Lambda ne peut pas être modifié. Pour voir l'ARN Lambda que vous avez spécifié lors de la création du magasin de données, utilisez l'action DescribeFHIRDatastore API.

Pour qu'une demande REST FHIR aboutisse sur un magasin de données compatible SMART on FHIR, votre fonction Lambda doit effectuer les opérations suivantes :
  • Renvoie une réponse en moins d'une seconde au point de terminaison du magasin de HealthLake données.

  • Décodez le jeton d'accès fourni dans l'en-tête d'autorisation de la demande d'API REST envoyée par l'application cliente.

  • Attribuez un rôle de service IAM doté d'autorisations suffisantes pour exécuter la demande d'API REST FHIR.

  • Les demandes suivantes sont requises pour compléter une demande d'API REST FHIR. Pour en savoir plus, veuillez consulter la section Demandes requises.

    • nbf

    • exp

    • isAuthorized

    • aud

    • scope

Lorsque vous travaillez avec Lambda, vous devez créer un rôle d'exécution et une politique basée sur les ressources en plus de votre fonction Lambda. Le rôle d'exécution d'une fonction Lambda est un rôle IAM qui accorde à la fonction l'autorisation d'accéder aux services et aux ressources AWS nécessaires au moment de l'exécution. La politique basée sur les ressources que vous fournissez doit HealthLake permettre d'invoquer votre fonction en votre nom.

Les sections de cette rubrique décrivent un exemple de demande provenant d'une application cliente et une réponse décodée, les étapes nécessaires à la création d'une fonction AWS Lambda et la manière de créer une politique basée sur les ressources qui peut être assumée. HealthLake

Création d'une fonction AWS Lambda

La fonction Lambda créée dans cette rubrique est déclenchée lors de la HealthLake réception d'une demande à un magasin de données compatible SMART on FHIR. La demande de l'application cliente contient un appel d'API REST et un en-tête d'autorisation contenant un jeton d'accès.

GET https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/ Authorization: Bearer i8hweunweunweofiwweoijewiwe

L'exemple de fonction Lambda présenté dans cette rubrique permet de masquer AWS Secrets Manager les informations d'identification liées au serveur d'autorisation. Nous vous recommandons vivement de ne pas fournir les informations de connexion au serveur d'autorisation directement dans une fonction Lambda.

Exemple validation d'une requête REST FHIR contenant un jeton porteur d'autorisation

L'exemple de fonction Lambda vous montre comment valider une demande REST FHIR envoyée à un magasin de données compatible SMART on FHIR. Pour savoir step-by-steps comment implémenter cette fonction Lambda, consultez. Création d'une fonction Lambda à l'aide du AWS Management Console

Si la demande d'API REST FHIR ne contient pas de point de terminaison de stockage de données, de jeton d'accès et d'opération REST valides, la fonction Lambda échouera. Pour en savoir plus sur les éléments du serveur d'autorisation requis, consultezDemandes requises.

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 procédure suivante suppose que vous avez déjà créé le rôle de service que vous HealthLake souhaitez assumer lors du traitement d'une demande d'API REST FHIR sur un magasin de données compatible SMART sur FHIR. Si vous n'avez pas créé le rôle de service, vous pouvez toujours créer la fonction Lambda. Vous devez ajouter l'ARN du rôle de service pour que la fonction Lambda fonctionne. Pour en savoir plus sur la création d'un rôle de service et sa spécification dans la fonction Lambda, voir Création d'un rôle HealthLake de service à utiliser dans la fonction AWS Lambda utilisée pour décoder un JWT

Pour créer une fonction Lambda ()AWS Management Console
  1. Ouvrez la page Functions (Fonctions) de la console Lambda.

  2. Choisissez Créer une fonction.

  3. Sélectionnez Créer à partir de zéro.

  4. Dans Informations de base, entrez le nom de la fonction. Sous Runtime, choisissez un environnement d'exécution basé sur Python.

  5. Pour Execution role (Rôle d'exécution), choisissez Create a new role with basic Lambda permissions (Créer un nouveau rôle avec les autorisations Lambda de base).

    Lambda crée un rôle d'exécution qui accorde à la fonction l'autorisation de télécharger des journaux sur Amazon. CloudWatch La fonction Lambda assume le rôle d'exécution lorsque vous appelez votre fonction et utilise le rôle d'exécution pour créer des informations d'identification pour le AWS SDK.

  6. Choisissez l'onglet Code et ajoutez l'exemple de fonction Lambda.

    Si vous n'avez pas encore créé le rôle de service que la fonction Lambda doit utiliser, vous devez le créer pour que l'exemple de fonction Lambda fonctionne. Pour en savoir plus sur la création d'un rôle de service pour la fonction Lambda, consultez. Création d'un rôle HealthLake de service à utiliser dans la fonction AWS Lambda utilisée pour décoder 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()

Modifier le rôle d'exécution d'une fonction Lambda

Après avoir créé la fonction Lambda, vous devez mettre à jour le rôle d'exécution afin d'inclure les autorisations nécessaires pour appeler Secrets Manager. Dans Secrets Manager, chaque secret que vous créez possède un ARN. Pour appliquer le moindre privilège, le rôle d'exécution doit uniquement avoir accès aux ressources nécessaires à l'exécution de la fonction Lambda.

Vous pouvez modifier le rôle d'exécution d'une fonction Lambda en la recherchant dans la console IAM ou en choisissant Configuration dans la console Lambda. Pour en savoir plus sur la gestion de votre rôle d'exécution des fonctions Lambda, consultez. Rôle d'exécution Lambda

Exemple Rôle d'exécution de la fonction Lambda qui donne accès à GetSecretValue

L'ajout de l'action IAM GetSecretValue au rôle d'exécution accorde l'autorisation nécessaire au fonctionnement de l'exemple de fonction Lambda.

À ce stade, vous avez créé une fonction Lambda qui peut être utilisée pour valider le jeton d'accès fourni dans le cadre de la demande REST FHIR envoyée à votre banque de données compatible SMART on FHIR.

Création d'un rôle HealthLake de service à utiliser dans la fonction AWS Lambda utilisée pour décoder un JWT

Persona : administrateur IAM

Utilisateur qui peut ajouter ou supprimer des politiques IAM et créer de nouvelles identités IAM.

Rôle de service

Un rôle de service est un rôle IAM qu’un service endosse pour accomplir des actions en votre nom. Un administrateur IAM peut créer, modifier et supprimer un rôle de service à partir d’IAM. Pour plus d’informations, consultez Création d’un rôle pour la délégation d’autorisations à un Service AWS dans le Guide de l’utilisateur IAM.

Une fois le jeton Web JSON (JWT) décodé, l'autorisation dont Lambda a besoin doit également renvoyer un ARN de rôle IAM. Ce rôle doit disposer des autorisations nécessaires pour exécuter la demande d'API REST, sinon il échouera en raison d'autorisations insuffisantes.

Lorsque vous configurez une politique personnalisée à l'aide d'IAM, il est préférable d'accorder les autorisations minimales requises. Pour en savoir plus, consultez la section Appliquer les autorisations de moindre privilège dans le Guide de l'utilisateur IAM.

La création d'un rôle de HealthLake service à désigner dans la fonction Lambda d'autorisation nécessite deux étapes.

  • Tout d'abord, vous devez créer une politique IAM. La politique doit spécifier l'accès aux ressources FHIR pour lesquelles vous avez fourni des étendues sur le serveur d'autorisation.

  • Ensuite, vous devez créer le rôle de service. Lorsque vous créez le rôle, vous désignez une relation de confiance et vous y associez la politique que vous avez créée à la première étape. La relation de confiance désigne HealthLake le principal du service. Vous devez spécifier un ARN de stockage de HealthLake données et un ID de AWS compte au cours de cette étape.

Création d'une nouvelle politique IAM

Les étendues que vous définissez dans votre serveur d'autorisation déterminent les ressources FHIR auxquelles un utilisateur authentifié a accès dans un HealthLake magasin de données.

La politique IAM que vous créez peut être adaptée aux étendues que vous avez définies.

Les actions suivantes peuvent être définies dans l'Actionélément d'une déclaration de politique IAM. Pour chacun Action des éléments du tableau, vous pouvez définir unResource types. Dans HealthLake un magasin de données, le seul type de ressource pris en charge peut être défini dans l'Resourceélément d'une déclaration de politique d'autorisation IAM.

Les ressources FHIR individuelles ne sont pas des ressources que vous pouvez définir en tant qu'élément d'une politique d'autorisation IAM.

Actions définies par HealthLake
Actions Description Niveau d’accès Type de ressource (obligatoire)

CreateResource

Accorde l'autorisation de créer une ressource

Écrire ARN de la banque de données : arn:aws:healthlake : ::datastore/fhir/ your-region 111122223333 your-datastore-id
DeleteResource

Accorde l'autorisation de supprimer une ressource

Écrire ARN de la banque de données : arn:aws:healthlake : ::datastore/fhir/ your-region 111122223333 your-datastore-id
ReadResource

Accorde l'autorisation de lire une ressource

Lecture ARN de la banque de données : arn:aws:healthlake : ::datastore/fhir/ your-region 111122223333 your-datastore-id
SearchWithGet

Accorde l'autorisation de rechercher des ressources avec la méthode GET

Lecture ARN de la banque de données : arn:aws:healthlake : ::datastore/fhir/ your-region 111122223333 your-datastore-id
SearchWithPost Accorde l'autorisation de rechercher des ressources avec la méthode POST Lecture ARN de la banque de données : arn:aws:healthlake : ::datastore/fhir/ your-region 111122223333 your-datastore-id
Démarrer FHIRExport JobWithPost

Donne l'autorisation de commencer un travail d'exportation FHIR avec GET

Écrire ARN de la banque de données : arn:aws:healthlake : ::datastore/fhir/ your-region 111122223333 your-datastore-id
UpdateResource

Accorde l'autorisation de mettre à jour des ressources

Écrire ARN de la banque de données : arn:aws:healthlake : ::datastore/fhir/ your-region 111122223333 your-datastore-id

Pour commencer, vous pouvez utiliserAmazonHealthLakeFullAccess. Cette politique autoriserait la lecture, l'écriture, la recherche et l'exportation de toutes les ressources FHIR présentes dans un magasin de données. Pour accorder des autorisations de lecture seule sur un magasin de données, utilisez. AmazonHealthLakeReadOnlyAccess

Pour en savoir plus sur la création d'une politique personnalisée à l'aide de AWS Management Console AWS CLI, ou IAM SDKs, consultez la section Création de politiques IAM dans le guide de l'utilisateur IAM.

Création d'un rôle de service pour HealthLake (console IAM)

Utilisez cette procédure pour créer un rôle de service. Lorsque vous créez un service, vous devez également définir une politique IAM.

Pour créer le rôle de service pour HealthLake (console IAM)
  1. Connectez-vous à la console IAM AWS Management Console et ouvrez-la à https://console.aws.amazon.com/iam/l'adresse.

  2. Dans le panneau de navigation de la console IAM, sélectionnez Roles (Rôles).

  3. Puis, choisissez Create role (Créer un rôle).

  4. Sur la page Sélectionner une entité de confiance, choisissez Politique de confiance personnalisée.

  5. Ensuite, sous Politique de confiance personnalisée, mettez à jour l'exemple de politique comme suit. Remplacez-le your-account-id par votre numéro de compte et ajoutez l'ARN du magasin de données que vous souhaitez utiliser dans vos tâches d'importation ou d'exportation.

  6. Ensuite, choisissez Next (Suivant).

  7. Sur la page Ajouter des autorisations, choisissez la politique que vous souhaitez que le HealthLake service adopte. Pour trouver votre politique, recherchez-la dans Politiques d'autorisations.

  8. Choisissez ensuite Attach policy.

  9. Ensuite, sur la page Nom, révision et création sous Nom du rôle, entrez un nom.

  10. (Facultatif) Ensuite, sous Description, ajoutez une brève description de votre rôle.

  11. Si possible, saisissez un nom de rôle ou le suffixe d'un nom de rôle vous permettant d'identifier l'objectif du rôle. Les noms de rôle doivent être uniques dans votre Compte AWS. Ils ne sont pas sensibles à la casse. Par exemple, vous ne pouvez pas créer deux rôles nommés PRODROLE et prodrole. Différentes entités peuvent référencer le rôle et il n'est donc pas possible de modifier son nom après sa création.

  12. Passez en revue les détails du rôle, puis choisissez Créer un rôle.

Pour savoir comment spécifier l'ARN du rôle dans l'exemple de fonction Lambda, consultez. Création d'une fonction AWS Lambda

Rôle d'exécution Lambda

Le rôle d'exécution d'une fonction Lambda est un rôle IAM qui accorde à la fonction l'autorisation d'accéder aux AWS services et aux ressources. Cette page fournit des informations sur la façon de créer, d’afficher et de gérer le rôle d’exécution d’une fonction Lambda.

Par défaut, Lambda crée un rôle d'exécution avec des autorisations minimales lorsque vous créez une nouvelle fonction Lambda à l'aide du. AWS Management Console Pour gérer les autorisations accordées dans le rôle d'exécution, consultez la section Création d'un rôle d'exécution dans la console IAM du guide du développeur Lambda.

L'exemple de fonction Lambda fourni dans cette rubrique utilise Secrets Manager pour masquer les informations d'identification du serveur d'autorisation.

Comme pour tout rôle IAM que vous créez, il est important de suivre les meilleures pratiques du moindre privilège. Au cours de la phase de développement, vous pouvez parfois accorder des autorisations au-delà de ce qui est requis. Avant de publier votre fonction dans l’environnement de production, une bonne pratique consiste à ajuster la stratégie de manière à inclure uniquement les autorisations requises. Pour plus d'informations, consultez la section Appliquer le moindre privilège dans le guide de l'utilisateur IAM.

HealthLake Autoriser le déclenchement de votre fonction Lambda

HealthLake Vous pouvez donc invoquer la fonction Lambda en votre nom, vous devez procéder comme suit :

  • Vous devez définir une IdpLambdaArn valeur égale à l'ARN de la fonction Lambda que vous HealthLake souhaitez invoquer dans la CreateFHIRDatastore demande.

  • Vous avez besoin d'une politique basée sur les ressources permettant HealthLake d'appeler la fonction Lambda en votre nom.

Lorsqu'il HealthLake reçoit une demande d'API REST FHIR sur un magasin de données compatible SMART on FHIR, il a besoin d'autorisations pour appeler la fonction Lambda spécifiée lors de la création du magasin de données en votre nom. Pour accorder HealthLake l'accès, vous allez utiliser une politique basée sur les ressources. Pour en savoir plus sur la création d'une politique basée sur les ressources pour une fonction Lambda, voir Autoriser un AWS service à appeler une fonction Lambda dans le Guide du développeur.AWS Lambda

Provisionnement de la simultanéité pour votre fonction Lambda

Important

HealthLake exige que la durée d'exécution maximale de votre fonction Lambda soit inférieure à une seconde (1 000 millisecondes).

Si votre fonction Lambda dépasse la limite de temps d'exécution, vous obtenez une TimeOutexception.

Pour éviter cette exception, nous vous recommandons de configurer la simultanéité provisionnée. En allouant la simultanéité provisionnée avant une augmentation des appels, vous pouvez vous assurer que toutes les demandes sont servies par des instances initialisées avec une faible latence. Pour en savoir plus sur la configuration de la simultanéité provisionnée, voir Configuration de la simultanéité provisionnée dans le Guide du développeur Lambda

Pour connaître la durée d'exécution moyenne de votre fonction Lambda, utilisez actuellement la page de surveillance de votre fonction Lambda sur la console Lambda. Par défaut, la console Lambda fournit un graphique de durée qui indique le temps moyen, minimum et maximum consacré par votre code de fonction au traitement d'un événement. Pour en savoir plus sur la surveillance des fonctions Lambda, consultez la section Surveillance des fonctions dans la console Lambda dans le guide du développeur Lambda.

Si vous avez déjà configuré la simultanéité pour votre fonction Lambda et que vous souhaitez la surveiller, consultez la section Surveillance de la simultanéité dans le guide du développeur Lambda.