Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Token-Validierung mit AWS Lambda
Wenn Sie einen HealthLake SMART on FHIR-fähigen Datenspeicher erstellen, müssen Sie den ARN der AWS Lambda Funktion in der Anfrage angeben. Der ARN der Lambda-Funktion wird im CreateFHIRDatastoreIdentityProviderConfiguration Objekt mithilfe des IdpLambdaArn Parameters angegeben.
Sie müssen die Lambda-Funktion erstellen, bevor Sie Ihren SMART on FHIR-fähigen Datenspeicher erstellen. Sobald Sie den Datenspeicher erstellt haben, kann der Lambda-ARN nicht mehr geändert werden. Verwenden Sie die API-Aktion, um den Lambda-ARN zu sehen, den Sie bei der Erstellung des Datenspeichers angegeben haben.DescribeFHIRDatastore
Damit eine FHIR-REST-Anfrage auf einem SMART on FHIR-fähigen Datenspeicher erfolgreich ist, muss Ihre Lambda-Funktion Folgendes tun:
-
Gibt in weniger als 1 Sekunde eine Antwort an den HealthLake Datenspeicher-Endpunkt zurück.
-
Dekodieren Sie das Zugriffstoken, das im Autorisierungsheader der von der Client-Anwendung gesendeten REST-API-Anforderung bereitgestellt wird.
-
Weisen Sie eine IAM-Servicerolle zu, die über ausreichende Berechtigungen verfügt, um die FHIR-REST-API-Anfrage auszuführen.
-
Die folgenden Ansprüche sind erforderlich, um eine FHIR-REST-API-Anfrage abzuschließen. Weitere Informationen hierzu finden Sie unter Erforderliche Ansprüche.
-
nbf -
exp -
isAuthorized -
aud -
scope
-
Wenn Sie mit Lambda arbeiten, müssen Sie zusätzlich zu Ihrer Lambda-Funktion eine Ausführungsrolle und eine ressourcenbasierte Richtlinie erstellen. Die Ausführungsrolle einer Lambda-Funktion ist eine IAM-Rolle, die der Funktion die Berechtigung erteilt, auf AWS-Services und -Ressourcen zuzugreifen, die zur Laufzeit benötigt werden. Die von Ihnen bereitgestellte ressourcenbasierte Richtlinie muss es ermöglichen HealthLake , Ihre Funktion in Ihrem Namen aufzurufen.
In den Abschnitten dieses Themas werden eine Beispielanforderung von einer Client-Anwendung und eine dekodierte Antwort, die zum Erstellen einer AWS Lambda-Funktion erforderlichen Schritte und das Erstellen einer ressourcenbasierten Richtlinie beschrieben, die Folgendes voraussetzen kann. HealthLake
Eine AWS Lambda-Funktion erstellen
Die in diesem Thema erstellte Lambda-Funktion wird ausgelöst, wenn Anfragen an einen SMART on FHIR-fähigen Datenspeicher HealthLake empfangen werden. Die Anfrage von der Client-Anwendung enthält einen REST-API-Aufruf und einen Autorisierungsheader, der ein Zugriffstoken enthält.
GET https://healthlake.region.amazonaws.com/datastore/datastoreId/r4/ Authorization: Bearer i8hweunweunweofiwweoijewiwe
Die Lambda-Beispielfunktion in diesem Thema verwendet AWS Secrets Manager , um Anmeldeinformationen für den Autorisierungsserver zu verschleiern. Wir empfehlen dringend, Anmeldedaten für den Autorisierungsserver nicht direkt in einer Lambda-Funktion anzugeben.
Beispiel Validierung einer FHIR-REST-Anfrage, die ein Autorisierungsträgertoken enthält
Die Lambda-Beispielfunktion zeigt Ihnen, wie Sie eine FHIR-REST-Anfrage validieren, die an einen SMART on FHIR-fähigen Datenspeicher gesendet wurde. step-by-stepsAnweisungen zur Implementierung dieser Lambda-Funktion finden Sie unterErstellen einer Lambda-Funktion mit dem AWS Management Console.
Wenn die FHIR-REST-API-Anforderung keinen gültigen Datenspeicher-Endpunkt, kein Zugriffstoken und keinen gültigen REST-Vorgang enthält, schlägt die Lambda-Funktion fehl. Weitere Informationen zu den erforderlichen Autorisierungsserverelementen finden Sie unter. Erforderliche Ansprüche
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()
Beim folgenden Verfahren wird davon ausgegangen, dass Sie die Servicerolle, die Sie bei der Bearbeitung einer FHIR-REST-API-Anfrage in einem SMART on FHIR-fähigen Datenspeicher übernehmen möchten HealthLake , bereits erstellt haben. Wenn Sie die Servicerolle nicht erstellt haben, können Sie trotzdem die Lambda-Funktion erstellen. Sie müssen den ARN der Servicerolle hinzufügen, damit die Lambda-Funktion funktioniert. Weitere Informationen zum Erstellen einer Servicerolle und deren Angabe in der Lambda-Funktion finden Sie unter Erstellen einer HealthLake Servicerolle zur Verwendung in der AWS Lambda-Funktion, die zum Dekodieren eines JWT verwendet wird
Um eine Lambda-Funktion ()AWS Management Console zu erstellen
-
Öffnen Sie die Seite Funktionen
der Lambda-Konsole. -
Wählen Sie Funktion erstellen.
-
Wählen Sie Verfassen von Grund auf aus.
-
Geben Sie unter Basisinformationen einen Funktionsnamen ein. Wählen Sie unter Runtime eine Python-basierte Runtime aus.
-
Wählen Sie für Execution role (Ausführungsrolle) die Option Create a new role with basic Lambda permissions (Neue Rolle mit grundlegenden Lambda-Berechtigungen erstellen) aus.
Lambda erstellt eine Ausführungsrolle, die der Funktion die Berechtigung zum Hochladen von Protokollen auf Amazon CloudWatch erteilt. Die Lambda-Funktion übernimmt die Ausführungsrolle, wenn Sie Ihre Funktion aufrufen, und verwendet die Ausführungsrolle, um Anmeldeinformationen für das AWS SDK zu erstellen.
-
Wählen Sie die Registerkarte Code und fügen Sie die Lambda-Beispielfunktion hinzu.
Wenn Sie die Servicerolle für die zu verwendende Lambda-Funktion noch nicht erstellt haben, müssen Sie sie erstellen, bevor die Lambda-Beispielfunktion funktioniert. Weitere Informationen zum Erstellen einer Servicerolle für die Lambda-Funktion finden Sie unterErstellen einer HealthLake Servicerolle zur Verwendung in der AWS Lambda-Funktion, die zum Dekodieren eines JWT verwendet wird.
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()
Die Ausführungsrolle einer Lambda-Funktion ändern
Nachdem Sie die Lambda-Funktion erstellt haben, müssen Sie die Ausführungsrolle aktualisieren, sodass sie die erforderlichen Berechtigungen zum Aufrufen von Secrets Manager enthält. In Secrets Manager hat jedes Secret, das Sie erstellen, einen ARN. Um die geringste Berechtigung anzuwenden, sollte die Ausführungsrolle nur Zugriff auf die Ressourcen haben, die für die Ausführung der Lambda-Funktion benötigt werden.
Sie können die Ausführungsrolle einer Lambda-Funktion ändern, indem Sie in der IAM-Konsole danach suchen oder in der Lambda-Konsole Konfiguration auswählen. Weitere Informationen zur Verwaltung Ihrer Ausführungsrolle für Lambda-Funktionen finden Sie unterLambda-Ausführungsrolle.
Beispiel Lambda-Funktionsausführungsrolle, die Zugriff gewährt auf GetSecretValue
Durch das Hinzufügen der IAM-Aktion GetSecretValue zur Ausführungsrolle wird die erforderliche Berechtigung erteilt, damit die Lambda-Beispielfunktion funktioniert.
Zu diesem Zeitpunkt haben Sie eine Lambda-Funktion erstellt, mit der Sie das Zugriffstoken validieren können, das als Teil der FHIR-REST-Anfrage an Ihren SMART on FHIR-fähigen Datenspeicher gesendet wurde.
Erstellen einer HealthLake Servicerolle zur Verwendung in der AWS Lambda-Funktion, die zum Dekodieren eines JWT verwendet wird
Persona: IAM-Administrator
Ein Benutzer, der IAM-Richtlinien hinzufügen oder entfernen und neue IAM-Identitäten erstellen kann.
- Servicerolle
-
Eine Servicerolle ist eine IAM-Rolle, die ein Service annimmt, um Aktionen in Ihrem Namen auszuführen. Ein IAM-Administrator kann eine Servicerolle innerhalb von IAM erstellen, ändern und löschen. Weitere Informationen finden Sie unter Erstellen einer Rolle zum Delegieren von Berechtigungen an einen AWS-Service im IAM-Benutzerhandbuch.
Nachdem das JSON Web Token (JWT) dekodiert wurde, benötigt Lambda die Autorisierung, um auch einen IAM-Rollen-ARN zurückzugeben. Diese Rolle muss über die erforderlichen Berechtigungen verfügen, um die REST-API-Anfrage auszuführen. Andernfalls schlägt sie aufgrund unzureichender Berechtigungen fehl.
Bei der Einrichtung einer benutzerdefinierten Richtlinie mithilfe von IAM empfiehlt es sich, die erforderlichen Mindestberechtigungen zu gewähren. Weitere Informationen finden Sie unter Anwenden von Berechtigungen mit den geringsten Rechten im IAM-Benutzerhandbuch.
Das Erstellen einer HealthLake Servicerolle, die in der Autorisierungs-Lambda-Funktion festgelegt werden soll, erfordert zwei Schritte.
-
Zunächst müssen Sie eine IAM-Richtlinie erstellen. Die Richtlinie muss den Zugriff auf die FHIR-Ressourcen spezifizieren, für die Sie Bereiche auf dem Autorisierungsserver bereitgestellt haben.
-
Zweitens müssen Sie die Servicerolle erstellen. Wenn Sie die Rolle erstellen, legen Sie eine Vertrauensbeziehung fest und fügen die Richtlinie hinzu, die Sie in Schritt eins erstellt haben. Die Vertrauensstellung wird als HealthLake Dienstprinzipal bezeichnet. In diesem Schritt müssen Sie einen HealthLake Datenspeicher-ARN und eine AWS Konto-ID angeben.
Eine neue IAM-Richtlinie erstellen
Die Bereiche, die Sie auf Ihrem Autorisierungsserver definieren, bestimmen, auf welche FHIR-Ressourcen ein authentifizierter Benutzer in einem Datenspeicher zugreifen kann. HealthLake
Die von Ihnen erstellte IAM-Richtlinie kann an die von Ihnen definierten Bereiche angepasst werden.
Die folgenden Aktionen können im Action Element einer IAM-Richtlinienerklärung definiert werden. Für jede Action in der Tabelle können Sie eine Resource types definieren. In HealthLake einem Datenspeicher befindet sich der einzige unterstützte Ressourcentyp, der im Resource Element einer IAM-Berechtigungsrichtlinie definiert werden kann.
Einzelne FHIR-Ressourcen sind keine Ressource, die Sie als Element in einer IAM-Berechtigungsrichtlinie definieren können.
| Aktionen | Beschreibung | Zugriffsebene | Ressourcentyp (erforderlich) |
|---|---|---|---|
CreateResource |
Erteilt die Erlaubnis, eine Ressource zu erstellen |
Schreiben | Datenspeicher-ARN: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
| DeleteResource | Gewährt die Berechtigung zum Löschen von Ressourcen |
Schreiben | Datenspeicher-ARN: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
| ReadResource | Gewährt die Berechtigung zum Lesen von Ressourcen |
Lesen | Datenspeicher-ARN: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
| SearchWithGet | Gewährt die Berechtigung, Ressourcen mit der GET-Methode zu durchsuchen |
Lesen | Datenspeicher-ARN: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
| SearchWithPost | Gewährt die Berechtigung, Ressourcen mit der POST-Methode zu durchsuchen | Lesen | Datenspeicher-ARN: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
| Starten FHIRExport JobWithPost | Erteilt die Erlaubnis, einen FHIR-Exportauftrag mit GET zu starten |
Schreiben | Datenspeicher-ARN: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
| UpdateResource | Gewährt die Berechtigung zum Aktualisieren von Ressourcen |
Schreiben | Datenspeicher-ARN: arn:aws:healthlake: ::datastore/fhir/ your-region 111122223333 your-datastore-id |
Um zu beginnen, können Sie verwenden. AmazonHealthLakeFullAccess Diese Richtlinie würde Lese-, Schreib-, Such- und Exportvorgänge für alle FHIR-Ressourcen in einem Datenspeicher zulassen. Um nur Leseberechtigungen für die Verwendung eines Datenspeichers zu gewähren. AmazonHealthLakeReadOnlyAccess
Weitere Informationen zum Erstellen einer benutzerdefinierten Richtlinie mithilfe von AWS Management Console AWS CLI, oder IAM SDKs finden Sie unter Erstellen von IAM-Richtlinien im IAM-Benutzerhandbuch.
Eine Servicerolle für HealthLake (IAM-Konsole) erstellen
Gehen Sie wie folgt vor, um eine Servicerolle zu erstellen. Wenn Sie einen Dienst erstellen, müssen Sie auch eine IAM-Richtlinie festlegen.
Um die Servicerolle für HealthLake (IAM-Konsole) zu erstellen
-
Melden Sie sich bei der an AWS Management Console und öffnen Sie die IAM-Konsole unter. https://console.aws.amazon.com/iam/
-
Wählen Sie im Navigationsbereich der IAM Console Roles (Rollen) aus.
-
Wählen Sie anschließend Create role (Rolle erstellen) aus.
-
Wählen Sie auf der Seite Vertrauensentität auswählen die Option Benutzerdefinierte Vertrauensrichtlinie aus.
-
Aktualisieren Sie anschließend unter Benutzerdefinierte Vertrauensrichtlinie die Beispielrichtlinie wie folgt.
your-account-idErsetzen Sie es durch Ihre Kontonummer und fügen Sie den ARN des Datenspeichers hinzu, den Sie für Ihre Import- oder Exportaufträge verwenden möchten. -
Klicken Sie anschließend auf Next (Weiter).
-
Wählen Sie auf der Seite „Berechtigungen hinzufügen“ die Richtlinie aus, die der HealthLake Dienst annehmen soll. Um Ihre Richtlinie zu finden, suchen Sie unter Berechtigungsrichtlinien danach.
-
Wählen Sie dann Richtlinie anhängen aus.
-
Geben Sie dann auf der Seite Name, Überprüfung und Erstellung unter Rollenname einen Namen ein.
-
(Optional) Fügen Sie anschließend unter Beschreibung eine kurze Beschreibung für Ihre Rolle hinzu.
-
Geben Sie möglichst einen Rollennamen oder ein Rollennamen-Suffix ein, mit dem der Zweck dieser Rolle einfach zu erkennen ist. Rollennamen müssen innerhalb Ihres AWS-Konto-Kontos eindeutig sein. Es wird hierbei nicht zwischen Groß- und Kleinschreibung unterschieden. z. B. können Sie keine Rollen erstellen, die
PRODROLEbzw.prodroleheißen. Da möglicherweise verschiedene Entitäten auf die Rolle verweisen, kann der Rollenname nach der Erstellung nicht bearbeitet werden. -
Überprüfen Sie die Rollendetails und wählen Sie dann Rolle erstellen aus.
Informationen zur Angabe der Rolle ARN in der Lambda-Beispielfunktion finden Sie unterEine AWS Lambda-Funktion erstellen.
Lambda-Ausführungsrolle
Die Ausführungsrolle einer Lambda-Funktion ist eine IAM-Rolle, die der Funktion die Berechtigung zum Zugriff auf AWS Dienste und Ressourcen erteilt. Diese Seite enthält Informationen zum Erstellen, Anzeigen und Verwalten der Ausführungsrolle einer Lambda-Funktion.
Standardmäßig erstellt Lambda eine Ausführungsrolle mit minimalen Berechtigungen, wenn Sie eine neue Lambda-Funktion mit dem erstellen. AWS Management Console Informationen zur Verwaltung der in der Ausführungsrolle gewährten Berechtigungen finden Sie unter Erstellen einer Ausführungsrolle in der IAM-Konsole im Lambda Developer Guide.
Die in diesem Thema vorgestellte Lambda-Beispielfunktion verwendet Secrets Manager, um die Anmeldeinformationen des Autorisierungsservers zu verschleiern.
Wie bei jeder IAM-Rolle, die Sie erstellen, ist es wichtig, die bewährte Methode mit den geringsten Rechten zu befolgen. Während der Entwicklungsphase können Sie manchmal Berechtigungen gewähren, die über das hinausgehen, was erforderlich ist. Bevor Sie Ihre Funktion in der Produktionsumgebung veröffentlichen, sollten Sie als bewährte Methode die Richtlinie so anpassen, dass sie nur die erforderlichen Berechtigungen enthält. Weitere Informationen finden Sie unter Anwenden der geringsten Rechte im IAM-Benutzerhandbuch.
Erlaube HealthLake , deine Lambda-Funktion auszulösen
Um die Lambda-Funktion in Ihrem Namen aufrufen zu HealthLake können, müssen Sie Folgendes tun:
-
Sie müssen den ARN der Lambda-Funktion, die Sie in der Anfrage aufrufen HealthLake möchten,
IdpLambdaArngleich setzen.CreateFHIRDatastore -
Sie benötigen eine ressourcenbasierte Richtlinie, mit der Sie die Lambda-Funktion in Ihrem Namen aufrufen können HealthLake .
Wenn es eine FHIR-REST-API-Anfrage auf einem SMART on FHIR-fähigen Datenspeicher HealthLake empfängt, benötigt es Berechtigungen, um die Lambda-Funktion aufzurufen, die bei der Erstellung des Datenspeichers in Ihrem Namen angegeben wurde. Um HealthLake Zugriff zu gewähren, verwenden Sie eine ressourcenbasierte Richtlinie. Weitere Informationen zum Erstellen einer ressourcenbasierten Richtlinie für eine Lambda-Funktion finden Sie unter Zulassen, dass ein AWS Dienst eine Lambda-Funktion aufruft im Entwicklerhandbuch.AWS Lambda
Bereitstellung von Parallelität für Ihre Lambda-Funktion
Wichtig
HealthLake erfordert, dass die maximale Laufzeit für Ihre Lambda-Funktion weniger als eine Sekunde (1000 Millisekunden) beträgt.
Wenn Ihre Lambda-Funktion das Laufzeitlimit überschreitet, erhalten Sie eine TimeOutAusnahme.
Um zu vermeiden, dass diese Ausnahme auftritt, empfehlen wir, die bereitgestellte Parallelität zu konfigurieren. Wenn Sie Provisioned Concurrency (Bereitgestellte Gleichzeitigkeit) vor einer Erhöhung der Aufrufe zuweisen, können Sie sicherstellen, dass alle Anforderungen von initialisierten Instances mit geringer Latenz verarbeitet werden. Weitere Informationen zur Konfiguration der bereitgestellten Parallelität finden Sie unter Konfiguration der bereitgestellten Parallelität im Lambda Developer Guide
Um die durchschnittliche Laufzeit Ihrer Lambda-Funktion aktuell zu sehen, verwenden Sie die Monitoring-Seite für Ihre Lambda-Funktion in der Lambda-Konsole. Standardmäßig bietet die Lambda-Konsole ein Dauer-Diagramm, das Ihnen die durchschnittliche, minimale und maximale Zeit anzeigt, die Ihr Funktionscode mit der Verarbeitung eines Ereignisses verbringt. Weitere Informationen zur Überwachung von Lambda-Funktionen finden Sie unter Überwachungsfunktionen in der Lambda-Konsole im Lambda Developer Guide.
Wenn Sie bereits Parallelität für Ihre Lambda-Funktion bereitgestellt haben und diese überwachen möchten, finden Sie weitere Informationen unter Überwachung der Parallelität im Lambda Developer Guide.