

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.

# Beschränken des Zugriffs auf eine Funktions-URL für AWS Lambda als Ursprung
<a name="private-content-restricting-access-to-lambda"></a>

CloudFront bietet *Origin Access Control* (OAC), um den Zugriff auf den URL-Ursprung einer Lambda-Funktion einzuschränken.

**Topics**
+ [Erstellen einer neuen OAC](#create-oac-overview-lambda)
+ [Erweiterte Einstellungen für die Ursprungszugriffssteuerung](#oac-advanced-settings-lambda)
+ [Beispielvorlagencode](#example-template-code-lambda-oac)

## Erstellen einer neuen OAC
<a name="create-oac-overview-lambda"></a>

Führen Sie die in den folgenden Themen beschriebenen Schritte aus, um ein neues OAC in einzurichten. CloudFront

**Wichtig**  
Wenn Sie mit Ihrer Lambda-Funktions-URL `POST` Methoden verwenden`PUT`, müssen Ihre Benutzer den SHA256 des Hauptteils berechnen und den Payload-Hashwert des Anforderungstexts in den `x-amz-content-sha256` Header aufnehmen, wenn sie die Anfrage an senden. CloudFront Lambda unterstützt keine unsignierten Nutzdaten.

**Topics**
+ [Voraussetzungen](#oac-prerequisites-lambda)
+ [Erteilen Sie die CloudFront Erlaubnis, auf die URL der Lambda-Funktion zuzugreifen](#oac-permission-to-access-lambda)
+ [Erstellen der OAC](#create-oac-lambda)

### Voraussetzungen
<a name="oac-prerequisites-lambda"></a>

Bevor Sie OAC erstellen und einrichten, benötigen Sie eine CloudFront Distribution mit einer Lambda-Funktions-URL als Ursprung. Für die Verwendung von OAC müssen Sie `AWS_IAM` als Wert für den `AuthType`-Parameter angeben. Weitere Informationen finden Sie unter [Verwenden einer Lambda-Funktions-URL](DownloadDistS3AndCustomOrigins.md#concept_lambda_function_url).

### Erteilen Sie die CloudFront Erlaubnis, auf die URL der Lambda-Funktion zuzugreifen
<a name="oac-permission-to-access-lambda"></a>

Bevor Sie ein OAC erstellen oder es in einer CloudFront Distribution einrichten, stellen Sie sicher, dass es über die Zugriffsberechtigung für die Lambda-Funktions-URL CloudFront verfügt. Tun Sie dies, nachdem Sie eine CloudFront Distribution erstellt haben, aber bevor Sie das OAC zur Lambda-Funktions-URL in der Verteilungskonfiguration hinzufügen.

**Anmerkung**  
Um die IAM-Richtlinie für die Lambda-Funktions-URL zu aktualisieren, müssen Sie die AWS Command Line Interface (AWS CLI) verwenden. Die Bearbeitung der IAM-Richtlinie in der Lambda-Konsole wird derzeit nicht unterstützt.

Der folgende AWS CLI Befehl gewährt dem CloudFront Service Principal (`cloudfront.amazonaws.com`) Zugriff auf Ihre Lambda-Funktions-URL. Das `Condition` Element in der Richtlinie ermöglicht den CloudFront Zugriff auf Lambda *nur*, wenn die Anfrage im Namen der CloudFront Distribution erfolgt, die die URL der Lambda-Funktion enthält. Dies ist die Distribution mit der Lambda-Funktions-URL als Ursprung, der Sie OAC hinzufügen möchten.

**Example : AWS CLI Befehl zum Aktualisieren einer Richtlinie, um für eine Distribution mit aktiviertem OAC nur Lesezugriff zu CloudFront gewähren**  
Die folgenden AWS CLI Befehle ermöglichen der CloudFront Distribution (`E1PDK09ESKHJWT`) den Zugriff auf Ihr Lambda*`FUNCTION_URL_NAME`*.

```
aws lambda add-permission \
--statement-id "AllowCloudFrontServicePrincipal" \
--action "lambda:InvokeFunctionUrl" \
--principal "cloudfront.amazonaws.com" \
--source-arn "arn:aws:cloudfront::123456789012:distribution/E1PDK09ESKHJWT" \
--function-name FUNCTION_URL_NAME
```

```
aws lambda add-permission \
--statement-id "AllowCloudFrontServicePrincipalInvokeFunction" \
--action "lambda:InvokeFunction" \
--principal "cloudfront.amazonaws.com" \
--source-arn "arn:aws:cloudfront::123456789012:distribution/E1PDK09ESKHJWT" \
--function-name FUNCTION_URL_NAME
```

**Anmerkung**  
Wenn Sie eine Distribution erstellen und diese keine Berechtigung für Ihre Lambda-Funktions-URL hat, können Sie in der CloudFront Konsole den **Befehl CLI kopieren** auswählen und diesen Befehl dann über Ihr Befehlszeilenterminal eingeben. Weitere Informationen finden Sie unter [Gewähren des Zugriffs auf Funktionen für AWS-Services](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html#permissions-resource-serviceinvoke) im *Entwicklerhandbuch für AWS Lambda *. 

### Erstellen der OAC
<a name="create-oac-lambda"></a>

Um ein OAC zu erstellen, können Sie die AWS-Managementkonsole, CloudFormation AWS CLI, oder die CloudFront API verwenden.

------
#### [ Console ]

**So erstellen Sie eine OAC**

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die CloudFront Konsole unter[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Wählen Sie im Navigationsbereich **Origin access** (Ursprungszugriff) aus.

1. Wählen Sie **Create control setting** (Kontrolleinstellung erstellen) aus.

1. Führen Sie im Formular **Neue OAC erstellen** die folgenden Schritte aus:

   1. Geben Sie für die OAC einen **Namen** und (optional) eine **Beschreibung** ein.

   1. Es empfiehlt sich, unter **Signierverhalten** die Standardeinstellung **Anforderungen signieren (empfohlen)** zu belassen. Weitere Informationen finden Sie unter [Erweiterte Einstellungen für die Ursprungszugriffssteuerung](#oac-advanced-settings-lambda).

1. Wählen Sie als **Ursprungstyp** die Option **Lambda** aus. 

1. Wählen Sie **Erstellen** aus.
**Tipp**  
Nachdem Sie die OAC erstellt haben, notieren Sie sich den **Namen**. Sie benötigen diesen im folgenden Verfahren.

**So fügen Sie eine Ursprungszugriffssteuerung einer Lambda-Funktions-URL in einer Distribution hinzu**

1. Öffnen Sie die CloudFront Konsole unter[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Wählen Sie eine Distribution mit einer Lambda-Funktions-URL, der Sie die OAC hinzufügen möchten, und dann die Registerkarte **Ursprünge** aus.

1. Wählen Sie die Lambda-Funktions-URL, der Sie die OAC hinzufügen möchten, und dann **Bearbeiten** aus.

1. Wählen Sie **HTTPS only** (Nur HTTPS) für **Protocol** (Protokoll) Ihres Ursprungs aus.

1. Wählen Sie im Dropdown-Menü **Ursprungszugriffssteuerung** den zu verwendenden OAC-Namen aus.

1. Wählen Sie **Änderungen speichern ** aus.

Die Verteilung beginnt mit der Bereitstellung an allen CloudFront Edge-Standorten. Wenn ein Edge-Standort die neue Konfiguration erhält, signiert er alle Anforderungen, die er an die Lambda-Funktions-URL sendet.

------
#### [ CloudFormation ]

Verwenden Sie den `AWS::CloudFront::OriginAccessControl` Ressourcentyp CloudFormation, um ein OAC mit zu erstellen. Das folgende Beispiel zeigt die CloudFormation Vorlagensyntax im YAML-Format für die Erstellung eines OAC.

```
Type: AWS::CloudFront::OriginAccessControl
Properties: 
  OriginAccessControlConfig: 
      Description: An optional description for the origin access control
      Name: ExampleOAC
      OriginAccessControlOriginType: lambda
      SigningBehavior: always
      SigningProtocol: sigv4
```

Weitere Informationen finden Sie im *AWS CloudFormation Benutzerhandbuch* unter [AWS::CloudFront::OriginAccessSteuerung](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-originaccesscontrol.html).

------
#### [ CLI ]

Verwenden Sie den **aws cloudfront create-origin-access-control** Befehl, um eine Origin-Zugriffskontrolle mit dem AWS Command Line Interface (AWS CLI) zu erstellen. Sie können eine Eingabedatei verwenden, um die Eingabeparameter für den Befehl bereitzustellen, anstatt jeden einzelnen Parameter als Befehlszeileneingabe anzugeben.

**So erstellen Sie eine Ursprungszugriffssteuerung (CLI mit Eingabedatei)**

1. Verwenden Sie den folgenden Befehl zum Erstellen einer Datei mit dem Namen `origin-access-control.yaml`. Diese Datei enthält alle Eingabeparameter für den Befehl **create-origin-access-control**.

   ```
   aws cloudfront create-origin-access-control --generate-cli-skeleton yaml-input > origin-access-control.yaml
   ```

1. Öffnen Sie die Datei `origin-access-control.yaml`, die Sie gerade erstellt haben. Bearbeiten Sie die Datei, um einen Namen für die OAC und eine Beschreibung (optional) hinzuzufügen, und ändern Sie `SigningBehavior` zu `always`. Speichern Sie dann die Datei.

   Weitere Informationen zu anderen OAC-Einstellungen finden Sie unter [Erweiterte Einstellungen für die Ursprungszugriffssteuerung](#oac-advanced-settings-lambda).

1. Verwenden Sie den folgenden Befehl, um die Ursprungszugriffssteuerung mit Eingabeparametern aus der Datei `origin-access-control.yaml` zu erstellen.

   ```
   aws cloudfront create-origin-access-control --cli-input-yaml file://origin-access-control.yaml
   ```

   Notieren Sie den `Id`-Wert in der Befehlsausgabe. Sie benötigen es, um das OAC zu einer Lambda-Funktions-URL in einer CloudFront Distribution hinzuzufügen.

**So fügen Sie eine OAC einer Lambda-Funktions-URL in einer vorhandenen Distribution an (CLI mit Eingabedatei)**

1. Verwenden Sie den folgenden Befehl, um die Verteilungskonfiguration für die CloudFront Distribution zu speichern, zu der Sie das OAC hinzufügen möchten. Die Distribution muss eine Lambda-Funktions-URL als Ursprung haben.

   ```
   aws cloudfront get-distribution-config --id <CloudFront distribution ID> --output yaml > dist-config.yaml
   ```

1. Öffnen Sie die Datei mit dem Namen `dist-config.yaml`, die Sie gerade erstellt haben. Bearbeiten Sie die Datei und nehmen Sie die folgenden Änderungen vor:
   + Fügen Sie im Objekt `Origins` die ID der OAC dem Feld namens `OriginAccessControlId` hinzu.
   + Entfernen Sie den Wert aus dem Feld namens `OriginAccessIdentity`, sofern vorhanden.
   + Benennen Sie das Feld `ETag` in `IfMatch` um, ändern Sie jedoch nicht den Wert des Feldes.

   Speichern Sie die Datei, wenn Sie fertig sind.

1. Verwenden Sie den folgenden Befehl, um die Distribution zu aktualisieren und die Ursprungszugriffssteuerung zu verwenden.

   ```
   aws cloudfront update-distribution --id <CloudFront distribution ID> --cli-input-yaml file://dist-config.yaml
   ```

Die Verteilung beginnt mit der Bereitstellung an allen CloudFront Edge-Standorten. Wenn ein Edge-Standort die neue Konfiguration erhält, signiert er alle Anforderungen, die er an die Lambda-Funktions-URL sendet.

------
#### [ API ]

Um ein OAC mit der CloudFront API zu erstellen, verwenden Sie [CreateOriginAccessControl](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateOriginAccessControl.html). Weitere Informationen zu den Feldern, die Sie in diesem API-Aufruf angeben, finden Sie in der API-Referenzdokumentation für Ihr AWS SDK oder einen anderen API-Client.

Nachdem Sie eine OAC erstellt haben, können Sie diese mit einem der folgenden API-Aufrufe an eine Lambda-Funktions-URL in einer Distribution anfügen:
+ Um es an eine bestehende Distribution anzuhängen, verwenden Sie [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html).
+ Um es an eine neue Distribution anzuhängen, verwenden Sie [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html).

Geben Sie für beide API-Aufrufe die ID der OAC im Feld `OriginAccessControlId` innerhalb eines Ursprungs an. Weitere Informationen zu den anderen Feldern, die Sie in diesen API-Aufrufen angeben, finden Sie unter und in der API-Referenzdokumentation für Ihr AWS SDK oder einen anderen API-Client.

------

## Erweiterte Einstellungen für die Ursprungszugriffssteuerung
<a name="oac-advanced-settings-lambda"></a>

Die CloudFront OAC-Funktion umfasst erweiterte Einstellungen, die nur für bestimmte Anwendungsfälle vorgesehen sind. Verwenden Sie die empfohlenen Einstellungen, sofern Sie die erweiterten Einstellungen nicht speziell benötigen.

OAC enthält eine Einstellung mit dem Namen **Signaturverhalten** (in der Konsole) oder `SigningBehavior` (in der API, CLI und CloudFormation). Diese Einstellung bietet die folgenden Optionen:

**Ursprungsanforderungen immer signieren (empfohlene Einstellung)**  
Wir empfehlen die Verwendung dieser Einstellung mit der Bezeichnung **Sign requests (recommended)** (Anforderungen signieren (empfohlen)) in der Konsole bzw. `always` in der API, CLI und CloudFormation. Mit dieser Einstellung signiert es CloudFront immer alle Anfragen, die es an die URL der Lambda-Funktion sendet.

**Ursprungsanforderungen nie signieren**  
Diese Einstellung heißt **Do not sign requests** (Anforderungen nicht signieren) in der Konsole bzw. `never` in der API, CLI und CloudFormation. Verwenden Sie diese Einstellung, um die OAC für alle Ursprünge in allen Distributionen zu deaktivieren, die diese OAC verwenden. Auf diese Weise lässt sich im Vergleich zum einzelnen Entfernen einer OAC aus allen Ursprüngen und Distributionen, die diese verwenden, Zeit und Aufwand sparen. Signiert mit dieser Einstellung CloudFront keine Anfragen, die an die URL der Lambda-Funktion gesendet werden.  
Um diese Einstellung verwenden zu können, muss die Lambda-Funktions-URL öffentlich zugänglich sein. Wenn Sie diese Einstellung mit einer Lambda-Funktions-URL verwenden, die nicht öffentlich zugänglich ist, CloudFront können Sie nicht auf den Ursprung zugreifen. Die URL der Lambda-Funktion gibt Fehler zurück CloudFront und CloudFront leitet diese Fehler an die Betrachter weiter. Weitere Informationen finden Sie unter [Sicherheits- und Authentifizierungsmodell für die Lambda-Funktion URLs](https://docs.aws.amazon.com/lambda/latest/dg/urls-auth.html) im *AWS Lambda Benutzerhandbuch*.

**Viewer (Client)-`Authorization`-Header nicht überschreiben**  
Diese Einstellung heißt **Do not override authorization header** (Autorisierungsheader nicht überschreiben) in der Konsole bzw. `no-override` in der API, CLI und CloudFormation. Verwenden Sie diese Einstellung, wenn Sie ursprüngliche Anfragen nur signieren CloudFront möchten, wenn die entsprechende Viewer-Anfrage keinen Header enthält. `Authorization` Mit dieser Einstellung wird der `Authorization` Header der Viewer-Anfrage weitergegeben, CloudFront wenn eine vorhanden ist, signiert aber die ursprüngliche Anfrage (fügt einen eigenen `Authorization` Header hinzu), wenn die Viewer-Anfrage keinen `Authorization` Header enthält.  
+ Wenn Sie diese Einstellung verwenden, müssen Sie die Signature Version 4-Signatur für die Lambda-Funktions-URL anstelle des Namens oder des CNAME Ihrer CloudFront Distribution angeben. Wenn der `Authorization` Header von der Viewer-Anfrage an die URL der Lambda-Funktion weitergeleitet wird, validiert Lambda die Signatur anhand des Hosts der CloudFront Lambda-URL-Domain. Wenn die Signatur nicht auf der Lambda-URL-Domain basiert, stimmt der Host in der Signatur nicht mit dem Host überein, der vom Lambda-URL-Ursprung verwendet wird. Dies hat zur Folge, dass die Anforderung fehlschlägt, was zu einem Fehler bei der Signaturvalidierung führt.
+ Um den `Authorization` Header aus der Viewer-Anfrage weiterzugeben, *müssen* Sie den `Authorization` Header zu einer [Cache-Richtlinie für alle Cache-Verhaltensweisen](controlling-the-cache-key.md) hinzufügen, die die Lambda-Funktion verwenden, die mit dieser Origin-Zugriffskontrolle URLs verknüpft ist.

## Beispielvorlagencode
<a name="example-template-code-lambda-oac"></a>

Wenn Ihr CloudFront Ursprung eine Lambda-Funktions-URL ist, die mit einem OAC verknüpft ist, können Sie das folgende Python-Skript verwenden, um Dateien mit der Methode in die Lambda-Funktion hochzuladen. `POST` 

Dieser Code setzt voraus, dass Sie die OAC so konfiguriert haben, dass das standardmäßige Signaturverhalten auf **Ursprungsanforderungen immer signieren** eingestellt ist und dass Sie die Einstellung **Autorisierungsheader nicht überschreiben** nicht ausgewählt haben.

Diese Konfiguration ermöglicht es der OAC, die SigV4-Autorisierung mit Lambda mithilfe des Lambda-Hostnamens korrekt zu verwalten. Die Nutzdaten werden mithilfe von SigV4 aus der IAM-Identität signiert, die für die Lambda-Funktions-URL autorisiert ist, die als `IAM_AUTH`-Typ festgelegt ist. 

Die Vorlage zeigt, wie signierte Nutzdaten-Hashwerte im x-amz-content-sha256-Header für clientseitige `POST`-Anforderungen behandelt werden. Diese Vorlage wurde speziell für die Verwaltung von Formulardaten-Nutzdaten entwickelt. Die Vorlage ermöglicht sichere Datei-Uploads an eine Lambda-Funktions-URL und verwendet AWS Authentifizierungsmechanismen CloudFront, um sicherzustellen, dass nur autorisierte Anfragen auf die Lambda-Funktion zugreifen können.

**Der Code umfasst folgende Funktionen:**  
erfüllt die Anforderung, den Nutzdaten-Hash in den x-amz-content-sha256-Header aufzunehmen
Verwendet die SigV4-Authentifizierung für den sicheren Zugriff AWS-Service 
unterstützt Datei-Uploads mithilfe von mehrteiligen Formulardaten
beinhaltet die Fehlerbehandlung für Anforderungsausnahmen

```
import boto3
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest
import requests
import hashlib
import os


def calculate_body_hash(body):
    return hashlib.sha256(body).hexdigest()


def sign_request(request, credentials, region, service):
    sigv4 = SigV4Auth(credentials, service, region)
    sigv4.add_auth(request)


def upload_file_to_lambda(cloudfront_url, file_path, region):
    # AWS credentials
    session = boto3.Session()
    credentials = session.get_credentials()

    # Prepare the multipart form-data
    boundary = "------------------------boundary"

    # Read file content
    with open(file_path, 'rb') as file:
        file_content = file.read()

    # Get the filename from the path
    filename = os.path.basename(file_path)

    # Prepare the multipart body
    body = (
        f'--{boundary}\r\n'
        f'Content-Disposition: form-data; name="file"; filename="{filename}"\r\n'
        f'Content-Type: application/octet-stream\r\n\r\n'
    ).encode('utf-8')
    body += file_content
    body += f'\r\n--{boundary}--\r\n'.encode('utf-8')

    # Calculate SHA256 hash of the entire body
    body_hash = calculate_body_hash(body)

    # Prepare headers
    headers = {
        'Content-Type': f'multipart/form-data; boundary={boundary}',
        'x-amz-content-sha256': body_hash
    }

    # Create the request
    request = AWSRequest(
        method='POST',
        url=cloudfront_url,
        data=body,
        headers=headers
    )

    # Sign the request
    sign_request(request, credentials, region, 'lambda')

    # Get the signed headers
    signed_headers = dict(request.headers)

    # Print request headers before sending
    print("Request Headers:")
    for header, value in signed_headers.items():
        print(f"{header}: {value}")

    try:
        # Send POST request with signed headers
        response = requests.post(
            cloudfront_url,
            data=body,
            headers=signed_headers
        )

        # Print response status and content
        print(f"\nStatus code: {response.status_code}")
        print("Response:", response.text)

        # Print response headers
        print("\nResponse Headers:")
        for header, value in response.headers.items():
            print(f"{header}: {value}")

    except requests.exceptions.RequestException as e:
        print(f"An error occurred: {e}")


# Usage
cloudfront_url = "https://d111111abcdef8.cloudfront.net"
file_path = r"filepath"
region = "us-east-1"  # example: "us-west-2"

upload_file_to_lambda(cloudfront_url, file_path, region)
```