

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.

# Amazon API Gateway-Tutorials und -Workshops
<a name="api-gateway-tutorials"></a>

Die folgenden Tutorials und Workshops bieten praktische Übungen, die Ihnen beim Kennenlernen von API Gateway helfen. Wir empfehlen Ihnen, zunächst [Tutorial: Erstellen einer REST-API mit einer Lambda-Proxy-Integration](api-gateway-create-api-as-simple-proxy-for-lambda.md) abzuschließen. 

**REST API-Tutorials**
+ [Wählen Sie ein AWS Lambda Integrations-Tutorial](getting-started-with-lambda-integration.md)
+ [Tutorial: Erstellen einer REST-API durch Importieren eines Beispiels](api-gateway-create-api-from-example.md)
+ [Wählen Sie ein Tutorial zur HTTP-Integration aus](getting-started-http-integrations.md)
+ [Tutorial: Erstellen einer REST-API mit einer privaten Integration](getting-started-with-private-integration.md)
+ [Tutorial: Erstellen Sie eine REST-API mit einer AWS Integration](getting-started-aws-proxy.md)
+ [Tutorial: Erstellen Sie eine Rechner-REST-API mit zwei AWS Serviceintegrationen und einer Lambda-Non-Proxy-Integration](integrating-api-with-aws-services-lambda.md)
+ [Tutorial: REST-API als AmazonS3-Proxy erstellen](integrating-api-with-aws-services-s3.md)
+ [Tutorial: REST-API als Amazon Kinesis-Proxy erstellen](integrating-api-with-aws-services-kinesis.md)
+ [Tutorial: Erstellen Sie eine REST-API mit AWS SDKs oder AWS CLI](api-gateway-create-api-cli-sdk.md)
+ [Tutorial: Erstellen einer privaten REST-API](private-api-tutorial.md)

**HTTP API-Tutorials**
+ [Tutorial: Erstellen einer CRUD-HTTP-API mit Lambda und DynamoDB](http-api-dynamo-db.md)
+ [Tutorial: Erstellen einer HTTP-API mit privater Integration für einen Amazon-ECS-Service](http-api-private-integration.md)

**WebSocket-API-Tutorials**
+ [Tutorial: Erstellen Sie eine WebSocket Chat-App mit einer WebSocket API, Lambda und DynamoDB](websocket-api-chat-app.md)

**Workshops**
+ [Erstellen einer Serverless-Webanwendung](https://webapp.serverlessworkshops.io)
+ [CI/CD für Serverless-Anwendungen](https://cicd.serverlessworkshops.io)
+ [Workshop für Serverless-Sicherheit](https://github.com/aws-samples/aws-serverless-security-workshop)
+ [Serverless-Identitätsverwaltung, -Authentifizierung und -Autorisierung](https://auth.serverlessworkshops.io)
+ [Der Amazon-API-Gateway-Workshop](https://catalog.workshops.aws/apigateway/en-US)

# Amazon API Gateway-REST-API-Tutorials
<a name="api-gateway-rest-tutorials"></a>

Die folgenden Tutorials enthalten praktische Übungen, die Ihnen helfen, mehr über API Gateway REST APIs zu erfahren.

**Topics**
+ [Wählen Sie ein AWS Lambda Integrations-Tutorial](getting-started-with-lambda-integration.md)
+ [Tutorial: Erstellen einer REST-API durch Importieren eines Beispiels](api-gateway-create-api-from-example.md)
+ [Wählen Sie ein Tutorial zur HTTP-Integration aus](getting-started-http-integrations.md)
+ [Tutorial: Erstellen einer REST-API mit einer privaten Integration](getting-started-with-private-integration.md)
+ [Tutorial: Erstellen Sie eine REST-API mit einer AWS Integration](getting-started-aws-proxy.md)
+ [Tutorial: Erstellen Sie eine Rechner-REST-API mit zwei AWS Serviceintegrationen und einer Lambda-Non-Proxy-Integration](integrating-api-with-aws-services-lambda.md)
+ [Tutorial: REST-API als AmazonS3-Proxy erstellen](integrating-api-with-aws-services-s3.md)
+ [Tutorial: REST-API als Amazon Kinesis-Proxy erstellen](integrating-api-with-aws-services-kinesis.md)
+ [Tutorial: Erstellen Sie eine REST-API mit AWS SDKs oder AWS CLI](api-gateway-create-api-cli-sdk.md)
+ [Tutorial: Erstellen einer privaten REST-API](private-api-tutorial.md)

# Wählen Sie ein AWS Lambda Integrations-Tutorial
<a name="getting-started-with-lambda-integration"></a>

 Um eine API mit Lambda-Integrationen zu erstellen, können Sie die Lambda-Proxy-Integration oder die Lambda-Non-Proxy-Integration verwenden. 

Bei der Lambda-Proxy-Integration kann die Eingabe für die Lambda-Funktion als eine beliebige Kombination von Anforderungs-Headern, Pfadvariablen, Abfragezeichenfolgen-Parametern, Text und API-Konfigurationsdaten ausgedrückt werden. Sie wählen ganz einfach eine Lambda-Funktion aus. API Gateway konfiguriert die Integrationsanforderung und Integrationsantwort für Sie. Sobald sie eingerichtet ist, kann sich Ihre API-Methode ohne Änderungen an den vorhandenen Einstellungen weiterentwickeln. Dies ist möglich, da die Backend-Lambda-Funktion die eingehenden Anforderungsdaten analysiert und dem Client antwortet.

Bei der Lambda-Nicht-Proxy-Integration müssen Sie sicherstellen, dass die Eingabe an die Lambda-Funktion als Payload der Integrationsanforderung geliefert wird. Sie müssen alle vom Client bereitgestellten Eingabedaten zum entsprechenden Integrationsanforderungstext als Anforderungsparameter zuordnen. Möglicherweise müssen Sie auch den vom Client bereitgestellten Anfragetextkörper in ein Format umwandeln, das von der Lambda-Funktion erkannt wird. 

In einem Lambda-Proxy- oder einer Lambda-Nicht-Proxy-Integration können Sie eine Lambda-Funktion in einem anderen Konto als dem Konto verwenden, in dem Sie Ihre API erstellt haben.

**Topics**
+ [Tutorial: Erstellen einer REST-API mit einer Lambda-Proxy-Integration](api-gateway-create-api-as-simple-proxy-for-lambda.md)
+ [Tutorial: Erstellen einer REST-API mit einer Lambda-Nicht-Proxy-Integration](getting-started-lambda-non-proxy-integration.md)
+ [Tutorial: REST-API mit kontenübergreifender Lambda-Proxy-Integration erstellen](apigateway-cross-account-lambda-integrations.md)

# Tutorial: Erstellen einer REST-API mit einer Lambda-Proxy-Integration
<a name="api-gateway-create-api-as-simple-proxy-for-lambda"></a>

[Lambda-Proxy-Integration](set-up-lambda-proxy-integrations.md) ist ein einfacher, flexibler API Gateway API-Integrationstyp, der es Ihnen ermöglicht, eine API-Methode – oder eine ganze API – mit einer Lambda-Funktion zu integrieren. Die Lambda-Funktion kann in [jeder Sprache, die Lambda unterstützt ](https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html) geschrieben werden. Da es sich um eine Proxy-Integration handelt, können Sie die Implementierung der Lambda-Funktion jederzeit ändern, ohne Ihre API erneut bereitstellen zu müssen.

In diesem Tutorial führen Sie folgende Aufgaben aus:
+ Erstellen Sie eine "Hello, World\$1"- Die Lambda-Funktion ist das Backend für die API.
+ Erstellen und testen Sie eine "Hello, World\$1"- API mit Lambda-Proxy-Integration.

**Topics**
+ [Erstellen Sie eine "Hello, World\$1"- Lambda-Funktion](#api-gateway-proxy-integration-create-lambda-backend)
+ [Erstellen Sie eine "Hello, World\$1"- API](#api-gateway-create-api-as-simple-proxy-for-lambda-build)
+ [Bereitstellen und Testen der API](#api-gateway-create-api-as-simple-proxy-for-lambda-test)

## Erstellen Sie eine "Hello, World\$1"- Lambda-Funktion
<a name="api-gateway-proxy-integration-create-lambda-backend"></a>

**Erstellen von „Hello, World\$1“ Lambda-Funktion in der Lambda-Konsole**

1. Melden Sie sich bei der Lambda-Konsole unter [https://console.aws.amazon.com/lambda](https://console.aws.amazon.com/lambda) an.

1. Wählen Sie in der AWS Navigationsleiste eine. [AWS-Region](https://docs.aws.amazon.com/general/latest/gr/apigateway.html)
**Anmerkung**  
Notieren Sie die Region, in der Sie die Lambda-Funktion erstellen. Sie benötigen sie zum Erstellen der API.

1. Wählen Sie im Navigationsbereich **Functions (Funktionen)** aus.

1. Wählen Sie **Create function (Funktion erstellen)**.

1. Wählen Sie **Author from scratch** aus.

1. Führen Sie unter **Basic information (Grundlegende Informationen)** die folgenden Schritte aus:

   1. Geben Sie in **Function name (Funktionsname)** **GetStartedLambdaProxyIntegration** ein.

   1. Wählen Sie für **Laufzeit** die neueste unterstützte **Node.js**- oder **Python**-Laufzeit aus.

   1. Behalten Sie für **Architektur** die Standardeinstellung bei.

   1. Erweitern Sie unter **Berechtigungen** die Option **Standardausführungsrolle ändern**. Wählen Sie in der Dropdown-Liste **Ausführungsrolle** die Option **Neue Rolle aus AWS -Richtlinienvorlagen erstellen** aus.

   1. Geben Sie in **Role Name (Rollenname)** den Namen **GetStartedLambdaBasicExecutionRole** ein.

   1. Lassen Sie das Feld **Policy templates** (Richtlinien-Vorlagen) leer.

   1. Wählen Sie **Create function (Funktion erstellen)**.

1. Im **Inline-Code-Editor finden Sie unter Funktionscode** copy/paste den folgenden Code:

------
#### [ Node.js ]

   ```
   export const handler = async(event, context) => {
       console.log('Received event:', JSON.stringify(event, null, 2));
       var res ={
           "statusCode": 200,
           "headers": {
               "Content-Type": "*/*"
           }
       };
       var greeter = 'World';
       if (event.greeter && event.greeter!=="") {
           greeter =  event.greeter;
       } else if (event.body && event.body !== "") {
           var body = JSON.parse(event.body);
           if (body.greeter && body.greeter !== "") {
               greeter = body.greeter;
           }
       } else if (event.queryStringParameters && event.queryStringParameters.greeter && event.queryStringParameters.greeter !== "") {
           greeter = event.queryStringParameters.greeter;
       } else if (event.multiValueHeaders && event.multiValueHeaders.greeter && event.multiValueHeaders.greeter != "") {
           greeter = event.multiValueHeaders.greeter.join(" and ");
       } else if (event.headers && event.headers.greeter && event.headers.greeter != "") {
           greeter = event.headers.greeter;
       } 
       res.body = "Hello, " + greeter + "!";
       return res
   };
   ```

------
#### [ Python ]

   ```
   import json
   
   
   def lambda_handler(event, context):
       print(event)
   
       greeter = 'World'
   
       try:
           if (event['queryStringParameters']) and (event['queryStringParameters']['greeter']) and (
                   event['queryStringParameters']['greeter'] is not None):
               greeter = event['queryStringParameters']['greeter']
       except KeyError:
           print('No greeter')
   
       try:
           if (event['multiValueHeaders']) and (event['multiValueHeaders']['greeter']) and (
                   event['multiValueHeaders']['greeter'] is not None):
               greeter = " and ".join(event['multiValueHeaders']['greeter'])
       except KeyError:
           print('No greeter')
   
       try:
           if (event['headers']) and (event['headers']['greeter']) and (
                   event['headers']['greeter'] is not None):
               greeter = event['headers']['greeter']
       except KeyError:
           print('No greeter')
   
       if (event['body']) and (event['body'] is not None):
           body = json.loads(event['body'])
           try:
               if (body['greeter']) and (body['greeter'] is not None):
                   greeter = body['greeter']
           except KeyError:
               print('No greeter')
   
       res = {
           "statusCode": 200,
           "headers": {
               "Content-Type": "*/*"
           },
           "body": "Hello, " + greeter + "!"
       }
   
       return res
   ```

------

1. Wählen Sie **Deploy (Bereitstellen)** aus.

## Erstellen Sie eine "Hello, World\$1"- API
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-build"></a>

Erstellen Sie jetzt eine API für Ihre "Hello World" Lambda-Funktion unter Verwendung der API Gateway-Konsole.

**Erstellen von „Hello, World\$1“ API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wenn Sie API Gateway zum ersten Mal verwenden, sehen Sie eine Seite, die Sie mit den Funktionen des Service vertraut macht. Wählen Sie unter **REST-API** die Option **Erstellen** aus. Wenn das Popup-Fenster **Create Example API (Beispiel-API erstellen)** angezeigt wird, klicken Sie auf **OK**.

   Wenn Sie API Gateway nicht zum ersten Mal verwenden, wählen Sie **Create API (API erstellen)**. Wählen Sie unter **REST-API** die Option **Build (Erstellen)** aus.

1.  Geben Sie in **API name** (API-Name) **LambdaProxyAPI** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Lassen Sie die Einstellung für **API-Endpunkttyp** bei **Regional**.

1. Wählen Sie als **IP-Adresstyp** die Option. **IPv4**

1. Wählen Sie **Create API** (API erstellen) aus.

Nachdem Sie eine API erstellt haben, können Sie nun eine Ressource erstellen. In der Regel werden API-Ressourcen in einer Ressourcenstruktur organisiert, die der Anwendungslogik entspricht. Für dieses Beispiel erstellen Sie eine **/helloworld**-Ressource. 

**So erstellen Sie eine Ressource**

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1. Die **Proxy-Ressource** bleibt ausgeschaltet. 

1. **Ressourcenpfad** wird als `/` beibehalten.

1. Geben Sie für **Resource name (Ressourcenname)** **helloworld** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

 In einer Proxy-Integration wird die gesamte Anfrage unverändert an die Backend-Lambda-Funktion gesendet. Dazu wird eine Catch-All-`ANY`-Methode verwendet, die eine HTTP-Methode repräsentiert. Der tatsächliche HTTP-Methode wird vom Client zur Laufzeit angegeben. Mit der Methode `ANY` haben Sie die Möglichkeit, eine einzige API-Methodeneinrichtung für alle unterstützten HTTP-Methoden zu verwenden: `DELETE`, `GET`, `HEAD`, `OPTIONS`, `PATCH`, `POST` und `PUT`.

**Erstellen einer `ANY`-Methode**

1. Wählen Sie die **/helloworld**-Ressource aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie als **Methodentyp** die Option **BELIEBIG** aus.

1. Wählen Sie für den **Integration type** (Integrationstyp) die Option **Lambda function** (Lambda-Funktion) aus.

1. Schalten Sie die **Lambda-Proxy-Integration** ein.

1. Wählen Sie für **Lambda-Funktion** den Ort aus, AWS-Region an dem Sie Ihre Lambda-Funktion erstellt haben, und geben Sie dann den Funktionsnamen ein.

1. Wenn Sie die Standardzeitüberschreitung von 29 Sekunden verwenden möchten, lassen Sie das Kontrollkästchen **Default timeout** (Standardzeitüberschreitung) aktiviert. Wenn Sie einen benutzerdefinierten Zeitüberschreitungswert festlegen möchten, wählen Sie **Default timeout** (Standardzeitüberschreitung) aus und geben Sie einen Zeitüberschreitungswert zwischen `50` und `29000` Millisekunden ein.

1. Wählen Sie **Methode erstellen** aus.

## Bereitstellen und Testen der API
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-test"></a>

**Stellen Sie Ihre API bereit**

1. Klicken Sie auf **Deploy API**.

1. Wählen Sie für **Stufe** die Option **Neue Stufe** aus.

1. Geben Sie für **Stage name (Stufenname)** **test** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Wählen Sie **Bereitstellen**.

1. Wählen Sie unter **Stufendetails** das Kopiersymbol aus, um die Aufruf-URL Ihrer API zu kopieren.

### Browser und cURL verwenden, um eine API mit Lambda-Proxy-Integration zu testen
<a name="api-gateway-create-api-as-simple-proxy-for-lambda-test-curl"></a>

Sie können einen Browser oder eine [cURL](https://curl.se/) zum Testen Ihrer API verwenden.

Um `GET`-Anforderungen nur mit Abfragezeichenfolgeparametern zu testen, können Sie die URL der API-`helloworld`-Ressource in die Adressleiste eines Browsers eingeben. 

Fügen Sie die Ressource `helloworld` und den Abfragezeichenfolgeparameter `?greeter=John` an Ihre Aufruf-URL an, um die URL für die API-`helloworld`-Ressource zu erstellen. Ihre URL sollte wie folgt aussehen.

```
https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John
```

Für andere Methoden müssen Sie erweiterte REST-API-Testtools wie [POSTMAN](https://www.postman.com/) oder [cURL](https://curl.se/) verwenden. In diesem Tutorial wird cURL verwendet. Bei den cURL-Befehl-Beispielen wird davon ausgegangen, dass cURL auf Ihrem Computer installiert ist.

**So testen Sie die bereitgestellte API mithilfe von cURL:**

1. Öffnen Sie ein Terminal-Fenster.

1. Kopieren Sie den folgenden cURL-Befehl und fügen Sie ihn in das Terminalfenster ein. Ersetzen Sie dann die Aufruf-URL mit der URL, die Sie zuvor kopiert haben und fügen Sie dann **/helloworld** am Ende der URL hinzu.
**Anmerkung**  
Wenn Sie den Befehl unter Windows ausführen, verwenden Sie stattdessen die folgende Syntax:  

   ```
   curl -v -X POST "https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld" -H "content-type: application/json" -d "{ \"greeter\": \"John\" }"
   ```

   1. So rufen Sie die API mit dem Abfragezeichenfolgeparameter `?greeter=John` auf:

      ```
      curl -X GET 'https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld?greeter=John'
      ```

   1. So rufen Sie die API mit einem Header-Parameter von `greeter:John` auf:

      ```
      curl -X GET https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \
        -H 'content-type: application/json' \
        -H 'greeter: John'
      ```

   1. So rufen Sie die API mit einem Textkörper von `{"greeter":"John"}` auf:

      ```
      curl -X POST https://r275xc9bmd.execute-api.us-east-1.amazonaws.com/test/helloworld \
        -H 'content-type: application/json' \
        -d '{ "greeter": "John" }'
      ```

   In allen Fällen ist die Ausgabe eine Antwort mit dem folgenden Antworttext: 200

   ```
   Hello, John!
   ```

# Tutorial: Erstellen einer REST-API mit einer Lambda-Nicht-Proxy-Integration
<a name="getting-started-lambda-non-proxy-integration"></a>

In dieser exemplarischen Vorgehensweise verwenden wir die API Gateway-Konsole zur Erstellung einer API, die es einem Client ermöglicht, Lambda-Funktionen über die Lambda Nicht-Proxy-Integration (auch als benutzerdefinierte Integration bekannt) aufzurufen. Weitere Informationen zu AWS Lambda und Lambda-Funktionen finden Sie im [AWS Lambda -Entwicklerhandbuch](https://docs.aws.amazon.com/lambda/latest/dg/). 

Um das Lernen zu erleichtern, haben wir eine einfache Lambda-Funktion mit minimaler API-Einrichtung ausgewählt, um Sie durch die Schritte zur Erstellung einer API Gateway-API mit der benutzerdefinierten Lambda-Integration zu führen. Bei Bedarf werden wir Teile der Logik beschreiben. Ein ausführlicheres Beispiel für die benutzerdefinierte Lambda-Integration finden Sie unter [Tutorial: Erstellen Sie eine Rechner-REST-API mit zwei AWS Serviceintegrationen und einer Lambda-Non-Proxy-Integration](integrating-api-with-aws-services-lambda.md). 

Bevor Sie die API erstellen, richten Sie das Lambda-Backend ein, indem Sie eine Lambda-Funktion in AWS Lambda Lambda erstellen, wie nachfolgend beschrieben.

**Topics**
+ [Lambda-Funktion für die Nicht-Proxy-Integration von Lambda erstellen](#getting-started-new-lambda)
+ [API mit Lambda Nicht-Proxy-Integration erstellen](#getting-started-new-api)
+ [Testaufruf der API-Methode](#getting-started-new-get)
+ [Bereitstellen der API](#getting-started-deploy-api)
+ [Testen der API in einer Bereitstellungsstufe](#getting-started-test)
+ [Bereinigen](#getting-started-clean-up)

## Lambda-Funktion für die Nicht-Proxy-Integration von Lambda erstellen
<a name="getting-started-new-lambda"></a>

**Anmerkung**  
Das Erstellen von Lambda-Funktionen kann zu Gebühren für Ihr AWS Konto führen.

 In diesem Schritt erstellen Sie eine "Hello World"-ähnliche Lambda-Funktion für die benutzerdefinierte Integration von Lambda. In dieser schrittweisen Anleitung heißt die Funktion `GetStartedLambdaIntegration`.

 Die Implementierung dieser `GetStartedLambdaIntegration`-Lambda-Funktion sieht wie folgt aus: 

------
#### [ Node.js ]

```
'use strict';
var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];            
var times = ['morning', 'afternoon', 'evening', 'night', 'day'];

export const handler = async(event) => {
  console.log(event);
  // Parse the input for the name, city, time and day property values
  let name = event.name === null || event.name === undefined || event.name === "" ? 'you' : event.name;
  let city = event.city === undefined ? 'World' : event.city;
  let time = times.indexOf(event.time)<0 ? 'day' : event.time;
  let day = days.indexOf(event.day)<0 ? null : event.day;

  // Generate a greeting
  let greeting = 'Good ' + time + ', ' + name + ' of ' + city + '. ';
  if (day) greeting += 'Happy ' + day + '!';
  
  // Log the greeting to CloudWatch
  console.log('Hello: ', greeting);
  
  // Return a greeting to the caller
  return {"greeting": greeting}
};
```

------
#### [ Python ]

```
import json

days = {
    'Sunday',
    'Monday',
    'Tuesday',
    'Wednesday',
    'Thursday',
    'Friday',
    'Saturday'}
times = {'morning', 'afternoon', 'evening', 'night', 'day'}


def lambda_handler(event, context):
    print(event)
    # parse the input for the name, city, time, and day property values
    name = event.get("name") or 'you'
    city = event.get("city") or 'World'
    try:
        if event['time'] in times:
            time = event['time']
        else:
            time = 'day'
    except KeyError:
        time = 'day'
    try:
        if event['day'] in days:
            day = event['day']
        else:
            day = ''
    except KeyError:
        day = ''
    # Generate a greeting
    greeting = 'Good ' + time + ', ' + name + ' of ' + \
        city + '.' + ['', ' Happy ' + day + '!'][day != '']
    # Log the greeting to CloudWatch
    print(greeting)

    # Return a greeting to the caller
    return {"greeting": greeting}
```

------

Für die benutzerdefinierte Lambda-Integration übergibt API Gateway die Eingabe an die Lambda-Funktion vom Client als Integrationsanforderungsdaten. Das `event`-Objekt des Lambda-Funktionshandlers ist die Eingabe. 

Unsere Lambda-Funktion ist einfach. Sie analysiert das `event`-Objekt mit der Eingabe auf die Eigenschaften `name`, `city`, `time` und `day`. Sie gibt anschließend ein JSON-Objekt `{"message":greeting}` an den Aufrufer zurück. Die Nachricht nutzt das `"Good [morning|afternoon|day], [name|you] in [city|World]. Happy day!"`-Muster. Es wird angenommen, dass die Eingabe an die Lambda-Funktion das folgenden JSON-Objekt ist: 

```
{
  "city": "...",
  "time": "...",
  "day": "...",
  "name" : "..."
}
```

Weitere Informationen finden Sie im [AWS Lambda -Entwicklerhandbuch](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html). 

Darüber hinaus protokolliert die Funktion ihre Ausführung bei Amazon, CloudWatch indem sie aufruft`console.log(...)`. Dies ist hilfreich, wenn Sie die Funktionsaufrufe zum Debuggen nachverfolgen möchten. Damit die `GetStartedLambdaIntegration` Funktion den Anruf protokollieren kann, richten Sie eine IAM-Rolle mit entsprechenden Richtlinien für die Lambda-Funktion ein, um die CloudWatch Streams zu erstellen und Protokolleinträge zu den Streams hinzuzufügen. Die Lambda-Konsole führt Sie durch die Erstellung der erforderlichen IAM-Rollen und Richtlinien.

Wenn Sie die API einrichten, ohne die API Gateway-Konsole zu verwenden, wie z. B. beim [Import einer API aus einer OpenAPI-Datei](https://github.com/aws-samples/api-gateway-secure-pet-store/blob/master/src/main/resources/swagger.yaml#L39), müssen Sie, falls erforderlich, explizit eine Aufrufrolle und Richtlinien für API Gateway erstellen und einrichten, um die Lambda-Funktionen aufzurufen. Weitere Informationen über das Einrichten von Lambda-Aufruf- und Ausführungsrollen für eine API Gateway-API finden Sie unter [Zugriffskontrolle für eine API mit IAM-Berechtigungen](permissions.md). 

 Im Vergleich mit `GetStartedLambdaProxyIntegration`, der Lambda-Proxy-Integration, nimmt die `GetStartedLambdaIntegration` Lambda-Funktion für die benutzerdefinierte Lambda-Integration nur Eingaben aus den API Gateway API-Integrationsanforderungsdaten entgegen. Die Funktion kann eine Ausgabe als beliebiges JSON-Objekt, als Zeichenfolge, als Boolean oder sogar Binär-Blob zurückgeben. Die Lambda-Funktion für die Lambda-Proxy-Integration kann dagegen die Eingabe von beliebigen Anfragedaten entgegennehmen, muss aber ein bestimmtes JSON-Objekt zurückgeben. Die `GetStartedLambdaIntegration`-Funktion für die benutzerdefinierte Lambda-Integration kann API-Anfrageparameter als Eingabe nutzen, sofern API Gateway die erforderlichen API-Anfrageparameter vor dem Weiterleiten der Anfrage an das Backend zum Anfragetext zuordnet. Hierzu muss der API-Entwickler beim Erstellen der API eine Mapping-Vorlage für die API-Methode erstellen und konfigurieren. 

Erstellen Sie jetzt die `GetStartedLambdaIntegration` Lambda-Funktion. 

**So erstellen Sie die `GetStartedLambdaIntegration` Lambda-Funktion für die benutzerdefinierte Integration von Lambda**

1. Öffnen Sie die AWS Lambda Konsole unter. [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)

1. Führen Sie eine der folgenden Aktionen aus:
   + Wenn die Willkommensseite angezeigt wird, wählen Sie **Get Started Now (Jetzt beginnen)** und dann **Create function (Funktion erstellen)** aus.
   + Wenn die Listenseite **Lambda > Functions (Lambda > Funktionen)** angezeigt wird, wählen Sie **Create function (Funktion erstellen)**.

1. Wählen Sie **Author from scratch** aus. 

1. Verfahren Sie im Bereich **Author from scratch** wie folgt:

   1. Geben Sie für **Name** **GetStartedLambdaIntegration** als Namen der Lambda-Funktion ein.

   1. Wählen Sie für **Laufzeit** die neueste unterstützte **Node.js**- oder **Python**-Laufzeit aus.

   1. Behalten Sie für **Architektur** die Standardeinstellung bei.

   1. Erweitern Sie unter **Berechtigungen** die Option **Standardausführungsrolle ändern**. Wählen Sie in der Dropdown-Liste **Ausführungsrolle** die Option **Neue Rolle aus AWS -Richtlinienvorlagen erstellen** aus.

   1. Geben Sie unter **Role name (Rollenname)** einen Namen für die Rolle ein (z. B. **GetStartedLambdaIntegrationRole**).

   1. Wählen Sie für **Policy templates (Richtlinienvorlagen)** die Option **Simple microservice permissions (Einfache Microservice-Berechtigungen)**.

   1. Wählen Sie **Create function (Funktion erstellen)**.

1. Legen Sie im Bereich **Configuration function** (Konfiguration) unter **Function code** (Funktionscode) die Folgendes fest:

   1. Kopieren Sie den Code in der Lambda-Funktion am Anfang dieses Abschnitts und fügen Sie ihn in den Inline-Codeeditor ein.

   1. Akzeptieren Sie die Standardwerte für alle anderen Felder in diesem Abschnitt.

   1. Wählen Sie **Deploy (Bereitstellen)** aus.

1. Um die neu erstellte Funktion zu testen, wählen Sie die Registerkarte **Test** aus.

   1. Geben Sie für **Event name (Ereignisname)** **HelloWorldTest** ein. 

   1. Ersetzen Sie für **Ereignis-JSON** den Standardcode durch den folgenden Code.

      ```
      {
        "name": "Jonny",
        "city": "Seattle",
        "time": "morning",
        "day": "Wednesday"
      }
      ```

   1.  Wählen Sie **Test**, um die Funktion aufzurufen. Der Abschnitt **Execution result: succeeded** wird angezeigt. Erweitern Sie **Details** und diese Ausgabe wird angezeigt.

      ```
      {
          "greeting": "Good morning, Jonny of Seattle. Happy Wednesday!"
      }
      ```

      Die Ausgabe wird auch in CloudWatch Logs geschrieben. 

 Als Zusatzaufgabe können Sie die IAM-Konsole verwenden, um die IAM-Rolle (`GetStartedLambdaIntegrationRole`) anzuzeigen, die bei der Erstellung der Lambda-Funktion erstellt wurde. An diese IAM-Rolle sind zwei Inline-Richtlinien angehängt. Eine legt die grundlegenden Berechtigungen für die Ausführung von Lambda fest. Es ermöglicht das CloudWatch `CreateLogGroup` Aufrufen aller CloudWatch Ressourcen Ihres Kontos in der Region, in der die Lambda-Funktion erstellt wurde. Diese Richtlinie ermöglicht auch das Erstellen der CloudWatch Streams und das Protokollieren von Ereignissen für die `GetStartedLambdaIntegration` Lambda-Funktion. 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:us-east-1:111111111111:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:us-east-1:111111111111:log-group:/aws/lambda/GetStartedLambdaIntegration:*"
            ]
        }
    ]
}
```

------

Das andere Richtliniendokument bezieht sich auf das Aufrufen eines anderen AWS Dienstes, der in diesem Beispiel nicht verwendet wird. Sie können sie überspringen. 

 Der IAM-Rolle ist eine vertrauenswürdige Entität zugeordnet. Diese ist `lambda.amazonaws.com`. Hier ist die Vertrauensstellung: 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

 Die Kombination aus dieser Vertrauensbeziehung und der Inline-Richtlinie ermöglicht es der Lambda-Funktion, eine `console.log()` Funktion aufzurufen, um Ereignisse in Logs zu protokollieren. CloudWatch 

## API mit Lambda Nicht-Proxy-Integration erstellen
<a name="getting-started-new-api"></a>

 Wenn die Lambda-Funktion (`GetStartedLambdaIntegration`) erstellt und getestet ist, können Sie die Funktion über eine API Gateway-API zur Verfügung stellen. Zur Veranschaulichung stellen wir die Lambda-Funktion mit einer generischen HTTP-Methode bereit. Wir verwenden den Anforderungstext, eine URL-Pfadvariable, eine Abfragezeichenfolge und einen Header für den Empfang der erforderlichen Eingabedaten vom Client. Wir schalten den API Gateway-Anfragevalidierer für die API ein, um sicherzustellen, dass alle erforderlichen Daten korrekt definiert und spezifiziert sind. Wir konfigurieren eine Zuordnungsvorlage für API Gateway, um die vom Kunden bereitgestellten Anfragedaten in das Format zu transformieren, das von der Backend-Lambda-Funktion benötigt wird.

**Eine API mit einer Lambda Nicht-Proxy-Integration erstellen**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wenn Sie API Gateway zum ersten Mal verwenden, sehen Sie eine Seite, die Sie mit den Funktionen des Service vertraut macht. Wählen Sie unter **REST-API** die Option **Erstellen** aus. Wenn das Popup-Fenster **Create Example API (Beispiel-API erstellen)** angezeigt wird, klicken Sie auf **OK**.

   Wenn Sie API Gateway nicht zum ersten Mal verwenden, wählen Sie **Create API (API erstellen)**. Wählen Sie unter **REST-API** die Option **Build (Erstellen)** aus.

1.  Geben Sie in **API name** (API-Name) **LambdaNonProxyAPI** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Lassen Sie die Einstellung für **API-Endpunkttyp** bei **Regional**.

1. Wählen Sie als **IP-Adresstyp** die Option. **IPv4**

1. Wählen Sie **Create API** (API erstellen) aus.

Nachdem Sie eine API erstellt haben, können Sie nun eine **/\$1city\$1**-Ressource erstellen. Dies ist ein Beispiel für eine Ressource mit einer Pfadvariablen, die Eingaben vom Client annimmt. In einem späteren Schritt werden Sie diese Pfadvariable der Lambda-Funktionseingabe mittels einer Zuordnungsvorlage zuweisen.

**So erstellen Sie eine Ressource**

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1. Die **Proxy-Ressource** bleibt ausgeschaltet. 

1. **Ressourcenpfad** wird als `/` beibehalten.

1. Geben Sie für **Resource name (Ressourcenname)** **\$1city\$1** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

Nachdem Sie eine **/\$1city\$1**-Ressource erstellt haben, können Sie nun eine `ANY`-Methode erstellen. Das `ANY` HTTP-Verb ist ein Platzhalter für eine gültige HTTP-Methode, die ein Client zur Laufzeit sendet. Dieses Beispiel zeigt, dass die `ANY`-Methode sowohl für die benutzerdefinierte Integration von Lambda als auch für die Integration von Lambda-Proxys verwendet werden kann.

**Erstellen einer `ANY`-Methode**

1. Wählen Sie die **/\$1city\$1**-Ressource aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie als **Methodentyp** die Option **BELIEBIG** aus.

1. Wählen Sie für den **Integration type** (Integrationstyp) die Option **Lambda function** (Lambda-Funktion) aus.

1. Lassen Sie **Lambda proxy integration** (Lambda-Proxyintegration) deaktiviert.

1. Wählen Sie für **Lambda-Funktion** den Ort aus, AWS-Region an dem Sie Ihre Lambda-Funktion erstellt haben, und geben Sie dann den Funktionsnamen ein.

1. Klicken Sie auf **Einstellungen für Methodenanfragen**.

   Als Nächstes aktivieren Sie eine Anforderungsvalidierung für eine URL-Pfadvariable, einen Abfragezeichenfolgenparameter und einen Header, um sicherzustellen, dass alle erforderlichen Daten definiert sind. Für dieses Beispiel erstellen Sie einen `time`-Abfragezeichenfolgenparameter und einen `day`-Header. 

1. Wählen Sie für **Anforderungs-Validierer** die Option **Abfragezeichenfolgeparameter und -Header validieren** aus.

1. Wählen Sie **URL query string parameters** (URL-Abfragezeichenfolgen-Parameter) und gehen Sie wie folgt vor: 

   1. Wählen Sie **Abfragezeichenfolge hinzufügen** aus.

   1. Geben Sie unter **Name** **time** ein.

   1. Aktivieren Sie die Option **Erforderlich**.

   1. **Caching** bleibt ausgeschaltet. 

1. Klicken Sie auf **HTTP-Anforderungs-Header** und gehen Sie dann wie folgt vor: 

   1. Wählen Sie **Add header**.

   1. Geben Sie unter **Name** **day** ein.

   1. Aktivieren Sie die Option **Erforderlich**.

   1. **Caching** bleibt ausgeschaltet. 

1. Wählen Sie **Methode erstellen** aus.

Nachdem Sie einen Anforderungs-Validator aktiviert haben, konfigurieren Sie die Integrationsanforderung für die `ANY`-Methode, indem Sie eine Textzuordnungsvorlage hinzufügen, um die eingehende Anfrage in eine JSON-Nutzlast umzuwandeln, wie es die Backend-Lambda-Funktion erfordert. 

**Konfigurieren der Integrationsanforderung**

1. Klicken Sie in der Registerkarte **Integrationsanfrage** unter **Einstellungen für Integrationsanfragen** auf **Bearbeiten**.

1. Wählen Sie für **Anforderungstext-Pass-Through** die Option **Wenn keine Vorlagen definiert sind (empfohlen)** aus.

1. Wählen Sie **Zuordnungsvorlagen** aus.

1. Wählen Sie **Add mapping template**.

1. Geben Sie für **Content type** (Inhaltstyp) **application/json** ein.

1. Geben Sie für **Vorlagentext** den folgenden Code ein:

   ```
   #set($inputRoot = $input.path('$'))
   {
     "city": "$input.params('city')",
     "time": "$input.params('time')",
     "day":  "$input.params('day')",
     "name": "$inputRoot.callerName"
   }
   ```

1. Wählen Sie **Speichern**.

## Testaufruf der API-Methode
<a name="getting-started-new-get"></a>

 Die API Gateway-Konsole bietet Ihnen eine Testmöglichkeit, mit der Sie den Aufruf der API testen können, bevor sie bereitgestellt wird. Sie verwenden die Testfunktion der Konsole, um die API über das Senden der folgenden Anforderung zu testen: 

```
POST /Seattle?time=morning
day:Wednesday

{
    "callerName": "John"
}
```

 In dieser Testanforderung legen Sie `ANY` auf `POST`fest, `{city}` auf `Seattle`, weisen `Wednesday` als `day`-Header-Wert zu und weisen `"John"` als `callerName`-Wert zu. 

**So testen Sie die `ANY`-Methode**

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Wählen Sie als **Methodentyp** die Option `POST` aus.

1. Geben Sie für **Pfad** unter **Stadt** den Wert **Seattle** ein.

1. Für **Abfrage-Zeichenketten** geben Sie **time=morning** ein.

1. Für **Headers** geben Sie den Wert **day:Wednesday** ein.

1. Geben Sie für **Anforderungstext** **\$1 "callerName": "John" \$1** ein

1. Wählen Sie **Test** aus.

Überprüfen Sie, ob die zurückgegebene Antwortnutzlast wie folgt lautet:

```
{
  "greeting": "Good morning, John of Seattle. Happy Wednesday!"
}
```

Sie können außerdem die Protokolle anzeigen, um zu untersuchen, wie API Gateway die Anfrage und Antwort verarbeitet.

```
Execution log for request test-request
Thu Aug 31 01:07:25 UTC 2017 : Starting execution for request: test-invoke-request
Thu Aug 31 01:07:25 UTC 2017 : HTTP Method: POST, Resource Path: /Seattle
Thu Aug 31 01:07:25 UTC 2017 : Method request path: {city=Seattle}
Thu Aug 31 01:07:25 UTC 2017 : Method request query string: {time=morning}
Thu Aug 31 01:07:25 UTC 2017 : Method request headers: {day=Wednesday}
Thu Aug 31 01:07:25 UTC 2017 : Method request body before transformations: { "callerName": "John" }
Thu Aug 31 01:07:25 UTC 2017 : Request validation succeeded for content type application/json
Thu Aug 31 01:07:25 UTC 2017 : Endpoint request URI: https://lambda.us-west-2.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:GetStartedLambdaIntegration/invocations
Thu Aug 31 01:07:25 UTC 2017 : Endpoint request headers: {x-amzn-lambda-integration-tag=test-request, Authorization=****************************************************************************************************************************************************************************************************************************************************************************************************************************************338c72, X-Amz-Date=20170831T010725Z, x-amzn-apigateway-api-id=beags1mnid, X-Amz-Source-Arn=arn:aws:execute-api:us-west-2:123456789012:beags1mnid/null/POST/{city}, Accept=application/json, User-Agent=AmazonAPIGateway_beags1mnid, X-Amz-Security-Token=FQoDYXdzELL//////////wEaDMHGzEdEOT/VvGhabiK3AzgKrJw+3zLqJZG4PhOq12K6W21+QotY2rrZyOzqhLoiuRg3CAYNQ2eqgL5D54+63ey9bIdtwHGoyBdq8ecWxJK/YUnT2Rau0L9HCG5p7FC05h3IvwlFfvcidQNXeYvsKJTLXI05/yEnY3ttIAnpNYLOezD9Es8rBfyruHfJfOqextKlsC8DymCcqlGkig8qLKcZ0hWJWVwiPJiFgL7laabXs++ZhCa4hdZo4iqlG729DE4gaV1mJVdoAagIUwLMo+y4NxFDu0r7I0/EO5nYcCrppGVVBYiGk7H4T6sXuhTkbNNqVmXtV3ch5bOlh7 [TRUNCATED]
Thu Aug 31 01:07:25 UTC 2017 : Endpoint request body after transformations: {
  "city": "Seattle",
  "time": "morning",
  "day": "Wednesday",
  "name" : "John"
}
Thu Aug 31 01:07:25 UTC 2017 : Sending request to https://lambda.us-west-2.amazonaws.com/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:GetStartedLambdaIntegration/invocations
Thu Aug 31 01:07:25 UTC 2017 : Received response. Integration latency: 328 ms
Thu Aug 31 01:07:25 UTC 2017 : Endpoint response body before transformations: {"greeting":"Good morning, John of Seattle. Happy Wednesday!"}
Thu Aug 31 01:07:25 UTC 2017 : Endpoint response headers: {x-amzn-Remapped-Content-Length=0, x-amzn-RequestId=c0475a28-8de8-11e7-8d3f-4183da788f0f, Connection=keep-alive, Content-Length=62, Date=Thu, 31 Aug 2017 01:07:25 GMT, X-Amzn-Trace-Id=root=1-59a7614d-373151b01b0713127e646635;sampled=0, Content-Type=application/json}
Thu Aug 31 01:07:25 UTC 2017 : Method response body after transformations: {"greeting":"Good morning, John of Seattle. Happy Wednesday!"}
Thu Aug 31 01:07:25 UTC 2017 : Method response headers: {X-Amzn-Trace-Id=sampled=0;root=1-59a7614d-373151b01b0713127e646635, Content-Type=application/json}
Thu Aug 31 01:07:25 UTC 2017 : Successfully completed execution
Thu Aug 31 01:07:25 UTC 2017 : Method completed with status: 200
```

Die Protokolle zeigen die eingehende Anforderung vor der Zuordnung und die Integrationsanforderung nach der Zuordnung. Wenn ein Test fehlschlägt, sind die Protokolle nützlich, um zu prüfen, ob die ursprüngliche Eingabe korrekt ist oder ob die Mapping-Vorlage ordnungsgemäß funktioniert. 

## Bereitstellen der API
<a name="getting-started-deploy-api"></a>

 Der Testaufruf ist eine Simulation und hat Einschränkungen. Beispielsweise umgeht er alle Autorisierungsmechanismen für die API. Zum Testen der API-Ausführung in Echtzeit müssen Sie die API bereitstellen. Um eine API bereitzustellen, können Sie einen Snapshot der API erstellen. Der Stufenname definiert den Basispfad entsprechend dem standardmäßigen Hostnamen der API. Die Root-Ressource der API wird nach dem Stufenamen angehängt. Wenn Sie die API ändern, müssen Sie sie erneut für eine neue oder bestehende Stufe bereitstellen, bevor die Änderungen wirksam werden. 

**So stellen Sie die API für eine Stufe bereit**

1. Klicken Sie auf **Deploy API**.

1. Wählen Sie für **Stufe** die Option **Neue Stufe** aus.

1. Geben Sie für **Stage name (Stufenname)** **test** ein.
**Anmerkung**  
Die Eingabe muss als UTF-8-kodierter (also nicht lokalisierter) Text erfolgen.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Wählen Sie **Bereitstellen**.

Wählen Sie unter **Stufendetails** das Kopiersymbol aus, um die Aufruf-URL Ihrer API zu kopieren. Das allgemeine Muster der Basis-URL lautet `https://api-id.region.amazonaws.com/stageName`. Wenn beispielsweise die Basis-URL der API (`beags1mnid`) in der Region `us-west-2` erstellt und für die Stufe `test` bereitgestellt wird, lautet der Name `https://beags1mnid.execute-api.us-west-2.amazonaws.com/test`.

## Testen der API in einer Bereitstellungsstufe
<a name="getting-started-test"></a>

Es gibt mehrere Möglichkeiten zum Testen einer bereitgestellten API. Für GET-Anforderungen mit nur URL-Pfadvariablen oder Parameter für Abfragezeichenfolgen können Sie die API-Ressourcen-URL in einem Browser eingeben. Für andere Methoden müssen Sie erweiterte REST-API-Testtools wie [POSTMAN](https://www.postman.com/) oder [cURL](https://curl.se/) verwenden.

**So testen Sie die API mithilfe von cURL**

1. Öffnen Sie ein Terminalfenster auf Ihrem lokalen Computer, der mit dem Internet verbunden ist.

1. So können Sie dies testen `POST /Seattle?time=evening`:

   Kopieren Sie den folgenden cURL-Befehl und fügen Sie ihn in das Terminalfenster ein.

   ```
   curl -v -X POST \
     'https://beags1mnid.execute-api.us-west-2.amazonaws.com/test/Seattle?time=evening' \
     -H 'content-type: application/json' \
     -H 'day: Thursday' \
     -H 'x-amz-docs-region: us-west-2' \
     -d '{
   	"callerName": "John"
   }'
   ```

   Als Ergebnis sollten Sie eine erfolgreiche Antwort mit der folgenden Nutzlast erhalten:

   ```
   {"greeting":"Good evening, John of Seattle. Happy Thursday!"}
   ```

   Wenn Sie diese Methode `POST` zu `PUT` ändern, erhalten Sie dieselbe Antwort.

## Bereinigen
<a name="getting-started-clean-up"></a>

Wenn Sie die für diese Anleitung erstellten Lambda-Funktionen nicht mehr benötigen, können Sie diese nun löschen. Sie können auch die zugehörigen IAM-Ressourcen löschen.

**Warnung**  
Wenn Sie vorhaben, die anderen exemplarischen Vorgehensweisen in dieser Reihe abzuschließen, löschen Sie weder die Lambda-Ausführungsrolle noch die Lambda-Aufruf-Rolle. Wenn Sie eine Lambda-Funktion löschen, auf die Sie APIs sich verlassen, APIs funktionieren diese nicht mehr. Das Löschen einer Lambda-Funktion kann nicht rückgängig gemacht werden. Wenn Sie die Lambda-Funktion erneut verwenden möchten, müssen Sie die Funktion neu erstellen.  
Wenn Sie eine IAM-Ressource löschen, auf die sich eine Lambda-Funktion stützt, funktioniert diese Lambda-Funktion nicht mehr, und alle, APIs die auf diese Funktion angewiesen sind, funktionieren nicht mehr. Das Löschen einer IAM-Ressource kann nicht rückgängig gemacht werden. Wenn Sie die IAM-Ressource wieder nutzen möchten, müssen Sie diese neu erstellen. 

**So löschen Sie die Lambda-Funktion:**

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

1. Wählen Sie in der Liste der Funktionen **GetStartedLambdaIntegration**, **Aktionen** und anschließend **Delete function**. Wählen Sie bei Aufforderung erneut **Löschen** aus.

**Löschen Sie die zugehörigen IAM-Ressourcen wie folgt:**

1. Öffnen Sie unter [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) die IAM-Konsole.

1. Wählen Sie in **Details** **Roles**.

1. Wählen Sie in der Liste der Rollen **GetStartedLambdaIntegrationRole**, **Role Actions** und anschließend **Delete role**. Führen Sie die Schritte in der Konsole aus, um die Rolle zu löschen.

# Tutorial: REST-API mit kontenübergreifender Lambda-Proxy-Integration erstellen
<a name="apigateway-cross-account-lambda-integrations"></a>

Sie können jetzt eine AWS Lambda Funktion aus einem anderen AWS Konto als Backend für Ihre API-Integration verwenden. Jedes Konto kann sich in jeder Region befinden, in der Amazon API Gateway verfügbar ist. Dies macht es einfach, Lambda-Backend-Funktionen zentral zu verwalten und für mehrere gemeinsam zu nutzen. APIs

In diesem Abschnitt zeigen wir, wie die kontoübergreifende Lambda-Proxy-Integration mit Hilfe der Amazon API Gateway-Konsole konfiguriert wird.

## API für die kontenübergreifende Lambda-Integration mit API Gateway erstellen
<a name="apigateway-cross-account-lambda-integrations-create-api"></a>

**So erstellen Sie eine API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wenn Sie API Gateway zum ersten Mal verwenden, sehen Sie eine Seite, die Sie mit den Funktionen des Service vertraut macht. Wählen Sie unter **REST-API** die Option **Erstellen** aus. Wenn das Popup-Fenster **Create Example API (Beispiel-API erstellen)** angezeigt wird, klicken Sie auf **OK**.

   Wenn Sie API Gateway nicht zum ersten Mal verwenden, wählen Sie **Create API (API erstellen)**. Wählen Sie unter **REST-API** die Option **Build (Erstellen)** aus.

1.  Geben Sie in **API name** (API-Name) **CrossAccountLambdaAPI** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Lassen Sie die Einstellung für **API-Endpunkttyp** bei **Regional**.

1. Wählen Sie als **IP-Adresstyp** die Option. **IPv4**

1. Wählen Sie **Create API** (API erstellen) aus.

## Lambda-Integrationsfunktion in einem anderen Konto erstellen
<a name="apigateway-cross-account-lambda-integrations-create-lambda-function"></a>

Jetzt erstellen Sie eine Lambda-Funktion in einem anderen Konto über das Konto, über das Sie die Beispiel-API erstellt haben.

**Erstellen einer Lambda-Funktion in einem anderen Konto**

1. Melden Sie sich bei der Lambda-Konsole in einem anderen Konto als dem an, in dem Sie Ihre API Gateway-API erstellt haben.

1. Wählen Sie **Create function (Funktion erstellen)**.

1. Wählen Sie **Author from scratch** aus.

1. Verfahren Sie unter **Author from scratch** wie folgt:

   1. Geben Sie als **Function name (Funktionsname)** einen Namen ein.

   1. Wählen Sie aus der Dropdown-Liste **Runtime (Laufzeit)** eine unterstützte Node.js-Laufzeit aus.

   1. Behalten Sie für **Architektur** die Standardeinstellung bei.

   1. Erweitern Sie unter **Permissions (Berechtigungen)** den Bereich **Choose or create an execution role (Ausführungsrolle wählen oder erstellen)**. Sie können eine Rolle erstellen oder eine vorhandene Rolle auswählen.

   1. Wählen Sie **Create function** aus, um fortzufahren.

1. Scrollen Sie nach unten bis zum Bereich **Function code** (Funktionscode).

1. Geben Sie die Node.js-Funktionsimplementierung aus [Tutorial: Erstellen einer REST-API mit einer Lambda-Proxy-Integration](api-gateway-create-api-as-simple-proxy-for-lambda.md) ein.

1. Wählen Sie **Deploy (Bereitstellen)** aus.

1. Beachten Sie den vollständigen ARN für Ihre Funktion (in der rechten oberen Ecke des Bereichs der Lambda-Funktion). Sie benötigen diese, wenn Sie Ihre kontoübergreifende Lambda-Integration erstellen.

## Kontoübergreifende Lambda-Integration konfigurieren
<a name="apigateway-cross-account-lambda-integrations-create-integration2"></a>

Sobald Sie eine Lambda-Integrationsfunktion in einem anderen Konto haben, können Sie die API Gateway-Konsole verwenden, um sie zu Ihrer API in Ihrem ersten Konto hinzuzufügen.

**Anmerkung**  
Wenn Sie einen regionsübergreifenden, kontoübergreifenden Genehmiger konfigurieren, sollte der `sourceArn`, der zur Zielfunktion hinzugefügt wird, die Region der Funktion verwenden, nicht die Region der API.

Nachdem Sie eine API erstellt haben, können Sie nun eine Ressource erstellen. In der Regel werden API-Ressourcen in einer Ressourcenstruktur organisiert, die der Anwendungslogik entspricht. Für dieses Beispiel erstellen Sie eine **/helloworld**-Ressource. 

**So erstellen Sie eine Ressource**

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1. Die **Proxy-Ressource** bleibt ausgeschaltet. 

1. **Ressourcenpfad** wird als `/` beibehalten.

1. Geben Sie für **Resource name (Ressourcenname)** **helloworld** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

Nachdem Sie eine Ressource erstellt haben, können Sie nun eine `GET`-Methode erstellen. Die `GET`-Methode wird in einem anderen Konto in der Lambda-Funktion integriert. 

**So erstellen Sie eine `GET`-Methode**

1. Wählen Sie die **/helloworld**-Ressource aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie als **Methodentyp** die Option **GET** (Abrufen) aus.

1. Wählen Sie für den **Integration type** (Integrationstyp) die Option **Lambda function** (Lambda-Funktion) aus.

1. Schalten Sie die **Lambda-Proxy-Integration** ein.

1. Geben Sie für **Lambda-Funktion** den vollständigen ARN Ihrer Lambda-Funktion aus Schritt 1 ein. 

   Sie finden den ARN für Ihre Funktion in der Lambda-Konsole in der oberen rechten Ecke des Konsolenfensters.

1. Wenn Sie den ARN eingeben, wird eine `aws lambda add-permission`-Befehlszeichenfolge angezeigt. Diese Richtlinie gewährt Ihrem ersten Konto Zugriff auf die Lambda-Funktion in Ihrem zweiten Konto. Kopieren Sie die `aws lambda add-permission` Befehlszeichenfolge und fügen Sie sie in ein AWS CLI Fenster ein, das für Ihr zweites Konto konfiguriert ist.

1. Wählen Sie **Methode erstellen** aus.

Die aktualisierte Richtlinie für Ihre Funktion wird in der Lambda-Konsole angezeigt.

**(Optional) Anzeige Ihrer aktualisierten Richtlinie**

1. Melden Sie sich bei an AWS-Managementkonsole und öffnen Sie die AWS Lambda Konsole unter [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Wählen Sie Ihre Lambda-Funktion aus.

1. Wählen Sie **Permissions**.

   Sie sollten eine `Allow`-Richtlinie mit einer `Condition`-Klausel sehen, in der `AWS:SourceArn` die ARN für die `GET`-Methode Ihrer API ist.

# Tutorial: Erstellen einer REST-API durch Importieren eines Beispiels
<a name="api-gateway-create-api-from-example"></a>

Sie können die Amazon API Gateway Gateway-Konsole verwenden, um eine einfache REST-API mit der HTTP-Integration für eine PetStore Website zu erstellen und zu testen. Die API-Definition ist als Swagger-2.0-Datei vorkonfiguriert. Nachdem Sie die API-Definition in API Gateway geladen haben, können Sie die API Gateway-Konsole verwenden, um die Grundstruktur der API zu untersuchen oder die API einfach bereitstellen und testen. 

 Die PetStore Beispiel-API unterstützt die folgenden Methoden, mit denen ein Client auf die HTTP-Backend-Website von `http://petstore-demo-endpoint.execute-api.com/petstore/pets` zugreifen kann. 

**Anmerkung**  
In diesem Tutorial wird ein HTTP-Endpunkt als Beispiel verwendet. Wenn Sie Ihre eigenen erstellen, empfehlen wir Ihnen APIs, HTTPS-Endpunkte für Ihre HTTP-Integrationen zu verwenden.
+ `GET /`: Für den Lesezugriff der Root-Ressource der API, die nicht mit jedem Backend-Endpunkt integriert ist. API Gateway antwortet mit einem Überblick über die PetStore Website. Dies ist ein Beispiel für den `MOCK`-Integrationstyp.
+ `GET /pets`: Für den Lesezugriff auf die `/pets`-Ressource der API, die mit der gleichnamigen Backend-`/pets`-Ressource integriert ist. Das Backend gibt eine Seite mit verfügbaren Haustieren in der PetStore zurück. Dies ist ein Beispiel für den `HTTP`-Integrationstyp. Die URL des Integrationsendpunktes lautet `http://petstore-demo-endpoint.execute-api.com/petstore/pets`.
+ `POST /pets`: Für den Schreibzugriff auf die `/pets`-Ressource der API, die mit der Backend-`/petstore/pets`-Ressource integriert ist. Nach Erhalt einer korrekten Anfrage fügt das Backend das angegebene Haustier zur Liste hinzu PetStore und gibt das Ergebnis an den Anrufer zurück. Die Integration ist ebenfalls `HTTP`.
+ `GET /pets/{petId}`: Für den Lesezugriff auf ein Haustier, das durch einen `petId`-Wert per Pfadvariable der URL der eingehenden Anforderung identifiziert wird. Diese Methode hat ebenfalls den `HTTP`-Integrationstyp. Das Backend gibt das angegebene Haustier zurück, das in der gefunden wurde. PetStore Die URL des Backend-HTTP-Endpunkts ist `http://petstore-demo-endpoint.execute-api.com/petstore/pets/n`, wobei `n` eine Ganzzahl für die ID des abgefragten Haustiers ist.

 Die API unterstützt den CORS-Zugriff über die `OPTIONS`-Methoden des `MOCK`-Integrationstyps. API Gateway gibt die erforderlichen Header zurück, die den CORS-Zugriff unterstützen. 

Das folgende Verfahren führt Sie durch die Schritte zum Erstellen und Testen einer API anhand eines Beispiels mit der API Gateway-Konsole.

**So importieren, erstellen und testen Sie die Beispiel-API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Führen Sie eine der folgenden Aktionen aus:
   + Um Ihre erste API zu erstellen, wählen Sie für **REST-API** die Option **Erstellen**.
   + Wenn Sie zuvor eine API erstellt haben, wählen Sie **API erstellen** und dann für **REST-API** die Option **Erstellen**.

1.  Wählen Sie unter **Create REST API** (REST API erstellen) die Option **Example API** (Beispiel-API) und dann **Create API** (API erstellen) aus, um die Beispiel-API zu erstellen. 

      
![\[Beispiel einer REST-API in der API-Gateway-Konsole.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/api-gateway-create-api-by-importing-example-new-console.png)

    Sie können einen Bildlauf durch die OpenAPI-Definition ausführen und Details zu dieser Beispiel-API anzeigen. Klicken Sie anschließend auf **Create API** (API erstellen). 

1. Klicken Sie im Hauptnavigationsbereich auf **Resources** (Ressourcen). Die folgende Abbildung zeigt die neu erstellte API:

      
![\[Die Beispiel-API nach dem Import in die API-Gateway-Konsole.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/api-gateway-create-api-by-importing-example-result-new-console.png)

    Im Bereich **Resources** wird die Struktur der erstellten API als Knotenstruktur gezeigt. Die API-Methoden der einzelnen Ressourcen werden als Edges in der Struktur dargestellt. Bei Auswahl einer Ressource werden alle zugehörigen Methoden auf der rechten Seite in der Tabelle **Methods** (Methoden) angegeben. Bei jeder Methode werden der Methodentyp, der Integrationstyp, der Autorisierungstyp und die API-Schlüsselanforderung angezeigt. 

1.  Um die Details einer Methode anzuzeigen, die Einrichtung zu ändern oder den Methodenaufruf zu testen, wählen Sie entweder in der Methodenliste oder der Ressourcenstruktur einen Methodennamen aus. Zur Illustration wählen wir hier die Methode `POST /pets`: 

      
![\[Die POST /pets-Methode für die Beispiel-API in der API-Gateway-Konsole.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/api-gateway-create-api-by-importing-example-post-method-execution-new-console.png)

    Der daraufhin angezeigte Bereich zur **Methodenausführung** bietet eine logische Ansicht der Struktur und des Verhaltens der ausgewählten (`POST /pets`) Methode.

   Die **Method request** (Methodenanforderung) und die **Method response** (Methodenantwort) stellen die Schnittstelle der API zum Frontend dar, und die **Integration request** (Integrationsanforderung) und die **Integration response** (Integrationsantwort) stellen die Schnittstelle der API zum Backend dar.

    Ein Client verwendet die API für den Zugriff auf eine Backend-Funktion über **Method Request** (Methodenanforderung). Bei Bedarf wandelt Amazon API Gateway die Clientanforderung in ein Format um, das vom Backend in **Integration Request** (Integrationsanfrage) verarbeitet werden kann, bevor die eingehende Anfrage an das Backend weitergeleitet wird. Die umgewandelte Anforderung wird als Integrationsanforderung bezeichnet. Analog dazu gibt das Backend die Antwort an API Gateway in **Integration Response** (Integrationsantwort) zurück. API Gateway leitet dann an **Method Response (Methodenantwort)** weiter, bevor das Senden an den Client erfolgt. Auch hier kann API Gateway, falls erforderlich, die Backend-Antwortdaten einer vom Client erwarteten Form zuordnen. 

    Für die `POST`-Methode einer API-Ressource kann die Nutzlast der Methodenanforderung ohne Änderung an die Integrationsanforderung übergeben werden, wenn die Nutzlast der Methodenanforderung dasselbe Format wie die Nutzlast der Integrationsanforderung aufweist. 

   Die `GET /`-Methodenanforderung verwendet den Integrationstyp `MOCK` und ist nicht mit einem tatsächlichen Endpunkt im Backend verknüpft. Die entsprechende **Integration Response** (Integrationsantwort) ist so eingerichtet, dass sie eine statische HTML-Seite zurückgibt: Wenn die Methode aufgerufen wird, akzeptiert API Gateway einfach die Anforderung und gibt die konfigurierte Integrationsantwort sofort über **Method Response** (Methodenantwort) an den Client zurück. Mit der Pseudo-Integration können Sie eine API testen, ohne dass ein Backend-Endpunkt erforderlich ist. Sie können sie auch zur Bereitstellung einer lokalen Antwort verwenden, die aufgrund einer Antwort-TextMapping-Vorlage generiert wurde. 

   Als API-Entwickler steuern Sie das Frontend-Interaktionsverhalten der API, indem Sie eine Methodenanforderung und eine Methodenantwort konfigurieren. Das Backend-Interaktionsverhalten der API steuern Sie, indem Sie eine Integrationsanforderung und eine Integrationsantwort einrichten. Dafür sind Datenzuweisungen zwischen einer Methode und der entsprechenden Integration nötig. Im Moment konzentrieren wir uns darauf, die API zu testen, um eine end-to-end Benutzererfahrung zu bieten. 

1.  Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen. 

1.  Geben Sie z. B. zum Testen der `POST /pets`-Methode die folgende **\$1"type": "dog","price": 249.99\$1**-Nutzlast in **Request Body** (Anforderungstext) ein, bevor Sie die Schaltfläche **Test** betätigen.

      
![\[Testen Sie die POST-Methode in der API-Gateway-Konsole.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/api-gateway-create-api-by-importing-example-post-method-test-new-console.png)

    Die Eingabe spezifiziert die Attribute des Haustiers, das wir der Liste der Haustiere auf der PetStore Website hinzufügen möchten. 

1. Die Ergebnisse werden folgendermaßen angezeigt:

      
![\[Das Ergebnis des POST-Methodentests in der API-Gateway-Konsole.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/api-gateway-create-api-by-importing-example-post-method-test-result-new-console.png)

    In der Ausgabe werden unter **Log** (Protokoll) die Statusänderungen von der Methodenanforderung zur Integrationsanforderung und von der Integrationsantwort zur Methodenantwort angezeigt. Das ist hilfreich, um Zuweisungsfehler zu beheben, die zu einer fehlerhaften Anforderung führen. In diesem Beispiel wird keine Zuweisung angewendet: Die Nutzlast der Methodenanforderung wird über die Integrationsanforderung an das Backend übergeben und die Backend-Antwort wird parallel dazu über die Integrationsantwort an die Methodenantwort übergeben. 

    Um die API mit einem anderen Client als der API Gateway test-invoke-request Gateway-Funktion zu testen, müssen Sie die API zunächst in einer Phase bereitstellen. 

1.  Wählen Sie **Deploy API** (API bereitstellen) aus, um die Beispiel-API bereitzustellen. 

      
![\[Klicken Sie auf „Bereitstellen“, um Ihre API für API-Aufrufer zur Verfügung zu stellen.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/api-gateway-create-api-by-importing-example-deploy-api-new-console.png)

1. Wählen Sie für **Stage** (Stufe) die Option **New stage** (Neue Stufe) aus, und geben Sie dann **test** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Wählen Sie **Bereitstellen**.

1.  Im resultierenden Bereich **Stages** (Stufen) zeigt **Invoke URL** (Aufruf-URL) unter **Stage details** (Stufendetails) die URL an, die die `GET /`-Methodenanfrage der API aufruft.   
![\[Nachdem Sie Ihre REST-API erstellt haben, zeigt die Konsole die Aufruf-URL Ihrer API an.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/getting-started-rest-invoke-url.png)

1. Wählen Sie das Kopiersymbol, um die Aufruf-URL Ihrer API zu kopieren, und geben Sie dann die Aufruf-URL Ihrer API in einen Webbrowser ein. Eine erfolgreiche Antwort gibt das Ergebnis zurück, das von der Mapping-Vorlage in der Integrationsantwort generiert wurde. 

1.  Erweitern Sie im Navigationsbereich **Stufen** die Stufe **Test**, wählen Sie **GET** für `/pets/{petId}` aus und kopieren Sie dann den **Aufruf-URL**-Wert `https://api-id.execute-api.region.amazonaws.com/test/pets/{petId}`. `{petId}` steht für eine Pfadvariable. 

    Fügen Sie den (im vorigen Schritt kopierten) **Invoke URL**-Wert in die Adresszeile des Browsers ein und ersetzen Sie `{petId}` durch z. B. `1`. Drücken Sie zum Senden der Anforderung die Eingabetaste. Als Ergebnis wird die Antwort "200 OK" mit der folgenden JSON-Nutzlast zurückgegeben: 

   ```
   {
     "id": 1,
     "type": "dog",
     "price": 249.99
   }
   ```

    Die API-Methode kann auf diese Weise aufgerufen werden, da der **Authorization**-Typ auf `NONE` festgelegt ist. Falls die `AWS_IAM`-Autorisierung verwendet wird, muss die Anfrage mit [Signature Version 4](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html) (SigV4)- oder [Signature Version 4a](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html#how-sigv4a-works) (SigV4a)-Protokollen signiert werden. Ein Beispiel für eine solche Anforderung finden Sie unter [Tutorial: REST-API mit HTTP-API ohne Proxy-Integration erstellen](api-gateway-create-api-step-by-step.md). 

# Wählen Sie ein Tutorial zur HTTP-Integration aus
<a name="getting-started-http-integrations"></a>

 Sie können entweder eine HTTP-Proxy-Integration oder eine benutzerdefinierte HTTP-Integration verwenden, um eine API mit HTTP-Integration zu erstellen.

Bei einer HTTP-Proxy-Integration müssen Sie lediglich die HTTP-Methode und die HTTP-Endpunkt-URI entsprechend der Backend-Anforderungen festlegen. Wir empfehlen, die HTTP-Proxy-Integration zu verwenden (sofern möglich), um die Vorteile der optimierten API-Einrichtung zu genießen.

Die benutzerdefinierte HTTP-Integration kann die bessere Wahl sein, wenn Client-Anforderungsdaten für das Backend oder Backend-Antwortdaten für den Client transformiert werden müssen. 

**Topics**
+ [Tutorial: Erstellen einer REST-API mit HTTP-Proxy-Integration](api-gateway-create-api-as-simple-proxy-for-http.md)
+ [Tutorial: REST-API mit HTTP-API ohne Proxy-Integration erstellen](api-gateway-create-api-step-by-step.md)

# Tutorial: Erstellen einer REST-API mit HTTP-Proxy-Integration
<a name="api-gateway-create-api-as-simple-proxy-for-http"></a>

Die HTTP-Proxy-Integration von ist ein einfacher, leistungsstarker und vielseitiger Mechanismus für den Aufbau einer API, mit der eine Webanwendung auf mehrere Ressourcen oder Funktionen des integrierten HTTP-Endpunktes (z. B. die gesamte Website) zugreifen kann und der eine unkomplizierte Einrichtung einer einzigen API-Methode verwendet. Bei der HTTP-Proxy-Integration leitet API Gateway die vom Client übermittelte Methodenanforderung an das Backend weiter. Diese übergebenen Anforderungsdaten umfassen die Abfrage-Header, Parameter für Abfragezeichenfolgen, die URL-Pfadvariablen und die Nutzlast. Der Backend-HTTP-Endpunkt oder Webserver analysiert die eingehenden Anforderungsdaten, um die eigene Antwort zu bestimmen. Die HTTP-Proxy-Integration sorgt dafür, dass der Client und das Backend direkt interagieren, ohne dass nach dem Einrichten der API-Methode ein Eingriff von API Gateway erfolgt. Dies gilt nicht für bekannte Probleme wie nicht unterstützte Zeichen, die in aufgeführt sin [Wichtige Hinweise zu Amazon API Gateway](api-gateway-known-issues.md).

Mit der umfassenden Proxy-Ressource `{proxy+}`und dem umfassenden `ANY`-Verb für die HTTP-Methode können Sie mit einer HTTP-Proxy-Integration eine API mit einer einzelnen API-Methode erstellen. Die Methode macht den gesamten Satz der öffentlich verfügbaren HTTP-Ressourcen und -Vorgänge der Website verfügbar. Wenn der Backend-Webserver mehr Ressourcen für den öffentlichen Zugriff öffnet, kann der Client diese neuen Ressourcen mit derselben API-Einrichtung nutzen. Um dies zu ermöglichen, muss der Websiteentwickler dem Cliententwickler klar kommunizieren, was die neuen Ressourcen sind und welche Vorgänge für diese Umgebungen anwendbar sind.



Als kurze Einführung zeigt die folgende Anleitung die HTTP-Proxy-Integration. Im Tutorial erstellen wir mithilfe der API Gateway-Konsole eine API, um sie über eine generische Proxyressource in die PetStore Website zu integrieren`{proxy+}`, und erstellen den Platzhalter für die HTTP-Methode. `ANY` 

**Topics**
+ [API mit HTTP-Proxy-Integration unter Verwendung der API Gateway-Konsole erstellen](#api-gateway-create-api-as-simple-proxy-for-http-build)
+ [Testen einer API mit HTTP-Proxy-Integration](#api-gateway-create-api-as-simple-proxy-for-http-test)

## API mit HTTP-Proxy-Integration unter Verwendung der API Gateway-Konsole erstellen
<a name="api-gateway-create-api-as-simple-proxy-for-http-build"></a>

 Das folgende Verfahren führt Sie durch die Schritte zum Erstellen und Testen einer API mit einer Proxy-Ressource für ein HTTP-Backend unter Verwendung der API Gateway-Konsole. Das HTTP-Backend ist die `PetStore`-Website (`http://petstore-demo-endpoint.execute-api.com/petstore/pets`) von [Tutorial: REST-API mit HTTP-API ohne Proxy-Integration erstellen](api-gateway-create-api-step-by-step.md), auf der Screenshots als visuelle Hilfsmittel zur Veranschaulichung der API Gateway-Benutzeroberflächenelemente verwendet werden. Wenn Ihnen die Verwendung der API Gateway-Konsole zur Erstellung einer API unbekannt ist, sollten Sie zuerst diesen Abschnitt lesen. 

**So erstellen Sie eine API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wenn Sie API Gateway zum ersten Mal verwenden, sehen Sie eine Seite, die Sie mit den Funktionen des Service vertraut macht. Wählen Sie unter **REST-API** die Option **Erstellen** aus. Wenn das Popup-Fenster **Create Example API (Beispiel-API erstellen)** angezeigt wird, klicken Sie auf **OK**.

   Wenn Sie API Gateway nicht zum ersten Mal verwenden, wählen Sie **Create API (API erstellen)**. Wählen Sie unter **REST-API** die Option **Build (Erstellen)** aus.

1.  Geben Sie in **API name** (API-Name) **HTTPProxyAPI** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Lassen Sie die Einstellung für **API-Endpunkttyp** bei **Regional**.

1. Wählen Sie als **IP-Adresstyp**. **IPv4**

1. Wählen Sie **Create API** (API erstellen) aus.

In diesem Schritt erstellen Sie einen Proxy-Ressourcenpfad für `{proxy+}`. Dies ist der Platzhalter für beliebige Backend-Endpunkte unter `http://petstore-demo-endpoint.execute-api.com/`. Zum Beispiel kann dies `petstore`, `petstore/pets` und `petstore/pets/{petId}` sein. API Gateway erstellt die `ANY`-Methode, wenn Sie die `{proxy+}`-Ressource erstellen, und dient als Platzhalter für alle unterstützten HTTP-Verben zur Laufzeit.

**So erstellen Sie eine **/\$1proxy\$1\$1**-Ressource**

1. Wählen Sie Ihre API aus. 

1. Klicken Sie im Hauptnavigationsbereich auf **Resources** (Ressourcen).

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1. Aktivieren Sie die Option **Proxy-Ressource**.

1. **Ressourcenpfad** wird als `/` beibehalten.

1. Geben Sie für **Resource name (Ressourcenname)** **\$1proxy\$1\$1** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.  
![\[Erstellen Sie eine untergeordnete Ressource.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/api-gateway-simple-proxy-create-proxy-resource-new-console.png)

In diesem Schritt integrieren Sie die `ANY`-Methode mithilfe einer Proxyintegration in einen Backend-HTTP-Endpunkt. Bei einer Proxy-Integration leitet API Gateway die vom Client übermittelte Methodenanforderung ohne Zutun der API-Gateway an das Backend weiter.

**Erstellen einer `ANY`-Methode**

1. Wählen Sie die Ressource **/\$1proxy\$1\$1** aus.

1. Wählen Sie die Methode **BELIEBIGE**.

1. Klicken Sie unter dem Warnsymbol auf **Integration bearbeiten**. Sie können keine API mit einer Methode bereitstellen, die keine Integration hat.

1. Wählen Sie für den **Integrationstyp** die Option **HTTP** aus.

1. Aktivieren Sie die **HTTP-Proxy-Integration**.

1. Für **HTTP-Methode** wählen Sie **BELIEBIGE** aus.

1. Geben Sie für **Endpunkt-URL** **http://petstore-demo-endpoint.execute-api.com/\$1proxy\$1** ein.

1. Wählen Sie **Speichern**.

## Testen einer API mit HTTP-Proxy-Integration
<a name="api-gateway-create-api-as-simple-proxy-for-http-test"></a>

 Ob eine bestimmte Clientanforderung erfolgreich ist, hängt von Folgendem ab: 
+  Ob das Backend den entsprechenden Backend-Endpunkt verfügbar gemacht hat und, falls dies der Fall ist, ob die erforderlichen Zugriffsberechtigungen erteilt wurden. 
+ Ob der Client die korrekte Eingabe bereitstellt.

Die hier verwendete PetStore API macht die `/petstore` Ressource beispielsweise nicht verfügbar. Daher erhalten Sie eine `404 Resource Not Found`-Antwort mit der Fehlermeldung `Cannot GET /petstore`. 

Darüber hinaus muss der Client in der Lage sein, das Ausgabeformat zu verarbeiten, um das Ergebnis des Backends korrekt zu analysieren. API Gateway fungiert nicht als Vermittler zur Vereinfachung der Interaktionen zwischen dem Client und dem Backend. 

**Um eine in die PetStore Website integrierte API mithilfe der HTTP-Proxyintegration über die Proxy-Ressource zu testen**

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Wählen Sie als **Methodentyp** die Option `GET` aus.

1. Geben Sie für **Pfad** unter **Proxy** **petstore/pets** ein.

1. Für **Abfragezeichenketten** geben Sie **type=fish** ein.

1. Wählen Sie **Test** aus.

     
![\[Methoden können mit der Testfunktion geprüft werden.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/api-gateway-simple-proxy-petstore-call-proxy-resource-new-console.png)

   Da die Backend-Website die `GET /petstore/pets?type=fish`-Anforderung unterstützt, wird eine erfolgreiche Antwort wie die folgende zurückgegeben:

   ```
   [
     {
       "id": 1,
       "type": "fish",
       "price": 249.99
     },
     {
       "id": 2,
       "type": "fish",
       "price": 124.99
     },
     {
       "id": 3,
       "type": "fish",
       "price": 0.99
     }
   ]
   ```

   Wenn Sie versuchen, `GET /petstore` aufzurufen, erhalten Sie eine `404`-Antwort mit der Fehlermeldung `Cannot GET /petstore`. Der Grund hierfür ist, dass das Backend die angegebene Operation nicht unterstützt. Wenn Sie anrufen`GET /petstore/pets/1`, erhalten Sie eine `200 OK` Antwort mit der folgenden Nutzlast, da die Anfrage von der PetStore Website unterstützt wird.

   ```
   {
     "id": 1,
     "type": "dog",
     "price": 249.99
   }
   ```

Sie können Ihre API zusätzlich in einem Browser testen. Stellen Sie Ihre API bereit und ordnen Sie sie einer Stufe zu, um die Aufruf-URL Ihrer API zu erstellen.

**Stellen Sie Ihre API bereit**

1. Klicken Sie auf **Deploy API**.

1. Wählen Sie für **Stufe** die Option **Neue Stufe** aus.

1. Geben Sie für **Stage name (Stufenname)** **test** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Wählen Sie **Bereitstellen**.

Jetzt können Clients Ihre API aufrufen. 

**So rufen Sie Ihre API auf**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Klicken Sie im Hauptnavigationsbereich auf **Stufe**.

1. Wählen Sie unter **Stufendetails** das Kopiersymbol aus, um die Aufruf-URL Ihrer API zu kopieren.

   Geben Sie die Aufruf-URL Ihrer API in einen Webbrowser ein. 

   Die URL sollte wie folgt aussehen: `https://abcdef123.execute-api.us-east-2.amazonaws.com/test/petstore/pets?type=fish`. 

   Ihr Browser sendet eine `GET`-Anforderung an die API.

1. Das Ergebnis sollte mit dem übereinstimmen, was Ihr **Test** in der API Gateway-Konsole zurückgegeben hat.

# Tutorial: REST-API mit HTTP-API ohne Proxy-Integration erstellen
<a name="api-gateway-create-api-step-by-step"></a>

 In diesem Tutorial erstellen Sie mit der Amazon API Gateway-Konsole eine API von Grund auf. Im Prinzip nutzen Sie die Konsole als API-Designstudio und wählen damit die API-Funktionen aus, testen das API-Verhalten, erstellen die API und stellen sie in Stufen bereit. 

**Topics**
+ [Erstellen einer API mit benutzerdefinierter HTTP-Integration](#api-gateway-create-resource-and-methods)
+ [(Optionale) Parameter für die Zuordnungsanforderung](#api-gateway-create-resources-and-methods-next-steps)

## Erstellen einer API mit benutzerdefinierter HTTP-Integration
<a name="api-gateway-create-resource-and-methods"></a>

 In diesem Abschnitt werden die Schritte beschrieben, mit denen Sie Ressourcen erstellen, Methoden für eine Ressource nutzen, eine Methode für bestimmte API-Verhaltensweisen konfigurieren und die API testen und bereitstellen.

In diesem Schritt erstellen Sie eine leere API. In den folgenden Schritten erstellen Sie Ressourcen und Methoden, um Ihre API mithilfe einer Nicht-Proxy-HTTP-Integration mit dem `http://petstore-demo-endpoint.execute-api.com/petstore/pets`-Endpunkt zu verbinden. 

**So erstellen Sie eine API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wenn Sie API Gateway zum ersten Mal verwenden, sehen Sie eine Seite, die Sie mit den Funktionen des Service vertraut macht. Wählen Sie unter **REST-API** die Option **Erstellen** aus. Wenn das Popup-Fenster **Create Example API (Beispiel-API erstellen)** angezeigt wird, klicken Sie auf **OK**.

   Wenn Sie API Gateway nicht zum ersten Mal verwenden, wählen Sie **Create API (API erstellen)**. Wählen Sie unter **REST-API** die Option **Build (Erstellen)** aus.

1.  Geben Sie in **API name** (API-Name) **HTTPNonProxyAPI** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Lassen Sie die Einstellung für **API-Endpunkttyp** bei **Regional**.

1. Wählen Sie als **IP-Adresstyp** die Option. **IPv4**

1. Wählen Sie **Create API** (API erstellen) aus.

In der **Resources**-Struktur wird die Stammressource (`/`) ohne Methoden angezeigt. In dieser Übung erstellen wir die API mit der benutzerdefinierten HTTP-Integration der PetStore Website (http://petstore-demo-endpoint.execute-api). com/petstore/pets.) Zur Veranschaulichung erstellen wir eine `/pets` Ressource als untergeordnetes Element des Stammverzeichnisses und stellen eine GET-Methode für diese Ressource bereit, damit ein Client eine Liste verfügbarer Pets-Elemente von der PetStore Website abrufen kann.

**Erstellen einer /pets-Ressource**

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1. Die **Proxy-Ressource** bleibt ausgeschaltet.

1. **Ressourcenpfad** wird als `/` beibehalten.

1. Geben Sie für **Resource name (Ressourcenname)** **pets** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

In diesem Schritt erstellen Sie eine `GET`-Methode für die **/pets**-Ressource. Die `GET`-Methode ist in die `http://petstore-demo-endpoint.execute-api.com/petstore/pets`-Website integriert. Die Folgenden sind weitere Optionen für eine API-Methode:
+ **POST**; wird vor allem für die Erstellung von untergeordneten Ressourcen verwendet.
+ **PUT**; wird vor allem für die Aktualisierung vorhandener Ressourcen verwendet (kann auch für die Erstellung untergeordneter Ressourcen verwendet werden, obwohl dies nicht empfohlen wird).
+ **DELETE**; wird für das Löschen von Ressourcen verwendet.
+ **PATCH**; wird für die Aktualisierung von Ressourcen verwendet.
+ **HEAD**; wird vor allem in Testszenarien verwendet. Diese Option ist identisch mit GET, gibt aber nicht die Repräsentation der Ressource zurück.
+ **OPTIONS** – kann von Aufrufern verwendet werden, um Informationen über verfügbare Kommunikationsoptionen für den Zielservice abzurufen.

 Als **HTTP method** der Integrationsanforderung müssen Sie eine Methode wählen, die vom Backend unterstützt wird. Bei `HTTP` oder `Mock integration` ist es durchaus sinnvoll, dass die Methoden- und die Integrationsanforderung das gleiche HTTP-Verb nutzen. Bei den anderen Integrationstypen verwenden Methoden- und Integrationsanforderung vermutlich unterschiedliche HTTP-Verben. Um beispielsweise eine Lambda-Funktion aufzurufen, muss die Integrationsanforderung `POST` verwenden, wohingegen die Methodenanforderung – abhängig von der Logik der Lambda-Funktion – ein beliebiges HTTP-Verb nutzen kann. 

**So erstellen Sie eine `GET`-Methode für die **/pets**-Ressource**

1. Wählen Sie die **/pets**-Ressource aus.

1. Wählen Sie **Methode erstellen** aus.

1. Wählen Sie als **Methodentyp** die Option **GET** (Abrufen) aus.

1. Für den **Integrationstyp** wählen Sie die Option **HTTP-Integration** aus.

1. Die Option **Lambda-Proxy-Integration** bleibt deaktiviert.

1. Für **HTTP-Methode** wählen Sie **GET** aus.

1. Geben Sie für **Endpunkt-URL** **http://petstore-demo-endpoint.execute-api.com/petstore/pets** ein.

   Auf der PetStore Website können Sie auf einer bestimmten Seite eine Liste von `Pet` Objekten abrufen, die nach der Art des Haustiers, z. B. „Hund“ oder „Katze“, sortiert sind.

1. Für **Inhaltsbehandlung** wählen Sie **Passthrough** aus.

1. Klicken Sie auf **Parameter für URL-Abfragezeichenfolgen**.

   Die PetStore Website verwendet die Parameter `type` und die `page` Abfragezeichenfolge, um eine Eingabe zu akzeptieren. Hierfür müssen diese Abfragezeichenfolge-Parameter zur Methodenanforderung hinzugefügt, und den entsprechenden Abfragezeichenfolgen der Integrationsanforderung zugewiesen werden. 

1. Fügen Sie die Abfragezeichenfolge-Parameter wie folgt hinzu:

   1. Wählen Sie **Abfragezeichenfolge hinzufügen** aus.

   1. Für **Name** geben Sie **type** ein.

   1. Lassen Sie die Optionen **Required** (Obligatorisch) and **Caching** (Cache) deaktiviert.

   Wiederholen Sie die obigen Schritte, um eine zusätzliche Abfragezeichenfolge namens **page** zu erstellen.

1. Wählen Sie **Methode erstellen** aus.

Bei der Anforderungsübermittlung kann der Client nun einen Haustiertyp und eine Seitenzahl als Abfragezeichenfolge-Parameter senden. Diese Eingabeparameter müssen den Abfragezeichenfolgenparametern der Integration zugeordnet werden, um die Eingabewerte an unsere PetStore Website im Backend weiterzuleiten.

**Zuordnen von Eingabeparametern zur Integrationsanforderung**

1. Klicken Sie auf der Registerkarte **Integrationsanfrage** unter **Einstellungen für Integrationsanfragen** auf **Bearbeiten**.

1. Klicken Sie auf **URL-Abfragezeichenfolgen-Parameter** und gehen Sie dann wie folgt vor: 

   1. Klicken Sie auf **Abfragezeichenfolge-Parameter hinzufügen**.

   1. Geben Sie unter **Name** **type** ein.

   1. Für **Zugeordnet von** geben Sie **method.request.querystring.type** ein.

   1. **Caching** bleibt ausgeschaltet. 

   1. Klicken Sie auf **Abfragezeichenfolge-Parameter hinzufügen**.

   1. Geben Sie unter **Name** **page** ein.

   1. Für **Zugeordnet von** geben Sie **method.request.querystring.page** ein.

   1. **Caching** bleibt ausgeschaltet. 

1. Wählen Sie **Speichern**.

**So testen Sie die API-Daten**

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Für **Abfrage-Zeichenketten** geben Sie **type=Dog&page=2** ein.

1. Wählen Sie **Test** aus.

    Das Ergebnis sollte wie folgt aussehen:

      
![\[Ergebnis des Testaufrufs der GET-Methode für die Pets-Ressource\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/api-gateway-create-api-step-by-step-test-invoke-get-on-pets-result-new-console.png)

    Nach erfolgreich ausgeführtem Test kann die API bereitgestellt und damit öffentlich verfügbar gemacht werden. 

1. Klicken Sie auf **Deploy API**.

1. Wählen Sie für **Stufe** die Option **Neue Stufe** aus.

1. Geben Sie für **Stage name (Stufenname)** **Prod** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Wählen Sie **Bereitstellen**.

1.  (Optional) Klicken Sie unter **Stufendetails** auf das Kopiersymbol für **Aufruf-URL**, um die URL Ihrer Aufruf-API zu kopieren. Sie können diese mit Tools wie [Postman](https://www.postman.com) und [cURL](https://curl.se/) zum Testen Ihrer API verwenden.

 Wenn Sie ein SDK zum Erstellen eines Clients verwenden, können Sie die Anforderung mithilfe der vom SDK bereitgestellten Methodenaufrufe signieren. Weitere Informationen zur Implementierung finden Sie jeweils im ausgewählten [AWS SDK](https://aws.amazon.com/developer/tools/). 

**Anmerkung**  
 Nach jeder Änderung der API müssen Sie die API erneut bereitstellen, um die neuen oder aktualisierten Funktionen verfügbar zu machen, bevor die Anforderungs-URL wieder aufgerufen wird. 

## (Optionale) Parameter für die Zuordnungsanforderung
<a name="api-gateway-create-resources-and-methods-next-steps"></a>

### Anfrageparameter für ein API Gateway API zuordnen
<a name="getting-started-mappings"></a>

 In diesem Tutorial erfahren Sie, wie Sie einen `{petId}`-Pfadparameter über die Methodenanforderung der API erstellen, um eine Element-ID vorzugeben, diese dem `{id}`-Pfadparameter in der Integrationsanforderungs-URL zuweisen, und dann die Anforderung an den HTTP-Endpunkt senden.

**Anmerkung**  
 Eine Verwechslung von Groß- und Kleinschreibung kann im späteren Verlauf zu Fehlern führen. 

#### Schritt 1: Erstellen von Ressourcen
<a name="getting-started-mappings-add-resources"></a>

In diesem Schritt erstellen Sie eine Ressource mit einem \$1petId\$1-Pfadparameter.

**Erstellen der \$1petId\$1-Ressource**

1. Wählen Sie die **/pets**-Ressource aus und klicken Sie dann auf **Ressource erstellen**.

1. Die **Proxy-Ressource** bleibt ausgeschaltet.

1. Für **Ressourcenpfad** wählen Sie die Option**/pets/**aus.

1. Geben Sie für **Resource name (Ressourcenname)** **\$1petId\$1** ein.

    Setzen Sie geschweifte Klammern (`{ }`) um `petId`, sodass **/pets/\$1petId\$1** angezeigt wird.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

#### Schritt 2: Erstellen und Testen der Methoden
<a name="getting-started-mappings-set-methods"></a>

 In diesem Schritt erstellen Sie eine `GET`-Methode mit einem `{petId}`-Pfadparameter. 

**Einrichten der GET-Methode**

1. Wählen Sie die **/\$1petId\$1**-Ressource aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie als **Methodentyp** die Option **GET** (Abrufen) aus.

1. Für den **Integrationstyp** wählen Sie die Option **HTTP-Integration** aus.

1. Die Option **Lambda-Proxy-Integration** bleibt deaktiviert.

1. Für **HTTP-Methode** wählen Sie **GET** aus.

1. Für **Endpunkt-URL** geben Sie **http://petstore-demo-endpoint.execute-api.com/petstore/pets/\$1id\$1** ein.

1. Für **Inhaltsbehandlung** wählen Sie **Passthrough** aus.

1. Das **Standard-Timeout** bleibt aktiviert. 

1. Wählen Sie **Methode erstellen** aus.

Als Nächstes ordnen Sie den soeben erstellten `{petId}`-Pfadparameter dem `{id}`-Pfadparameter in der HTTP-Endpunkt-URL der Integrationsanforderung zu. Die HTTP-Endpunkt-URL lautete **http://petstore-demo-endpoint.execute-api.com/petstore/pets/\$1id\$1**.

**Zuordnen des `{petId}`-Pfadparameters**

1. Klicken Sie auf der Registerkarte **Integrationsanfrage** unter **Einstellungen für Integrationsanfragen** auf **Bearbeiten**.

1. Klicken Sie auf **URL-Pfadparameter**.

1.  API Gateway erstellt einen Pfadparameter für die Integrationsanforderung namens **petId**. Dieser Pfadparameter ist jedoch nicht für die HTTP-Endpunkt-URL gültig, die Sie als Backend-Integration festgelegt haben. Der HTTP-Endpunkt verwendet `{id}` als Pfadparameter. Unter **Name** löschen Sie also **petId** und geben statt dessen **id** ein.

   Damit wird der Pfadparameter `petId` der Methodenanforderung dem Pfadparameter `id` der Integrationsanforderung zugewiesen.

1. Wählen Sie **Speichern**.

Jetzt können Sie die Methode testen.

**So testen Sie die -Methode**

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Geben Sie unter **Pfad** für **petId** den Wert **4** ein.

1. Wählen Sie **Test** aus.

   Wenn diese Aktion erfolgreich ist, zeigt **Antworttext** Folgendes an:

   ```
   {
     "id": 4,
     "type": "bird",
     "price": 999.99
   }
   ```

#### Schritt 3: Bereitstellen der API
<a name="getting-started-mappings-deploy"></a>

In diesem Schritt stellen Sie die API bereit, sodass Sie beginnen können, sie außerhalb der API-Gateway-Konsole aufzurufen.

**So stellen Sie die API bereit**

1. Klicken Sie auf **Deploy API**.

1. Für **Stufe** wählen Sie die Option **Prod** aus.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Wählen Sie **Bereitstellen** aus.

#### Schritt 4: Testen der API
<a name="getting-started-mappings-test"></a>

In diesem Schritt wechseln Sie au der API Gateway-Konsole und verwenden Ihre API, um auf den HTTP-Endpunkt zuzugreifen.

1. Klicken Sie im Hauptnavigationsbereich auf **Stufe**.

1. Wählen Sie unter **Stufendetails** das Kopiersymbol aus, um die Aufruf-URL Ihrer API zu kopieren.

   Sie sollte wie folgt aussehen:

   ```
   https://my-api-id.execute-api.region-id.amazonaws.com/prod
   ```

1. Geben Sie diese URL in das Adressfeld einer neuen Registerkarte im Browser ein und fügen Sie `/pets/4` an die URL an, bevor Sie Ihre Anforderung absenden.

1. Der Browser gibt Folgendes zurück:

   ```
   {
     "id": 4,
     "type": "bird",
     "price": 999.99
   }
   ```

#### Nächste Schritte
<a name="api-gateway-create-resources-and-methods-next-steps"></a>

Sie können Ihre API weiter anpassen, indem Sie die Anforderungsvalidierung aktivieren, Daten umwandeln oder benutzerdefinierte Gateway-Antworten erstellen. 

In den folgenden Tutorien finden Sie weitere Möglichkeiten zur Anpassung Ihrer API:
+ Weitere Informationen zur Anforderungsvalidierung finden Sie unter [Grundlegende Anforderungsvalidierung in API Gateway einrichten](api-gateway-request-validation-set-up.md).
+ Weitere Informationen zur Umwandlung von Anforderungs- und Antwort-Nutzlasten finden Sie unter [Tutorial: Ändern Sie die Integrationsanfrage und die Antwort für Integrationen zu Diensten AWS](set-up-data-transformations-in-api-gateway.md).
+ Informationen zum Erstellen benutzerdefinierter Gateway-Antworten finden Sie unter [Einrichten einer Gateway-Antwort für eine REST-API mit der API-Gateway-Konsole](set-up-gateway-response-using-the-console.md).

# Tutorial: Erstellen einer REST-API mit einer privaten Integration
<a name="getting-started-with-private-integration"></a>

In diesem Tutorial erstellen Sie eine REST-API, die eine Verbindung zu einem Amazon ECS-Service herstellt, der in einer Amazon VPC ausgeführt wird. Clients außerhalb Ihrer Amazon VPC können die API verwenden, um auf Ihren Amazon-ECS-Service zuzugreifen. 

Für dieses Tutorial brauchen Sie ungefähr eine Stunde. Zunächst verwenden Sie eine CloudFormation Vorlage, um einen Amazon VPC- und Amazon ECS-Service zu erstellen. Anschließend verwenden Sie die API Gateway Gateway-Konsole, um einen VPC-Link V2 zu erstellen. Der VPC-Link ermöglicht es API Gateway, auf den Amazon-ECS-Service zuzugreifen, der in Ihrer Amazon VPC ausgeführt wird. Als Nächstes erstellen Sie eine REST-API, die den VPC-Link V2 verwendet, um eine Verbindung zu Ihrem Amazon ECS-Service herzustellen. Zuletzt testen Sie Ihre API.

Wenn Sie Ihre REST-API aufrufen, leitet API Gateway die Anfrage über Ihren VPC-Link V2 an Ihren Amazon ECS-Service weiter und gibt dann die Antwort vom Service zurück.

**Anmerkung**  
Dieses Tutorial wurde zuvor für HTTP APIs unterstützt und wird jetzt für REST APIs mithilfe von VPC Link V2 unterstützt.

![\[Übersicht der REST-API, die Sie in diesem Tutorial erstellen.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/private-integration-rest.png)


Um dieses Tutorial abzuschließen, benötigen Sie ein AWS Konto und einen AWS Identity and Access Management Benutzer mit Konsolenzugriff. Weitere Informationen finden Sie unter [Einrichten der API Gateway](setting-up.md).

**Topics**
+ [Schritt 1: Erstellen Sie einen Amazon-ECS-Service](#rest-api-private-integration-create-ecs-service)
+ [Schritt 2: Erstellen eines VPC-Links](#http-api-private-integration-vpc-link)
+ [Schritt 3: Erstellen Sie eine REST-API](#http-api-private-integration-create-api)
+ [Schritt 4: Testen Sie Ihre API](#rest-api-private-integration-test-api)
+ [Schritt 5: Bereitstellen Ihrer API](#rest-api-private-integration-deploy-api)
+ [Schritt 6: Rufen Sie Ihre API auf](#rest-api-private-integration-call)
+ [Schritt 7: Bereinigen](#rest-api-private-integration-cleanup)

## Schritt 1: Erstellen Sie einen Amazon-ECS-Service
<a name="rest-api-private-integration-create-ecs-service"></a>

Amazon ECS ist ein Container-Management-Service, mit dem Sie unkompliziert Docker-Container in einem Cluster ausführen, beenden und verwalten können. In diesem Tutorial führen Sie Ihren Cluster auf einer serverlosen Infrastruktur aus, die von Amazon ECS verwaltet wird.

Laden Sie [diese CloudFormation Vorlage](samples/rest-private-integration-tutorial.zip) herunter und entpacken Sie sie, wodurch alle Abhängigkeiten für den Service, einschließlich einer Amazon VPC, erstellt werden. Sie verwenden die Vorlage, um einen Amazon-ECS-Service zu erstellen, der einen Application Load Balancer verwendet.

**Um einen Stack zu erstellen CloudFormation**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie **Stack erstellen** und dann **Mit neuen Ressourcen (Standard)** aus.

1. Wählen Sie unter **Vorlage angeben** die Option **Vorlagendatei hochladen** aus.

1. Wählen Sie die Vorlage aus, die Sie heruntergeladen haben.

1. Wählen Sie **Weiter** aus. 

1. Geben Sie für **Stack-Name** die Zeichenfolge **rest-api-private-integrations-tutorial** ein und klicken Sie auf **Weiter**.

1. Wählen Sie in **Stack-Optionen konfigurieren** die Option **Weiter** aus.

1. Bestätigen Sie bei **Capabilities**, dass IAM-Ressourcen in Ihrem Konto erstellt werden CloudFormation können.

1. Wählen Sie **Weiter** und anschließend **Absenden** aus.

CloudFormation stellt den ECS-Service bereit, was einige Minuten dauern kann. Wenn der Status Ihres CloudFormation Stacks **CREATE\$1COMPLETE** lautet, können Sie mit dem nächsten Schritt fortfahren.

## Schritt 2: Erstellen eines VPC-Links
<a name="http-api-private-integration-vpc-link"></a>

Ein VPC-Link ermöglicht es API Gateway, auf private Ressourcen in einer Amazon VPC zuzugreifen. Sie verwenden einen VPC-Link, um Kunden den Zugriff auf Ihren Amazon ECS-Service über Ihre REST-API zu ermöglichen.

**So erstellen Sie einen VPC-Link**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Klicken Sie im Hauptnavigationsbereich auf **VPC-Links** und dann auf **Erstellen**.

   Sie müssen möglicherweise auf das Menüsymbol klicken, um den Hauptnavigationsbereich zu öffnen.

1. **Wählen Sie für Wählen Sie eine VPC-Link-Version** die Option **VPC-Link V2** aus.

1. Geben Sie als **Name** die Zeichenfolge „**private-integrations-tutorial**“ ein.

1. Wählen Sie für **VPC** die in Schritt 1 erstellte VPC aus. Der Name muss mit **RestApiStack** beginnen.

1. Wählen Sie für **Subnetze** die beiden privaten Subnetze in Ihrer VPC aus. Ihre Namen enden mit `PrivateSubnet`.

1. Wählen Sie unter **Sicherheitsgruppen** die Gruppen-ID aus, die mit `private-integrations-tutorial` beginnt und die `RestApiStack/RestApiTutorialService/Service/SecurityGroup`-Beschreibung enthält.

1. Wählen Sie **Erstellen** aus.

Nachdem Sie Ihren VPC-Link V2 erstellt haben, stellt API Gateway Elastic Network Interfaces für den Zugriff auf Ihre VPC bereit. Der Vorgang kann einige Minuten dauern. In der Zwischenzeit können Sie Ihre API erstellen.

## Schritt 3: Erstellen Sie eine REST-API
<a name="http-api-private-integration-create-api"></a>

Die REST-API bietet einen HTTP-Endpunkt für Ihren Amazon ECS-Service.



**So erstellen Sie eine REST-API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie **API erstellen** und dann für **Rest-API** die Option **Erstellen** aus.

1. Geben Sie unter **Name** **private-integration-api** ein.

1. Wählen Sie als **IP-Adresstyp** die Option. **IPv4**

1. Wählen Sie **Create API** (API erstellen) aus.

   Nachdem Sie Ihre API erstellt haben, erstellen Sie eine Methode.

1. Wählen Sie **Methode erstellen** aus und gehen Sie dann wie folgt vor:

   1. Wählen Sie als **Methodentyp** die Option `GET` aus.

   1. Für **Integrationstyp** wählen Sie **VPC-Link** aus.

   1. Aktivieren Sie die **Lambda-Proxy-Integration**.

   1. Für **HTTP-Methode** wählen Sie `GET` aus.

   1. Wählen Sie für **VPC-Link** den VPC-Link V2 aus, den Sie im vorherigen Schritt erstellt haben.

   1. Geben Sie als **Integrationsziel** den Load Balancer ein, den Sie mit der CloudFormation Vorlage in Schritt 1 erstellt haben. Sein Name sollte mit **rest-** beginnen.

   1. Geben Sie für **Endpunkt-URL** `http://private-integrations-tutorial.com` ein.

      Die URL wird verwendet, um den `Host` Header der Integrationsanfrage festzulegen. In diesem Fall ist der Host-Header**private-integrations-tutorial**.

   1. Wählen Sie **Methode erstellen** aus.

      Mit der Proxy-Integration ist die API bereit zum Testen.

## Schritt 4: Testen Sie Ihre API
<a name="rest-api-private-integration-test-api"></a>

Als Nächstes testen Sie den Aufruf der API-Methode.

**So testen Sie Ihre API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. **Wählen Sie Test**

   Stellen Sie sicher, dass die Antwort Ihrer API eine Willkommensnachricht ist, die Ihnen mitteilt, dass Ihre App auf Amazon ECS ausgeführt wird.

## Schritt 5: Bereitstellen Ihrer API
<a name="rest-api-private-integration-deploy-api"></a>

Als Nächstes stellen Sie Ihre API bereit.

**Stellen Sie Ihre API bereit**

1. Klicken Sie auf **Deploy API**.

1. Wählen Sie für **Stufe** die Option **Neue Stufe** aus.

1. Geben Sie für **Stage name (Stufenname)** **Prod** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Wählen Sie **Bereitstellen**.

## Schritt 6: Rufen Sie Ihre API auf
<a name="rest-api-private-integration-call"></a>

Nachdem Ihre API bereitgestellt wurde, können Sie sie aufrufen.

**Um Ihre API aufzurufen**

1. Geben Sie die Aufruf-URL in einen Webbrowser ein.

   Die URL sollte wie folgt aussehen: `https://abcd123.execute-api.us-east-2.amazonaws.com/Prod`. 

   Ihr Browser sendet eine `GET`-Anforderung an die API.

1. Stellen Sie sicher, dass die Antwort Ihrer API eine Willkommensnachricht ist, die Ihnen mitteilt, dass Ihre App auf Amazon ECS ausgeführt wird.

   Wenn Sie die Willkommensnachricht sehen, haben Sie erfolgreich einen Amazon ECS-Service erstellt, der in einer Amazon VPC ausgeführt wird, und Sie haben eine API-Gateway-REST-API mit einem VPC-Link V2 verwendet, um auf den Amazon ECS-Service zuzugreifen.

## Schritt 7: Bereinigen
<a name="rest-api-private-integration-cleanup"></a>

Um unnötige Kosten zu verhindern, löschen Sie die Ressourcen, die Sie im Rahmen dieses Tutorials erstellt haben. Mit den folgenden Schritten werden Ihr VPC-Link V2, Ihr CloudFormation Stack und Ihre REST-API gelöscht.

**So löschen Sie eine REST-API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie auf der **APIs**Seite eine API aus. Wählen Sie **Aktionen**, wählen Sie **Löschen**und bestätigen Sie dann Ihre Auswahl.

**So löschen Sie einen VPC-Link**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie **VPC-Link**.

1. Wählen Sie Ihren VPC-Link aus, wählen Sie **Löschen** und bestätigen Sie dann Ihre Auswahl.

**Um einen Stapel zu löschen CloudFormation**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie Ihren CloudFormation Stack aus.

1. Wählen Sie **Löschen** und bestätigen Sie dann Ihre Auswahl.

# Tutorial: Erstellen Sie eine REST-API mit einer AWS Integration
<a name="getting-started-aws-proxy"></a>

 In [Tutorial: Erstellen einer REST-API mit einer Lambda-Proxy-Integration](api-gateway-create-api-as-simple-proxy-for-lambda.md) und [Tutorial: Erstellen einer REST-API mit einer Lambda-Nicht-Proxy-Integration](getting-started-lambda-non-proxy-integration.md) wird beschrieben, wie eine API Gateway-API erstellt wird, um die integrierte Lambda-Funktion zu bereitzustellen. Darüber hinaus können Sie eine API-Gateway-API erstellen, um andere AWS Dienste wie Amazon SNS, Amazon S3, Amazon Kinesis usw. verfügbar zu machen. AWS Lambda Dies wird durch die `AWS`-Integration ermöglicht. Die Lambda-Integration oder die Lambda-Proxy-Integration ist ein Sonderfall, bei dem der Aufruf der Lambda-Funktion über die API Gateway-API bereitgestellt wird. 

 Alle AWS Dienste unterstützen ausschließlich APIs die Bereitstellung ihrer Funktionen. Die Anwendungsprotokolle oder Programmierschnittstellen sind jedoch wahrscheinlich von Service zu Service unterschiedlich. Eine API-Gateway-API mit der `AWS` Integration hat den Vorteil, dass sie Ihrem Kunden ein konsistentes Anwendungsprotokoll für den Zugriff auf verschiedene AWS Dienste bietet. 

 In dieser exemplarischen Vorgehensweise erstellen wir eine API zur Bereitstellung von von Amazon SNS. Weitere Beispiele für die Integration einer API mit anderen AWS Diensten finden Sie unter[Amazon API Gateway-Tutorials und -Workshops](api-gateway-tutorials.md). 

 Im Gegensatz zur Lambda-Proxy-Integration gibt es keine entsprechende Proxy-Integration für andere AWS -Services. Daher wird eine API-Methode mit einer einzigen AWS Aktion integriert. Für mehr Flexibilität, ähnlich wie bei der Proxy-Integration, können Sie eine Lambda-Proxy-Integration einrichten. Die Lambda-Funktion analysiert und verarbeitet dann Anfragen für andere AWS Aktionen. 

 API Gateway versucht es nicht erneut, wenn der Endpunkt das Zeitlimit überschreitet. Der API-Aufrufer muss eine Logik für Wiederholversuche implementieren, um mit Endpunkt-Timeouts umzugehen. 

 Diese schrittweise Anleitung basiert auf den Anweisungen und Konzepten in [Tutorial: Erstellen einer REST-API mit einer Lambda-Nicht-Proxy-Integration](getting-started-lambda-non-proxy-integration.md). Wenn Sie diese Anleitung noch nicht ausgeführt haben, sollen Sie dies zuerst nachholen. 



**Topics**
+ [Voraussetzungen](#getting-started-aws-proxy-prerequisites)
+ [Schritt 1: Erstellen Sie die AWS Service-Proxy-Ausführungsrolle](#getting-started-aws-proxy-add-roles)
+ [Schritt 2: Erstellen der Ressource](#getting-started-aws-proxy-add-resources)
+ [Schritt 3: Erstellen der GET-Methode](#getting-started-aws-proxy-add-methods)
+ [Schritt 4: Angeben von Methodeneinstellungen und Testen der Methode](#getting-started-aws-proxy-set-methods)
+ [Schritt 5: Bereitstellen der API](#getting-started-aws-proxy-deploy)
+ [Schritt 6: Testen der API](#getting-started-aws-proxy-test)
+ [Schritt 7: Bereinigen](#getting-started-aws-proxy-clean-up)

## Voraussetzungen
<a name="getting-started-aws-proxy-prerequisites"></a>

Führen Sie die folgenden Schritte aus, bevor Sie mit der schrittweisen Anleitung beginnen:

1. Führen Sie die Schritte unter au [Einrichten der API Gateway](setting-up.md).

1.  Erstellen Sie eine neue API mit dem Namen `MyDemoAPI`. Weitere Informationen finden Sie unter [Tutorial: REST-API mit HTTP-API ohne Proxy-Integration erstellen](api-gateway-create-api-step-by-step.md). 

1. Stellen Sie die API mindestens einmal für eine Stufe mit dem Namen berei `test`. Weitere Informationen finden Sie unter [Bereitstellen der API](getting-started-lambda-non-proxy-integration.md#getting-started-deploy-api) in [Wählen Sie ein AWS Lambda Integrations-Tutorial](getting-started-with-lambda-integration.md).

1. Führen Sie die restlichen Schritte in au [Wählen Sie ein AWS Lambda Integrations-Tutorial](getting-started-with-lambda-integration.md).

1. Erstellen Sie mindestens ein Thema in Amazon Simple Notification Service (Amazon SNS). Sie verwenden die bereitgestellte API, um eine Liste der Themen in Amazon SNS abzurufen, die mit Ihrem AWS Konto verknüpft sind. Wie Sie ein Thema in Amazon SNS erstellen, erfahren Sie unter [Thema erstellen](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html). (Sie müssen nicht die in Schritt 5 erwähnte Thema-ARN kopieren.)

## Schritt 1: Erstellen Sie die AWS Service-Proxy-Ausführungsrolle
<a name="getting-started-aws-proxy-add-roles"></a>

 Einer IAM-Rolle müssen geeignete IAM-Richtlinien zugeordnet sein, damit die API Amazon-SNS-Aktionen aufrufen kann. In dieser Übung erstellen Sie eine neue IAM-Rolle.

**Um die AWS Service-Proxy-Ausführungsrolle zu erstellen**

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

1. Wählen Sie **Roles**.

1. Wählen Sie **Rolle erstellen** aus.

1.  Wählen Sie unter **Typ der vertrauenswürdigen Entität auswählen** die Option **AWS Dienst** aus, wählen Sie dann **API Gateway** aus und wählen Sie **Erlaubt API Gateway, Logs in Logs zu CloudWatch übertragen**.

1.  Klicken Sie auf **Weiter** und dann erneut auf **Weiter**.

1. Geben Sie für **Role name (Rollenname)** den Namen **APIGatewaySNSProxyPolicy** ein und klicken Sie auf **Create role (Rolle erstellen)**.

1. Wählen Sie in der Liste **Roles** die Rolle aus, die Sie gerade erstellt haben. Möglicherweise müssen Sie scrollen oder die Rolle über die Suchleiste finden.

1. Wählen Sie für die ausgewählte Rolle die Registerkarte **Berechtigungen hinzufügen** aus.

1. Wählen Sie in der Dropdown-Liste **Berechtigungen anfügen** aus.

1. Geben Sie im Suchfeld **AmazonSNSReadOnlyAccess** ein und wählen Sie **Berechtigungen hinzufügen** aus. 
**Anmerkung**  
Dieses Tutorial verwendet der Einfachheit halber eine verwaltete Richtlinie. Als Best Practice sollten Sie Ihre eigene IAM-Richtlinie erstellen, um die erforderlichen Mindestberechtigungen zu gewähren. 

1. Notieren Sie sich den neu erstellten **Rollen-ARN**, Sie werden ihn später brauchen.

## Schritt 2: Erstellen der Ressource
<a name="getting-started-aws-proxy-add-resources"></a>

In diesem Schritt erstellen Sie eine Ressource, die es dem AWS Service-Proxy ermöglicht, mit dem AWS Dienst zu interagieren.

**So erstellen Sie die Ressource**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Wählen Sie die Stammressource **/** aus. Sie erkennen sie an dem einzelnen Schrägstrich (**/**), und klicken Sie dann auf **Ressource erstellen**.

1. Die **Proxy-Ressource** bleibt ausgeschaltet.

1. **Ressourcenpfad** wird als `/` beibehalten.

1. Geben Sie für **Resource name (Ressourcenname)** **mydemoawsproxy** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

## Schritt 3: Erstellen der GET-Methode
<a name="getting-started-aws-proxy-add-methods"></a>

In diesem Schritt erstellen Sie eine GET-Methode, die es dem AWS Dienstproxy ermöglicht, mit dem Dienst zu interagieren. AWS 

**So erstellen Sie die `GET`-Methode**

1. Wählen Sie die **/mydemoawsproxy**-Ressource aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie als Methodentyp **GET** aus.

1. Für **Integrationstyp** wählen Sie **AWS-Service** aus.

1. Wählen Sie für den Ort aus **AWS-Region**, AWS-Region an dem Sie Ihr Amazon SNS SNS-Thema erstellt haben.

1. Wählen Sie für **AWS-Service** **Amazon SNS** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Für **HTTP-Methode** wählen Sie **GET** aus.

1. Wählen Sie für **Aktionstyp** die Option **Aktionsnamen verwenden** aus.

1. Für **Aktionsname** geben Sie **ListTopics** ein.

1. Geben Sie für **Ausführungsrolle** den Rollen-ARN für **APIGatewaySNSProxyPolicy** ein.

1. Wählen Sie **Methode erstellen** aus.

## Schritt 4: Angeben von Methodeneinstellungen und Testen der Methode
<a name="getting-started-aws-proxy-set-methods"></a>

Sie können nun Ihre `GET`-Methode testen, um sicherzustellen, dass sie korrekt für die Auflistung Ihrer SNS-Themen eingerichtet wurde.

**So testen Sie die `GET`-Methode**

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Wählen Sie **Test** aus.

   Im Ergebnis wird eine Antwort ähnlich der Folgenden angezeigt:

   ```
   {
     "ListTopicsResponse": {
       "ListTopicsResult": {
         "NextToken": null,
         "Topics": [
           {
             "TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-1"
           },
           {
             "TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-2"
           },
           ...
           {
             "TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-N"
           }
         ]
       },
       "ResponseMetadata": {
         "RequestId": "abc1de23-45fa-6789-b0c1-d2e345fa6b78"
       }
     }
   }
   ```

## Schritt 5: Bereitstellen der API
<a name="getting-started-aws-proxy-deploy"></a>

In diesem Schritt stellen Sie die API bereit, damit Sie sie von außerhalb der API Gateway-Konsole aufrufen können.

**So stellen Sie die API bereit**

1. Klicken Sie auf **Deploy API**.

1. Wählen Sie für **Stufe** die Option **Neue Stufe** aus.

1. Geben Sie für **Stage name (Stufenname)** **test** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Wählen Sie **Deploy (Bereitstellen)** aus.

## Schritt 6: Testen der API
<a name="getting-started-aws-proxy-test"></a>

In diesem Schritt verlassen Sie die API Gateway Gateway-Konsole und verwenden Ihren AWS Service-Proxy, um mit dem Amazon SNS SNS-Service zu interagieren.

1. Klicken Sie im Hauptnavigationsbereich auf **Stufe**.

1. Wählen Sie unter **Stufendetails** das Kopiersymbol aus, um die Aufruf-URL Ihrer API zu kopieren.

   Das sollte wie folgt aussehen:

   ```
   https://my-api-id.execute-api.region-id.amazonaws.com/test
   ```

1. Geben Sie die URL in das Adressfeld einer neuen Registerkarte im Browser ein.

1. Fügen Sie `/mydemoawsproxy` an, sodass die URL wie folgt aussieht:

   ```
   https://my-api-id.execute-api.region-id.amazonaws.com/test/mydemoawsproxy
   ```

   Rufen Sie die URL auf. Informationen wie die folgenden werden angezeigt:

   ```
   {"ListTopicsResponse":{"ListTopicsResult":{"NextToken": null,"Topics":[{"TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-1"},{"TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-2"},...{"TopicArn": "arn:aws:sns:us-east-1:80398EXAMPLE:MySNSTopic-N}]},"ResponseMetadata":{"RequestId":"abc1de23-45fa-6789-b0c1-d2e345fa6b78}}}
   ```

## Schritt 7: Bereinigen
<a name="getting-started-aws-proxy-clean-up"></a>

Sie können die IAM-Ressourcen löschen, die der AWS Service-Proxy benötigt, um zu funktionieren.

**Warnung**  
Wenn Sie eine IAM-Ressource löschen, auf die sich ein AWS Service-Proxy stützt, funktionieren dieser AWS Dienstproxy und alle APIs , die darauf angewiesen sind, nicht mehr. Das Löschen einer IAM-Ressource kann nicht rückgängig gemacht werden. Wenn Sie die IAM-Ressource wieder nutzen möchten, müssen Sie diese neu erstellen.

**Löschen Sie die zugehörigen IAM-Ressourcen wie folgt:**

1. Öffnen Sie unter [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) die IAM-Konsole.

1. Wählen Sie im Bereich **Details** die Option **Roles** aus.

1. Wählen Sie **APIGatewayAWSProxyExecRole** aus und anschließend **Role Actions** und **Delete Role**. Wählen Sie bei Aufforderung **Yes, Delete**.

1. Wählen Sie im Bereich **Details** **Policies**.

1. Wählen Sie **APIGatewayAWSProxyExecPolicy** und dann anschließend **Policy Actions** ** Delete**. Wählen Sie bei Aufforderung **Löschen**.

 Sie haben das Ende dieser Anleitung erreicht. Ausführlichere Erläuterungen zum Erstellen einer API als AWS Dienstproxy finden Sie unter, [Tutorial: REST-API als AmazonS3-Proxy erstellen](integrating-api-with-aws-services-s3.md)[Tutorial: Erstellen Sie eine Rechner-REST-API mit zwei AWS Serviceintegrationen und einer Lambda-Non-Proxy-Integration](integrating-api-with-aws-services-lambda.md), oder[Tutorial: REST-API als Amazon Kinesis-Proxy erstellen](integrating-api-with-aws-services-kinesis.md). 

# Tutorial: Erstellen Sie eine Rechner-REST-API mit zwei AWS Serviceintegrationen und einer Lambda-Non-Proxy-Integration
<a name="integrating-api-with-aws-services-lambda"></a>

Das [Tutorial: Erstellen einer REST-API mit einer Lambda-Nicht-Proxy-Integration](getting-started-lambda-non-proxy-integration.md) verwendet ausschließlich `Lambda Function`-Integration. Die `Lambda Function`-Integration ist ein Sonderfall des `AWS Service`-Integrationstyps, der einen Großteil der Integrationseinrichtung für Sie durchführt, z. B. das automatische Hinzufügen der erforderlichen ressourcenbasierten Berechtigungen zum Aufrufen der Lambda-Funktion. Hier wird bei zwei der drei Integrationen die `AWS Service`-Integration verwendet. Bei diesem Integrationstyp haben Sie mehr Kontrolle, aber Sie müssen bestimmte Aufgaben manuell ausführen. Hierzu gehört z. B. das Erstellen und Angeben einer IAM-Rolle mit entsprechenden Berechtigungen.



In diesem Tutorial erstellen Sie eine `Calc`-Lambda-Funktion, die grundlegende Rechenoperationen implementiert und dabei Ein- und Ausgaben im JSON-Format annimmt und zurückgibt. Dann erstellen Sie eine REST-API und integrieren sie mit der Lambda-Funktion auf folgende Weise:

1. Verwenden einer `GET`-Methode für die `/calc`-Ressource, um die Lambda-Funktion aufzurufen, wobei die Eingabe als Abfragezeichenfolge-Parameter übergeben wird. (`AWS Service`-Integration)

1. Verwenden einer `POST`-Methode für die `/calc`-Ressource, um die Lambda-Funktion aufzurufen, wobei die Eingabe in der Methodenanforderungsnutzlast übergeben wird. (`AWS Service`-Integration)

1. Verwenden einer `GET`-Methode für verschachtelte `/calc/{operand1}/{operand2}/{operator}`-Ressourcen, um die Lambda-Funktion aufzurufen, wobei die Eingabe als Pfadparameter übergeben wird. (`Lambda Function`-Integration)

Über dieses Tutorial hinaus steht die [OpenAPI-Definitionsdatei](api-as-lambda-proxy-export-swagger-with-extensions.md) für die `Calc`-API, die Sie in API Gateway importieren können, bereit. Befolgen Sie dazu die Anweisungen in [Entwickeln APIs Sie REST mit OpenAPI in API Gateway](api-gateway-import-api.md).

**Topics**
+ [Übernehmbare IAM-Rolle erstellen](#api-as-lambda-proxy-setup-iam-role-policies)
+ [Erstellen einer `Calc`-Lambda-Funktion](#api-as-lambda-proxy-create-lambda-function)
+ [`Calc` Lambda-Funktion testen](#api-as-lambda-proxy-test-lambda-function-)
+ [Erstellen einer `Calc`-API](#api-as-lambda-proxy-create-api-resources)
+ [Integration 1: Erstellen Sie eine `GET`-Methode mit Abfrageparametern, um die Lambda-Funktion aufzurufen](#api-as-lambda-proxy-expose-get-method-with-query-strings-to-call-lambda-function)
+ [Integration 2: Erstellen Sie eine `POST`-Methode mit einem JSON-Payload für den Aufruf der Lambda-Funktion](#api-as-lambda-proxy-expose-post-method-with-json-body-to-call-lambda-function)
+ [Integration 3: Erstellen Sie eine `GET`-Methode mit Pfadparametern für den Aufruf der Lambda-Funktion](#api-as-lambda-proxy-expose-get-method-with-path-parameters-to-call-lambda-function)
+ [OpenAPI-Definitionen der mit einer Lambda-Funktion integrierten Beispiel-API](api-as-lambda-proxy-export-swagger-with-extensions.md)

## Übernehmbare IAM-Rolle erstellen
<a name="api-as-lambda-proxy-setup-iam-role-policies"></a>

Damit Ihre API Ihre `Calc` Lambda-Funktion aufrufen kann, benötigen Sie eine IAM-Rolle, die von API Gateway übernommen werden kann, d. h. eine IAM-Rolle mit der folgenden vertrauenswürdigen Beziehung:

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
```

------

Die Rolle, die Sie erstellen, benötigt eine [InvokeFunction](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html)Lambda-Berechtigung. Andernfalls erhält der API-Aufrufer eine `500 Internal Server Error`-Antwort. Um der Rolle diese Berechtigung zu erteilen, hängen ihr die folgende IAM-Richtlinie an:

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "*"
        }
    ]
}
```

------

Gehen Sie hierzu folgendermaßen vor:

**API Gateway erstellen, das die IAM-Rolle übernimmt**

1. Melden Sie sich bei der IAM-Konsole an.

1. Wählen Sie **Roles**.

1. Wählen Sie **Create Role** aus.

1. Wählen Sie unter **Select type of trusted entity** (Typ der vertrauenswürdigen Entität auswählen) die Option **AWS Service** aus.

1. Wählen Sie unter **Choose the service that will use this role** (Die Rolle auswählen, die diese Rollen verwenden wird) die Option **Lambda** aus.

1. Wählen Sie **Next: Permissions** aus.

1. Wählen Sie **Create Policy (Richtlinie erstellen)** aus.

   Ein neues **Create Policy** Konsolen-Fenster wird geöffnet. Führen Sie in diesem Fenster folgende Schritte aus:

   1. Ersetzen Sie auf der Registerkarte **JSON** die vorhandene Richtlinie durch Folgendes:

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "lambda:InvokeFunction",
                  "Resource": "*"
              }
          ]
      }
      ```

------

   1. Wählen Sie **Review policy (Richtlinie prüfen)** aus.

   1. Gehen Sie unter **Review Policy** wie folgt vor:

      1. Geben Sie unter **Name** einen Namen wie **lambda\$1execute** ein.

      1. Wählen Sie **Create Policy (Richtlinie erstellen)** aus.

1. Führen Sie im ursprünglichen Konsolen-Fenster **Create Role** Folgendes aus:

   1. Wählen Sie unter **Attach permissions policies (Berechtigungsrichtlinien hinzufügen)**, wählen die **lambda\$1execute** Richtlinie aus der Dropdown-Liste aus.

      Wenn Ihre Richtlinie nicht in der Liste angezeigt wird, wählen Sie die Schaltfläche "Aktualisieren" oben in der Liste aus. (Aktualisieren Sie nicht die Browserseite\$1)

   1. Wählen Sie **Next: Tags (Weiter: Tags)** aus.

   1. Klicken Sie auf **Weiter: Prüfen**.

   1. Geben Sie unter **Role name** einen Namen wie **lambda\$1invoke\$1function\$1assume\$1apigw\$1role** ein.

   1. Wählen Sie **Create role** aus.

1. Wählen Sie Ihre **lambda\$1invoke\$1function\$1assume\$1apigw\$1role** aus der Rollen-Liste aus.

1. Wählen Sie die Registerkarte **Trust relationships (Vertrauensstellungen)**.

1. Wählen Sie **Edit Trust Relationship (Vertrauensstellungen bearbeiten)**.

1. Ersetzen Sie die vorhandene Richtlinie durch Folgendes:

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "",
         "Effect": "Allow",
         "Principal": {
           "Service": [
             "lambda.amazonaws.com",
             "apigateway.amazonaws.com"
           ]
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

1. Wählen Sie **Update Trust Policy**.

1. Notieren Sie sich die Rolle ARN für die Rolle, die Sie gerade erstellt haben. Sie benötigen sie zu einem späteren Zeitpunkt.

## Erstellen einer `Calc`-Lambda-Funktion
<a name="api-as-lambda-proxy-create-lambda-function"></a>

Als Nächstes erstellen Sie eine Lambda-Funktion unter Verwendung der Lambda-Konsole.

1. Wählen Sie in der Lambda-Konsole **Create function (Funktion erstellen)**.

1. Wählen Sie **Author from scratch** aus.

1. Geben Sie als **Name** die Zeichenfolge „**Calc**“ ein.

1. Wählen Sie für **Laufzeit** die neueste unterstützte **Node.js**- oder **Python**-Laufzeit aus.

1. Verwenden Sie die Standardeinstellung für alle anderen Optionen.

1. Wählen Sie **Funktion erstellen**.

1.  Kopieren Sie die folgende Lambda-Funktion in Ihre bevorzugte Laufzeit und fügen Sie sie in den Code-Editor in der Lambda-Konsole ein. 

------
#### [ Node.js ]

   ```
   export const handler = async function (event, context) {
     console.log("Received event:", JSON.stringify(event));
   
     if (
       event.a === undefined ||
       event.b === undefined ||
       event.op === undefined
     ) {
       return "400 Invalid Input";
     }
   
     const res = {};
     res.a = Number(event.a);
     res.b = Number(event.b);
     res.op = event.op;
     if (isNaN(event.a) || isNaN(event.b)) {
       return "400 Invalid Operand";
     }
     switch (event.op) {
       case "+":
       case "add":
         res.c = res.a + res.b;
         break;
       case "-":
       case "sub":
         res.c = res.a - res.b;
         break;
       case "*":
       case "mul":
         res.c = res.a * res.b;
         break;
       case "/":
       case "div":
         if (res.b == 0) {
           return "400 Divide by Zero";
         } else {
           res.c = res.a / res.b;
         }
         break;
       default:
         return "400 Invalid Operator";
     }
   
     return res;
   };
   ```

------
#### [ Python ]

   ```
   import json
   
   
   def lambda_handler(event, context):
       print(event)
   
       try:
           (event['a']) and (event['b']) and (event['op'])
       except KeyError:
           return '400 Invalid Input'
   
       try:
           res = {
               "a": float(
                   event['a']), "b": float(
                   event['b']), "op": event['op']}
       except ValueError:
           return '400 Invalid Operand'
   
       if event['op'] == '+':
           res['c'] = res['a'] + res['b']
       elif event['op'] == '-':
           res['c'] = res['a'] - res['b']
       elif event['op'] == '*':
           res['c'] = res['a'] * res['b']
       elif event['op'] == '/':
           if res['b'] == 0:
               return '400 Divide by Zero'
           else:
               res['c'] = res['a'] / res['b']
       else:
           return '400 Invalid Operator'
   
       return res
   ```

------

1. Wählen Sie unter "Ausführungsrolle" **Choose an existing role (Wählen Sie eine vorhandene Rolle aus)** aus.

1. Geben Sie den Rollen-ARN für die zuvor erstellte **lambda\$1invoke\$1function\$1assume\$1apigw\$1role**-Rolle ein.

1. Wählen Sie **Deploy (Bereitstellen)** aus.

 Diese Funktion erfordert zwei Operanden (`a` und `b`) und einen Operator (`op`) aus dem Eingabeparameter `event`. Die Eingabe ist ein JSON-Objekt im folgenden Format: 

```
{
  "a": "Number" | "String",
  "b": "Number" | "String",
  "op": "String"
}
```

Diese Funktion gibt das berechnete Ergebnis (`c`) und die Eingabe zurück. Im Falle einer ungültigen Eingabe gibt die Funktion entweder den Wert null (0) oder die Zeichenfolge "Invalid op" als Ergebnis zurück. Die Ausgabe erfolgt im folgenden JSON-Format: 

```
{
  "a": "Number",
  "b": "Number",
  "op": "String",
  "c": "Number" | "String"
}
```

Testen Sie die Funktion in der Lambda-Konsole, bevor Sie diese im nächsten Schritt in die API integrieren. 

## `Calc` Lambda-Funktion testen
<a name="api-as-lambda-proxy-test-lambda-function-"></a>

Hier erfahren Sie, wie Sie Ihre `Calc` Funktion in der Lambda-Konsole testen können:

1. Wählen Sie die Registerkarte **Test**.

1. Geben Sie für den Testereignisnamen ei **calc2plus5**.

1. Ersetzen Sie die Testereignisdefinition durch Folgendes:

   ```
   {
     "a": "2",
     "b": "5",
     "op": "+"
   }
   ```

1. Wählen Sie **Save (Speichern)** aus.

1. Wählen Sie **Test** aus.

1. Erweitern Sie **Execution result: succeeded (Ausführungsergebnis: erfolgreich)**. Sie sollten Folgendes sehen:

   ```
   {
     "a": 2,
     "b": 5,
     "op": "+",
     "c": 7
   }
   ```

## Erstellen einer `Calc`-API
<a name="api-as-lambda-proxy-create-api-resources"></a>

Das folgende Verfahren zeigt, wie Sie eine API für die gerade erstellte `Calc` Lambda-Funktion erstellen. In den folgenden Abschnitten fügen Sie dieser Ressourcen und Methoden hinzu.

**So erstellen Sie eine API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wenn Sie API Gateway zum ersten Mal verwenden, sehen Sie eine Seite, die Sie mit den Funktionen des Service vertraut macht. Wählen Sie unter **REST-API** die Option **Erstellen** aus. Wenn das Popup-Fenster **Create Example API (Beispiel-API erstellen)** angezeigt wird, klicken Sie auf **OK**.

   Wenn Sie API Gateway nicht zum ersten Mal verwenden, wählen Sie **Create API (API erstellen)**. Wählen Sie unter **REST-API** die Option **Build (Erstellen)** aus.

1.  Geben Sie in **API name** (API-Name) **LambdaCalc** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Lassen Sie die Einstellung für **API-Endpunkttyp** bei **Regional**.

1. Wählen Sie als **IP-Adresstyp** die Option. **IPv4**

1. Wählen Sie **Create API (API erstellen)** aus.

## Integration 1: Erstellen Sie eine `GET`-Methode mit Abfrageparametern, um die Lambda-Funktion aufzurufen
<a name="api-as-lambda-proxy-expose-get-method-with-query-strings-to-call-lambda-function"></a>

Durch Erstellen einer `GET`-Methode, die Abfragezeichenfolgenparameter an die Lambda-Funktion übergibt, wird das Aufrufen der API über einen Browser aktiviert. Dieser Ansatz kann nützlich sein, insbesondere für solche APIs , die offenen Zugriff ermöglichen.

Nachdem Sie eine API erstellt haben, können Sie nun eine Ressource erstellen. In der Regel werden API-Ressourcen in einer Ressourcenstruktur organisiert, die der Anwendungslogik entspricht. In diesem Schritt erstellen Sie eine **/calc**-Ressource. 

**So erstellen Sie eine **/calc**-Ressource**

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1. Die **Proxy-Ressource** bleibt ausgeschaltet. 

1. **Ressourcenpfad** wird als `/` beibehalten.

1. Geben Sie für **Resource name (Ressourcenname)** **calc** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

Durch Erstellen einer `GET`-Methode, die Abfragezeichenfolgenparameter an die Lambda-Funktion übergibt, wird das Aufrufen der API über einen Browser aktiviert. Dieser Ansatz kann sich als nützlich erweisen, insbesondere für solche APIs , die einen offenen Zugang ermöglichen.

Bei dieser Methode muss die `POST`-Anforderung verwendet wird, um eine Lambda-Funktion aufzurufen. Das Beispiel verdeutlicht, dass die HTTP-Methoden einer Frontend-Methodenanforderung und einer Backend-Integrationsanforderung unterschiedlich sein können.

**So erstellen Sie eine `GET`-Methode**

1. Wählen Sie die **/calc**-Ressource und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie als **Methodentyp** die Option **GET** (Abrufen) aus.

1. Für **Integrationstyp** wählen Sie **AWS-Service** aus.

1. Wählen Sie für den AWS-Region Ort aus **AWS-Region**, an dem Sie Ihre Lambda-Funktion erstellt haben.

1. Wählen Sie für **AWS-Service** **Lambda** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Wählen Sie für **HTTP-Methode** **POST** aus.

1. Wählen Sie für **Aktionstyp** **Pfadüberschreibung verwenden** aus. Mit dieser Option wird der ARN der [Invoke](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html)-Aktion für die Ausführung der `Calc`-Funktion angegeben. 

1. Geben Sie für **Pfadüberschreibung** **2015-03-31/functions/arn:aws:lambda:*us-east-2*:*account-id*:function:Calc/invocations** ein. Geben Sie für ** *account-id*** Ihre AWS-Konto ID ein. Geben Sie für den Ort ein***us-east-2***, AWS-Region an dem Sie Ihre Lambda-Funktion erstellt haben. 

1. Geben Sie für **Ausführungsrolle** den Rollen-ARN für **lambda\$1invoke\$1function\$1assume\$1apigw\$1role** ein.

1. Die Einstellungen für **Credential-Cache** und **Standard-Timeout** bleiben unverändert.

1. Klicken Sie auf **Einstellungen für Methodenanfragen**.

1. Wählen Sie für **Anforderungs-Validator** die Option **Abfragezeichenfolgeparameter und -Header validieren** aus.

   Mit dieser Einstellung wird eine Fehlermeldung zurückgegeben, falls der Client die erforderlichen Parameter nicht vorgibt.

1. Klicken Sie auf **Parameter für URL-Abfragezeichenfolgen**.

   Jetzt können Sie Parameter für die Abfrageeichenfolgen der **GET**-Methode in der **/calc**-Ressource einrichten sodass diese Eingaben im Namen der Backend-Lambda-Funktion empfangen kann.

   Gehen Sie wie folgt vor, um die Parameter für die Abfragezeichenfolge zu erstellen:

   1. Wählen Sie **Abfragezeichenfolge hinzufügen** aus.

   1. Geben Sie unter **Name** **operand1** ein.

   1. Aktivieren Sie die Option **Erforderlich**.

   1. **Caching** bleibt ausgeschaltet.

   Wiederholen Sie die obigen Schritte und erstellen Sie eine Abfragezeichenfolge mit dem Namen **operand2** sowie eine Abfragezeichenfolge mit dem Namen **operator**.

1. Wählen Sie **Methode erstellen** aus.

Als Nächstes erstellen Sie eine Zuordnungsvorlage, um die vom Client bereitgestellten Abfragezeichenfolgen wie für die `Calc`-Funktion erforderlich in die Integrationsanforderungs-Nutzlast zu übersetzen. Diese Vorlage weist die drei in **Method Request (Methodenanfrage)** deklarierten Abfragezeichenfolge-Parameter in entsprechende Eigenschaftswerte des JSON-Objekts um, das als Eingabe für die Lambda-Funktion im Backend dient. Das umgewandelte JSON-Objekt wird als Nutzlast der Integrationsanforderung eingebunden. 

**Zuordnen von Eingabeparametern zur Integrationsanforderung**

1. Klicken Sie auf der Registerkarte **Integrationsanfrage** unter **Einstellungen für Integrationsanfragen** auf **Bearbeiten**.

1. Wählen Sie für **Anforderungstext-Pass-Through** die Option **Wenn keine Vorlagen definiert sind (empfohlen)** aus.

1. Wählen Sie **Zuordnungsvorlagen** aus.

1. Wählen Sie **Add mapping template**.

1. Geben Sie für **Content type** (Inhaltstyp) **application/json** ein.

1. Geben Sie für **Vorlagentext** den folgenden Code ein:

   ```
   {
       "a":  "$input.params('operand1')",
       "b":  "$input.params('operand2')", 
       "op": "$input.params('operator')"   
   }
   ```

1. Wählen Sie **Speichern**.

Sie können nun Ihre `GET`-Methode testen, um zu verifizieren, dass sie korrekt für einen Lambda-Funktionsaufruf eingerichtet wurde.

**So testen Sie die `GET`-Methode**

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Für **Abfrage-Zeichenketten** geben Sie **operand1=2&operand2=3&operator=\$1** ein.

1. Wählen Sie **Test** aus.

   Die Ergebnisse sollten in etwa wie folgt aussehen:  
![\[API in API Gateway als Lambda-Proxy erstellen\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/aws_proxy_lambda_calc_get_method_test_new_console.png)

## Integration 2: Erstellen Sie eine `POST`-Methode mit einem JSON-Payload für den Aufruf der Lambda-Funktion
<a name="api-as-lambda-proxy-expose-post-method-with-json-body-to-call-lambda-function"></a>

Wenn Sie eine `POST`-Methode mit einer JSON-Nutzlast für den Lambda-Funktionsaufruf erstellen, gehen Sie so vor, dass der Client die erforderlichen Eingaben im Anfragetext an die Backend-Funktion übermitteln muss. Damit sichergestellt ist, dass der Client die korrekten Eingabedaten hochlädt, aktivieren Sie die Anforderungsvalidierung für die Nutzlast.

**Erstellen einer `POST` -Methode mit einer JSON-Nutzlast**

1. Wählen Sie die **/calc**-Ressource und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie unter **Method type** (Methodentyp) die Option **POST** aus.

1. Für **Integrationstyp** wählen Sie **AWS-Service** aus.

1. Wählen Sie für den AWS-Region Ort aus **AWS-Region**, an dem Sie Ihre Lambda-Funktion erstellt haben.

1. Wählen Sie für **AWS-Service** **Lambda** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Wählen Sie für **HTTP-Methode** **POST** aus.

1. Wählen Sie für **Aktionstyp** **Pfadüberschreibung verwenden** aus. Mit dieser Option wird der ARN der [Invoke](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html)-Aktion für die Ausführung der `Calc`-Funktion angegeben. 

1. Geben Sie für **Pfadüberschreibung** **2015-03-31/functions/arn:aws:lambda:*us-east-2*:*account-id*:function:Calc/invocations** ein. Geben Sie für ** *account-id*** Ihre AWS-Konto ID ein. Geben Sie für den Ort ein***us-east-2***, AWS-Region an dem Sie Ihre Lambda-Funktion erstellt haben. 

1. Geben Sie für **Ausführungsrolle** den Rollen-ARN für **lambda\$1invoke\$1function\$1assume\$1apigw\$1role** ein.

1. Die Einstellungen für **Credential-Cache** und **Standard-Timeout** bleiben unverändert.

1. Wählen Sie **Methode erstellen** aus.

Sie können nun ein **Eingabe**-Modell erstellen, das die Struktur der Eingabedaten beschreibt und den eingehenden Anfragetext validiert.

**Erstellen eines Eingabemodells**

1. Klicken Sie im Navigationsbereich auf **Models** (Modelle).

1. Wählen Sie **Modell erstellen** aus.

1. Geben Sie unter **Name** **input** ein.

1. Geben Sie für **Content type** (Inhaltstyp) **application/json** ein. 

   Wenn kein passender Inhaltstyp gefunden wird, wird die Anforderungsvalidierung nicht durchgeführt. Geben Sie **\$1default** ein, um das gleiche Modell unabhängig vom Inhaltstyp zu verwenden.

1. Geben Sie für **Modellschema** Folgendes ein:

   ```
   {
       "type":"object",
       "properties":{
           "a":{"type":"number"},
           "b":{"type":"number"},
           "op":{"type":"string"}
       },
       "title":"input"
   }
   ```

1. Wählen Sie **Modell erstellen** aus.

Als Nächstes erstellen Sie ein **Ausgabe**-Modell. Dieses Modell definiert die Datenstruktur der berechneten Ausgabe vom Backend. Damit werden die Integrationsantwortdaten einem anderen Modell zugewiesen. In diesem Tutorial wird das Pass-Through-Verhalten verwendet, daher wird dieses Modell nicht benötigt.

**Erstellen eines Ausgabemodells**

1. Wählen Sie **Modell erstellen** aus.

1. Geben Sie unter **Name** **output** ein.

1. Geben Sie für **Content type** (Inhaltstyp) **application/json** ein. 

   Wenn kein passender Inhaltstyp gefunden wird, wird die Anforderungsvalidierung nicht durchgeführt. Geben Sie **\$1default** ein, um das gleiche Modell unabhängig vom Inhaltstyp zu verwenden.

1. Geben Sie für **Modellschema** Folgendes ein:

   ```
   {
       "type":"object",
       "properties":{
           "c":{"type":"number"}
       },
       "title":"output"
   }
   ```

1. Wählen Sie **Modell erstellen** aus.

Als Nächstes erstellen Sie ein **Ergebnis**-Modell. Dieses Modell definiert die Datenstruktur der zurückgegebenen Antwortdaten. Dieses Modell verweist auf die **Eingabe**- und **Ausgabe**-Schemata, die in Ihrer API definiert sind.

**Erstellen eines Ergebnismodells**

1. Wählen Sie **Modell erstellen** aus.

1. Geben Sie unter **Name** **result** ein.

1. Geben Sie für **Content type** (Inhaltstyp) **application/json** ein. 

   Wenn kein passender Inhaltstyp gefunden wird, wird die Anforderungsvalidierung nicht durchgeführt. Geben Sie **\$1default** ein, um das gleiche Modell unabhängig vom Inhaltstyp zu verwenden.

1. Geben Sie für **Modellschema** das folgende Modell mit Ihrem *restapi-id* ein. Ihr *restapi-id* ist im folgenden Schema oben in der Konsole in Klammern aufgeführt: `API Gateway > APIs > LambdaCalc (abc123).`

   ```
   {
       "type":"object",
       "properties":{
           "input":{
               "$ref":"https://apigateway.amazonaws.com/restapis/restapi-id/models/input"
           },
           "output":{
               "$ref":"https://apigateway.amazonaws.com/restapis/restapi-id/models/output"
           }
       },
       "title":"result"
   }
   ```

1. Wählen Sie **Modell erstellen** aus.

Als Nächstes konfigurieren Sie die Methodenanforderung Ihrer POST-Methode, um die Anforderungsvalidierung für den eingehenden Anforderungstext zu aktivieren.

**Anforderungsvalidierung für die POST-Methode aktivieren**

1. Klicken Sie im Hauptnavigationsbereich auf **Ressourcen** und wählen Sie dann die `POST`-Methode in der Ressourcenstruktur aus.

1. Wählen Sie auf der Registerkarte **Methodenanfrage** unter **Methodenanfrage-Einstellungen** die Option **Bearbeiten** aus.

1. Wählen Sie für **Anforderungs-Validator** die Option **Text validieren** aus.

1. Wählen Sie **Anforderungstext** aus und klicken Sie dann auf **Modell hinzufügen**.

1. Geben Sie für **Content type** (Inhaltstyp) **application/json** ein.

   Wenn kein passender Inhaltstyp gefunden wird, wird die Anforderungsvalidierung nicht durchgeführt. Geben Sie **\$1default** ein, um das gleiche Modell unabhängig vom Inhaltstyp zu verwenden.

1. Wählen Sie für **Modell** **Eingabe** aus.

1. Wählen Sie **Speichern**.

Sie können nun Ihre `POST`-Methode testen, um zu verifizieren, dass sie korrekt für einen Lambda-Funktionsaufruf eingerichtet wurde.

**So testen Sie die `POST`-Methode**

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Geben Sie für **Anforderungstext** die folgende JSON-Nutzlast ein:

   ```
   {
       "a": 1,
       "b": 2,
       "op": "+"
   }
   ```

1. Wählen Sie **Test** aus.

   Die Ausgabe sollte folgendermaßen aussehen:

   ```
   {
     "a": 1,
     "b": 2,
     "op": "+",
     "c": 3
   }
   ```

## Integration 3: Erstellen Sie eine `GET`-Methode mit Pfadparametern für den Aufruf der Lambda-Funktion
<a name="api-as-lambda-proxy-expose-get-method-with-path-parameters-to-call-lambda-function"></a>

Jetzt erstellen Sie für eine Ressource eine `GET`-Methode, die durch eine Abfolge von Pfadparametern angegeben wird, um damit die Lambda-Funktion im Backend aufzurufen. Die Werte der Pfadparameter geben die Eingabedaten für die Lambda-Funktion an. Sie definieren eine Mapping-Vorlage, um die eingehenden Pfadparameterwerte der erforderlichen Integrationsanforderungsnutzlast zuzuweisen.

Die resultierende API-Ressourcen-Struktur sieht etwa wie folgt aus:

![\[API in API Gateway als Lambda-Proxy erstellen\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/aws_proxy_lambda_create_api_resources_new_console.png)


**Erstellen einer **/\$1operand1\$1/\$1operand2\$1/\$1operator\$1**-Ressource**

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1. Wählen Sie für **Ressourcenpfad** `/calc` aus.

1. Geben Sie für **Resource name (Ressourcenname)** **\$1operand1\$1** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1. Wählen Sie für **Ressourcenpfad** `/calc/{operand1}/` aus.

1. Geben Sie für **Resource name (Ressourcenname)** **\$1operand2\$1** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1. Wählen Sie für **Ressourcenpfad** `/calc/{operand1}/{operand2}/` aus.

1. Geben Sie für **Resource name (Ressourcenname)** **\$1operator\$1** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

Dieses Mal verwenden Sie die standardmäßige Lambda-Integration in der API Gateway-Konsole zur Einrichtung der Methodenintegration.

**Einrichten einer Integrationsmethode**

1. Wählen Sie die **/\$1operand1\$1/\$1operand2\$1/\$1operator\$1**-Ressource aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie als **Methodentyp** die Option **GET** (Abrufen) aus.

1. Wählen Sie für den **Integrationstyp** die Option **Lambda** aus.

1. Lassen Sie **Lambda proxy integration** (Lambda-Proxyintegration) deaktiviert.

1. Wählen Sie für **Lambda-Funktion** den Ort aus, AWS-Region an dem Sie Ihre Lambda-Funktion erstellt haben, und geben Sie ein. **Calc**

1. Das **Standard-Timeout** bleibt aktiviert.

1. Wählen Sie **Methode erstellen** aus.

Als Nächstes erstellen Sie eine Zuweisungsvorlage zur Zuweisung der drei URL-Pfadparameter, die beim Erstellen der **/calc/\$1operand1\$1/\$1operand2\$1/\$1operator\$1**-Ressource deklariert wurden. Mit dieser Vorlage werden dem JSON-Objekt die vorgegebenen Eigenschaftswerte zugewiesen. Da URL-Pfade eine URL-Codierung erfordern, muss der Operator für die Division mit `%2F` (anstatt `/`) angegeben werden. Diese Vorlage übersetzt den `%2F` in `'/'`, bevor er an die Lambda-Funktion übergeben wird. 

**Erstellen einer Zuweisungsvorlage**

1. Klicken Sie auf der Registerkarte **Integrationsanfrage** unter **Einstellungen für Integrationsanfragen** auf **Bearbeiten**.

1. Wählen Sie für **Anforderungstext-Pass-Through** die Option **Wenn keine Vorlagen definiert sind (empfohlen)** aus.

1. Klicken Sie auf **Zuordnungsvorlage hinzufügen**.

1. Geben Sie für **Content type** (Inhaltstyp) **application/json** ein.

1. Geben Sie für **Vorlagentext** den folgenden Code ein:

   ```
   {
      "a": "$input.params('operand1')",
      "b": "$input.params('operand2')",
      "op": #if($input.params('operator')=='%2F')"/"#{else}"$input.params('operator')"#end
   }
   ```

1. Wählen Sie **Speichern**.

Sie können nun Ihre `GET`-Methode testen, um zu verifizieren, dass sie korrekt für den Aufruf der Lambda-Funktion eingerichtet wurde, und dass die ursprüngliche Ausgabe ohne Zuweisung durch die Integrationsantwort weitergegeben wird. 

**So testen Sie die `GET`-Methode**

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Für **Pfad** gehen Sie wie folgt vor:

   1. Geben Sie für **operand1** **1** ein.

   1. Geben Sie für **operand2** **1** ein.

   1. Geben Sie für **operator** **\$1** ein.

1. Wählen Sie **Test** aus.

1. Das Ergebnis sollte wie folgt aussehen:  
![\[Testen Sie die GET-Methode in der API-Gateway-Konsole.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/aws_proxy_lambda_calc_get_method_test_path_parm_new_console.png)

Als Nächstes modellieren Sie die Datenstruktur für die Nutzlast der Methodenantwort nach dem `result`-Schema.

Standardmäßig wird dem Methodenantworttext ein leeres Modell zugeordnet. Dadurch wird der Integrationsantworttext ohne Zuweisung übergeben. Wenn Sie jedoch ein SDK für eine stark typisierte Sprache (wie z. B. Java oder Objective-C) erstellen, wird den SDK-Benutzern ein leeres Objekt als Ergebnis übergeben. Damit sichergestellt wird, dass sowohl REST- als auch SDK-Clients das gewünschte Ergebnis erhalten, müssen die Antwortdaten mit einem vordefinierten Schema modelliert werden. Nachfolgend definieren Sie ein Modell für den Methodenantworttext und zum Erstellen einer Mapping-Vorlage, mit der der Integrationsantworttext in den Methodenantworttext umgewandelt wird.

**Erstellen einer Methodenantwort**

1. Klicken Sie auf der Registerkarte **Methodenantwort** unter **Antwort 200** auf **Bearbeiten**.

1. Klicken Sie unter **Anforderungstext** auf **Modell hinzufügen**.

1. Geben Sie für **Content type** (Inhaltstyp) **application/json** ein.

1. Wählen Sie für **Modell** **Ergebnis** aus.

1. Wählen Sie **Speichern**.

Durch die Definition eines Modells für den Methodenantworttext wird sichergestellt, dass die Antwortdaten an das `result`-Objekt eines bestimmten SDKs übergeben werden. Um sicherzustellen, dass die Integrationsantwortdaten entsprechend zugewiesen werden, benötigen Sie eine Mapping-Vorlage.

**Erstellen einer Zuweisungsvorlage**

1. Klicken Sie auf der Registerkarte **Integrationsantwort** unter **Standard - Antwort** auf **Bearbeiten**.

1. Klicken Sie auf **Zuordnungsvorlage hinzufügen**.

1. Geben Sie für **Content type** (Inhaltstyp) **application/json** ein.

1. Geben Sie für **Vorlagentext** den folgenden Code ein:

   ```
   #set($inputRoot = $input.path('$'))
   {
     "input" : {
       "a" : $inputRoot.a,
       "b" : $inputRoot.b,
       "op" : "$inputRoot.op"
     },
     "output" : {
       "c" : $inputRoot.c
     }
   }
   ```

1. Wählen Sie **Speichern**.

**Testen der Zuweisungsvorlage**

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Für **Pfad** gehen Sie wie folgt vor:

   1. Geben Sie für **operand1** **1** ein.

   1. Geben Sie für **operand2** **2** ein.

   1. Geben Sie für **operator** **\$1** ein.

1. Wählen Sie **Test** aus.

1. Die Antwort wird wie folgt aussehen:

   ```
   {
     "input": {
       "a": 1,
       "b": 2,
       "op": "+"
     },
     "output": {
       "c": 3
     }
   }
   ```

Momentan kann die API nur über die **Test**-Funktion in der API Gateway-Konsole aufgerufen werden. Wenn Sie die API für Clients verfügbar machen möchten, muss sie ihnen bereitgestellt werden. Stellen Sie immer sicher, dass Sie Ihre API erneut bereitstellen, wenn Sie eine Ressource oder Methode hinzufügen, ändern oder löschen, oder wenn Sie eine Datenzuweisung oder Stufeneinstellungen aktualisieren. Ohne diesen Schritt werden neue Features oder Aktualisierungen Ihrer API nicht für Clients verfügbar gemacht. Gehen Sie wie folgt vor:

**So stellen Sie die API bereit**

1. Klicken Sie auf **Deploy API**.

1. Wählen Sie für **Stufe** die Option **Neue Stufe** aus.

1. Geben Sie für **Stage name (Stufenname)** **Prod** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Wählen Sie **Bereitstellen**.

1.  (Optional) Klicken Sie unter **Stufendetails** auf das Kopiersymbol für **Aufruf-URL**, um die URL Ihrer Aufruf-API zu kopieren. Sie können diese mit Tools wie [Postman](https://www.postman.com) und [cURL](https://curl.se/) zum Testen Ihrer API verwenden.

**Anmerkung**  
Denken Sie daran, dass Sie Ihre API jedes Mal erneut bereitstellen müssen, wenn Sie eine Ressource oder Methode hinzufügen, ändern oder löschen, oder wenn Sie eine Datenzuweisung oder Stufeneinstellungen aktualisieren. Andernfalls sind neue Funktionen oder Aktualisierungen nicht für Clients Ihrer API verfügbar.

# OpenAPI-Definitionen der mit einer Lambda-Funktion integrierten Beispiel-API
<a name="api-as-lambda-proxy-export-swagger-with-extensions"></a>

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2017-04-20T04:08:08Z",
    "title": "LambdaCalc"
  },
  "host": "uojnr9hd57.execute-api.us-east-1.amazonaws.com",
  "basePath": "/test",
  "schemes": [
    "https"
  ],
  "paths": {
    "/calc": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "operand2",
            "in": "query",
            "required": true,
            "type": "string"
          },
          {
            "name": "operator",
            "in": "query",
            "required": true,
            "type": "string"
          },
          {
            "name": "operand1",
            "in": "query",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Result"
            },
            "headers": {
              "operand_1": {
                "type": "string"
              },
              "operand_2": {
                "type": "string"
              },
              "operator": {
                "type": "string"
              }
            }
          }
        },
        "x-amazon-apigateway-request-validator": "Validate query string parameters and headers",
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.operator": "integration.response.body.op",
                "method.response.header.operand_2": "integration.response.body.b",
                "method.response.header.operand_1": "integration.response.body.a"
              },
              "responseTemplates": {
                "application/json": "#set($res = $input.path('$'))\n{\n    \"result\": \"$res.a, $res.b, $res.op => $res.c\",\n  \"a\" : \"$res.a\",\n  \"b\" : \"$res.b\",\n  \"op\" : \"$res.op\",\n  \"c\" : \"$res.c\"\n}"
              }
            }
          },
          "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST",
          "requestTemplates": {
            "application/json": "{\n    \"a\":  \"$input.params('operand1')\",\n    \"b\":  \"$input.params('operand2')\", \n    \"op\": \"$input.params('operator')\"   \n}"
          },
          "type": "aws"
        }
      },
      "post": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "in": "body",
            "name": "Input",
            "required": true,
            "schema": {
              "$ref": "#/definitions/Input"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Result"
            }
          }
        },
        "x-amazon-apigateway-request-validator": "Validate body",
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#set($inputRoot = $input.path('$'))\n{\n  \"a\" : $inputRoot.a,\n  \"b\" : $inputRoot.b,\n  \"op\" : $inputRoot.op,\n  \"c\" : $inputRoot.c\n}"
              }
            }
          },
          "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
          "passthroughBehavior": "when_no_templates",
          "httpMethod": "POST",
          "type": "aws"
        }
      }
    },
    "/calc/{operand1}/{operand2}/{operator}": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "operand2",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "operator",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "operand1",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Result"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "default": {
              "statusCode": "200",
              "responseTemplates": {
                "application/json": "#set($inputRoot = $input.path('$'))\n{\n  \"input\" : {\n    \"a\" : $inputRoot.a,\n    \"b\" : $inputRoot.b,\n    \"op\" : \"$inputRoot.op\"\n  },\n  \"output\" : {\n    \"c\" : $inputRoot.c\n  }\n}"
              }
            }
          },
          "uri": "arn:aws:apigateway:us-west-2:lambda:path/2015-03-31/functions/arn:aws:lambda:us-west-2:123456789012:function:Calc/invocations",
          "passthroughBehavior": "when_no_templates",
          "httpMethod": "POST",
          "requestTemplates": {
            "application/json": "{\n   \"a\": \"$input.params('operand1')\",\n   \"b\": \"$input.params('operand2')\",\n   \"op\": #if($input.params('operator')=='%2F')\"/\"#{else}\"$input.params('operator')\"#end\n   \n}"
          },
          "contentHandling": "CONVERT_TO_TEXT",
          "type": "aws"
        }
      }
    }
  },
  "definitions": {
    "Input": {
      "type": "object",
      "required": [
        "a",
        "b",
        "op"
      ],
      "properties": {
        "a": {
          "type": "number"
        },
        "b": {
          "type": "number"
        },
        "op": {
          "type": "string",
          "description": "binary op of ['+', 'add', '-', 'sub', '*', 'mul', '%2F', 'div']"
        }
      },
      "title": "Input"
    },
    "Output": {
      "type": "object",
      "properties": {
        "c": {
          "type": "number"
        }
      },
      "title": "Output"
    },
    "Result": {
      "type": "object",
      "properties": {
        "input": {
          "$ref": "#/definitions/Input"
        },
        "output": {
          "$ref": "#/definitions/Output"
        }
      },
      "title": "Result"
    }
  },
  "x-amazon-apigateway-request-validators": {
    "Validate body": {
      "validateRequestParameters": false,
      "validateRequestBody": true
    },
    "Validate query string parameters and headers": {
      "validateRequestParameters": true,
      "validateRequestBody": false
    }
  }
}
```

------

# Tutorial: REST-API als AmazonS3-Proxy erstellen
<a name="integrating-api-with-aws-services-s3"></a>

Dieser Abschnitt zeigt anhand eines Beispiels die Verwendung einer REST-API in API Gateway als Amazon S3-Proxy und beschreibt das Erstellen und Konfigurieren einer REST-API zur Bereitstellung der folgenden Amazon S3-Operationen: 
+ Bereitstellung von GET bei der Stammressource der API, um [alle Amazon S3-Buckets eines Aufrufers aufzulisten](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html).
+ Bereitstellung von GET bei einer Folder-Ressource, um [eine Liste aller Objekte in einem Amazon S3-Bucket anzuzeigen](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html).
+ Machen Sie GET auf einer Folder/Item Ressource verfügbar, um [ein Objekt aus einem Amazon S3 S3-Bucket anzuzeigen oder herunterzuladen](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html).

 Unter Umständen sollten Sie die Beispiel-API wie in [OpenAPI-Definitionen der Beispiel-API als Amazon-S3-Proxy](api-as-s3-proxy-export-swagger-with-extensions.md) gezeigt als Amazon-S3-Proxy importieren. Dieses Beispiel enthält weitere exponierte Methoden. Anweisung zum Importieren einer API mithilfe der OpenAPI-Definition finden Sie unter [Entwickeln APIs Sie REST mit OpenAPI in API Gateway](api-gateway-import-api.md).

**Anmerkung**  
 Um Ihre API Gateway-API in Amazon S3 zu integrieren, müssen Sie eine Region auswählen, in der sowohl die API Gateway- als auch die Amazon S3-Services verfügbar sind. Informationen zur Verfügbarkeit der Regionen finden Sie unter [Amazon API Gateway-Endpunkte und -Kontingente](https://docs.aws.amazon.com/general/latest/gr/apigateway.html). 

**Topics**
+ [Einrichten von IAM-Berechtigungen für die API, um Amazon S3-Aktionen aufzurufen](#api-as-s3-proxy-iam-permissions)
+ [Erstellen von API-Ressourcen zum Darstellen von Amazon S3-Ressourcen](#api-as-s3-proxy-create-resources)
+ [Bereitstellen einer API-Methode zur Auflistung der Amazon S3-Buckets des Aufrufers](#api-root-get-as-s3-get-service)
+ [Bereitstellen von API-Methoden, um auf einen Amazon S3-Bucket zuzugreifen](#api-folder-operations-as-s3-bucket-actions)
+ [Bereitstellen von API-Methoden für den Zugriff auf ein Amazon S3-Objekt in einem Bucket](#api-items-in-folder-as-s3-objects-in-bucket)
+ [OpenAPI-Definitionen der Beispiel-API als Amazon-S3-Proxy](api-as-s3-proxy-export-swagger-with-extensions.md)
+ [Aufrufen der API mit einem REST-API-Client](api-as-s3-proxy-test-using-postman.md)

## Einrichten von IAM-Berechtigungen für die API, um Amazon S3-Aktionen aufzurufen
<a name="api-as-s3-proxy-iam-permissions"></a>

 Einer IAM-Rolle müssen geeignete IAM-Richtlinien zugeordnet sein, damit die API erforderliche Amazon-S3-Aktionen aufrufen kann. In dieser Übung erstellen Sie eine neue IAM-Rolle.

**Um die AWS Service-Proxy-Ausführungsrolle zu erstellen**

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

1. Wählen Sie **Roles**.

1. Wählen Sie **Rolle erstellen** aus.

1.  Wählen Sie unter **Typ der vertrauenswürdigen Entität auswählen** die Option **AWS Dienst** aus, wählen Sie dann **API Gateway** aus und wählen Sie **Erlaubt API Gateway, Logs in Logs zu CloudWatch übertragen**.

1.  Klicken Sie auf **Weiter** und dann erneut auf **Weiter**.

1. Geben Sie für **Role name (Rollenname)** den Namen **APIGatewayS3ProxyPolicy** ein und klicken Sie auf **Create role (Rolle erstellen)**.

1. Wählen Sie in der Liste **Roles** die Rolle aus, die Sie gerade erstellt haben. Möglicherweise müssen Sie scrollen oder die Rolle über die Suchleiste finden.

1. Wählen Sie für die ausgewählte Rolle die Registerkarte **Berechtigungen hinzufügen** aus.

1. Wählen Sie in der Dropdown-Liste **Berechtigungen anfügen** aus.

1. Geben Sie im Suchfeld **AmazonS3FullAccess** ein und wählen Sie **Berechtigungen hinzufügen** aus. 
**Anmerkung**  
Dieses Tutorial verwendet der Einfachheit halber eine verwaltete Richtlinie. Als Best Practice sollten Sie Ihre eigene IAM-Richtlinie erstellen, um die erforderlichen Mindestberechtigungen zu gewähren. 

1. Notieren Sie sich den neu erstellten **Rollen-ARN**, Sie werden ihn später brauchen.

## Erstellen von API-Ressourcen zum Darstellen von Amazon S3-Ressourcen
<a name="api-as-s3-proxy-create-resources"></a>

Die Root-Ressource der API (`/`) verwenden Sie als den Container des Amazon-S3-Buckets eines authentifizierten Aufrufers. Außerdem erstellen Sie die Ressourcen `Folder` und `Item`, um einen bestimmten Amazon-S3-Bucket bzw. ein bestimmtes Amazon-S3-Objekt darzustellen. Der Ordnername und der Objektschlüssel werden vom Aufrufer in Form von Pfadparametern als Teil einer Anforderungs-URL angegeben. 

**Anmerkung**  
Beim Zugriff auf Objekte, deren Objektschlüssel `/` oder andere Sonderzeichen enthält, müssen diese Zeichen URL-kodiert sein. Beispielsweise sollte `test/test.txt` zu `test%2Ftest.txt` kodiert werden.

**So erstellen Sie eine API-Ressource, die die Amazon S3-Servicefunktionen bereitstellt**

1.  Erstellen Sie in derselben Weise, in der AWS-Region Sie Ihren Amazon S3 S3-Bucket erstellt haben, eine API mit dem Namen **myS3**. Die Stammressource dieser API (**/**) stellt den Amazon S3-Service dar. In diesem Schritt erstellen Sie zwei zusätzliche Ressourcen: **/\$1folder\$1** und **/\$1item\$1**.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1. Die **Proxy-Ressource** bleibt ausgeschaltet. 

1. Wählen Sie für **Ressourcenpfad** `/` aus.

1. Geben Sie für **Resource name (Ressourcenname)** **\$1folder\$1** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt unmarkiert.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1. Wählen Sie die **/\$1folder\$1**-Ressource aus und klicken Sie dann auf **Ressource erstellen**.

1. Wiederholen Sie die Schritte oben, um eine untergeordnete Ressource für **/\$1folder\$1** mit dem Namen **\$1item\$1** zu erstellen.

   Die endgültige API sollte wie folgt aussehen:

      
![\[Erstellen einer API in API Gateway als Amazon S3-Proxy\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/aws_proxy_s3_create_api-resources_new_console.png)

## Bereitstellen einer API-Methode zur Auflistung der Amazon S3-Buckets des Aufrufers
<a name="api-root-get-as-s3-get-service"></a>

Um die Liste der Amazon S3-Buckets des Aufrufers zu erhalten, muss die Aktion [GET Service](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html) in Amazon S3 aufgerufen werden. Erstellen Sie die GET-Methode in der Stammressource der API (**/**). Konfigurieren Sie die GET-Methode für die Integration in Amazon S3 wie folgt. 

**So erstellen und initialisieren Sie die `GET /`-Methode der API**

1. Wählen Sie die **/**-Ressource aus und klicken Sie dann auf **Methode erstellen**. 

1. Wählen Sie als Methodentyp **GET** aus.

1. Für **Integrationstyp** wählen Sie **AWS-Service** aus.

1. Wählen Sie für den Ort aus **AWS-Region**, AWS-Region an dem Sie Ihren Amazon S3 S3-Bucket erstellt haben. 

1. Wählen Sie für **AWS-Service** **Amazon Simple Storage Service** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Für **HTTP-Methode** wählen Sie **GET** aus.

1. Wählen Sie für **Aktionstyp** **Pfadüberschreibung verwenden** aus.

   Wenn der Pfad überschrieben wird, leitet API Gateway die Client-Anfrage an Amazon S3 als die entsprechende [Amazon S3-REST-API-Path-Style-Anfrage](https://docs.aws.amazon.com/AmazonS3/latest/userguide/RESTAPI.html) weiter, worin eine Amazon S3-Ressource durch den Ressourcen-Pfad des `s3-host-name/bucket/key`-Musters ausgedrückt wird. API Gateway legt den `s3-host-name` fest und gibt den Client, der in `bucket` und `key` spezifiziert ist, vom Client an Amazon S3 weiter.

1. Geben Sie für **Pfadüberschreibung** **/** ein.

1. Geben Sie für **Ausführungsrolle** den Rollen-ARN für **APIGatewayS3ProxyPolicy** ein.

1. Klicken Sie auf **Einstellungen für Methodenanfragen**.

   Mit den Einstellungen für die Methodenanfragen steuern Sie, wer diese Methode Ihrer API aufrufen kann.

1. Wählen Sie im Dropdown-Menü `AWS_IAM` für **Autorisierung** aus.

      
![\[Deklarieren von Methodenantworttypen\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/aws_proxy_s3_setup_method_request_authorization_new_console.png)

1. Wählen Sie **Methode erstellen** aus.

Mit dieser Einrichtung wird die Frontend-Anforderung `GET https://your-api-host/stage/` in das `GET https://your-s3-host/` am Backend integriert.

 Sie deklarieren die 200-, 400- und 500-Antworten unter **Methodenantwort**, damit Ihre API erfolgreiche Antworten und Ausnahmen ordnungsgemäß an den Aufrufer zurückgibt. Die Standard-Zuweisung für 200-Antworten wird verwendet, sodass hier nicht deklarierte Backend-Antworten des Statuscodes an den Aufrufer als 200-Antworten zurückgegeben werden. 

**Deklarieren der Antworttypen für die `GET /`-Methode**

1.  Klicken Sie auf der Registerkarte **Methodenantwort** unter **Antwort 200** auf **Bearbeiten**.

1. Klicken Sie auf **Header hinzufügen** und gehen Sie wie folgt vor:

   1. Für **Header-Name** geben Sie **Content-Type** ein.

   1. Wählen Sie **Add header**.

   Wiederholen Sie diese Schritte, um einen **Timestamp**-Header und einen **Content-Length**-Header zu erstellen.

1. Wählen Sie **Speichern**.

1. Klicken Sie auf der Registerkarte **Methodenantwort** unter **Methodenantworten** auf **Antwort erstellen**.

1. Geben Sie als **HTTP-Statuscode** **400** ein.

   Für diese Antwort legen Sie keine Header fest.

1. Wählen Sie **Speichern**.

1. Wiederholen Sie die folgenden Schritte, um die Antwort 500 zu erstellen.

   Für diese Antwort legen Sie keine Header fest.

Da die erfolgreiche Integrationsantwort von Amazon S3 die Bucket-Liste als XML-Nutzlast, und die standardmäßige Methodenantwort von API Gateway eine JSON-Nutzlast zurückgibt, muss der Parameterwert des Backend-Content-Type-Headers dem Frontend-Gegenstück zugewiesen werden. Andernfalls erhält der Client `application/json` als Content-Type, wenn der Antworttext eigentlich eine XML-Zeichenfolge ist. Das folgende Verfahren zeigt, wie diese Einrichtung erfolgt. Weiterhin sollten Sie dem Client noch andere Header-Parameter anzeigen, z. B. Datum und Länge des Inhalts. 

**So richten Sie Antwort-Header-Zuordnungen für die GET-Methode ein**

1. Klicken Sie auf der Registerkarte **Integrationsantwort** unter **Standard - Antwort** auf **Bearbeiten**.

1. Geben Sie für den Header **Content-Length** den Wert **integration.response.header.Content-Length** als Zuordnungswert ein.

1. Geben Sie für den Header **Content-Type** den Wert **integration.response.header.Content-Type** als Zuordnungswert ein.

1. Geben Sie für den Header **Timestamp** den Wert **integration.response.header.Date** als Zuordnungswert ein.

1. Wählen Sie **Speichern**. Das Ergebnis sollte in etwa wie folgt aussehen:

      
![\[Zuweisen von Integrationsantwort-Headern zu Methodenantwort-Headern\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/aws_proxy_s3_setup_integration_response_headers_new_console.png)

1. Klicken Sie auf der Registerkarte **Integrationsantwort** unter **Integrationsantworten** auf **Antwort erstellen**.

1. Machen Sie für **HTTP status regex (HTTP-Status-RegEx)** den Eintrag **4\$1d\$12\$1**. Dadurch werden alle 4xx-HTTP-Antwortstatuscodes der Methodenantwort zugeordnet.

1. Wählen Sie für **Statuscode der Methodenantwort** **400** aus.

1. Wählen Sie **Erstellen** aus.

1. Wiederholen Sie die folgenden Schritte, um eine Integrationsantwort für die 500-Methodenantwort zu erstellen. Machen Sie für **HTTP status regex (HTTP-Status-RegEx)** den Eintrag **5\$1d\$12\$1**.

Zur Übung sollten Sie nun die API testen, die Sie bisher konfiguriert haben.

**So testen Sie die `GET /`-Methode**

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Wählen Sie **Test** aus. Das Ergebnis sollte wie in der folgenden Abbildung aussehen:

      
![\[Testen des GET-Bucket-Ergebnisses für API-Stammressource\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/aws_proxy_s3_test_root_get_result_new_console.png)

## Bereitstellen von API-Methoden, um auf einen Amazon S3-Bucket zuzugreifen
<a name="api-folder-operations-as-s3-bucket-actions"></a>

Wenn Sie mit einem Amazon-S3-Bucket arbeiten, legen Sie die `GET`-Methode in der /\$1folder\$1-Ressource zum Auflisten von Objekten in einem Bucket offen. Die Anweisungen sind ähnlich wie diejenigen, die unter beschrieben sin [Bereitstellen einer API-Methode zur Auflistung der Amazon S3-Buckets des Aufrufers](#api-root-get-as-s3-get-service). Sie können die Beispiel-API hier für weitere Methoden importieren, [OpenAPI-Definitionen der Beispiel-API als Amazon-S3-Proxy](api-as-s3-proxy-export-swagger-with-extensions.md).

**Exponieren der GET-Methoden in einer Ordnerressource**

1. Wählen Sie die **/\$1folder\$1**-Ressource aus und klicken Sie dann auf **Methode erstellen**. 

1. Wählen Sie als Methodentyp **GET** aus.

1. Für **Integrationstyp** wählen Sie **AWS-Service** aus.

1. Wählen Sie für den Ort aus **AWS-Region**, AWS-Region an dem Sie Ihren Amazon S3 S3-Bucket erstellt haben. 

1. Wählen Sie für **AWS-Service** **Amazon Simple Storage Service** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Für **HTTP-Methode** wählen Sie **GET** aus.

1. Wählen Sie für **Aktionstyp** **Pfadüberschreibung verwenden** aus.

1. Geben Sie für **Pfadüberschreibung** **\$1bucket\$1** ein.

1. Geben Sie für **Ausführungsrolle** den Rollen-ARN für **APIGatewayS3ProxyPolicy** ein.

1. Wählen Sie **Methode erstellen** aus.

Der `{folder}`-Pfadparameter wird in der Amazon-S3-Endpunkt-URL festgelegt. Der `{folder}`-Pfadparameter der Methodenanforderung muss dem `{bucket}`-Pfadparameter der Integrationsanforderung zugeordnet werden.

**Zuordnen von `{folder}` zu `{bucket}`**

1.  Klicken Sie auf der Registerkarte **Integrationsanfrage** unter **Einstellungen für Integrationsanfragen** auf **Bearbeiten**. 

1. Wählen Sie **URL-Pfadparameter** aus und klicken Sie dann auf **Pfadparameter hinzufügen**.

1. Geben Sie unter **Name** **bucket** ein.

1. Geben Sie für **Zugeordnet von** **method.request.path.folder** ein.

1. Wählen Sie **Speichern**.

Als Nächstes testen Sie Ihre API. 

**Testen der `/{folder} GET`-Methode**

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Geben Sie den Namen Ihres Buckets unter **Pfad** für **Ordner** ein.

1. Wählen Sie **Test** aus.

   Das Testergebnis wird eine Liste der Objekte in Ihrem Bucket enthalten.

      
![\[Testen der GET-Methode zur Erstellung eines Amazon-S3-Bucket.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/aws_proxy_s3_test_api_folder_get_new_console.png)

## Bereitstellen von API-Methoden für den Zugriff auf ein Amazon S3-Objekt in einem Bucket
<a name="api-items-in-folder-as-s3-objects-in-bucket"></a>

Amazon S3 unterstützt GET-, DELETE-, HEAD-, OPTIONS-, POST- und PUT-Aktionen für den Zugriff auf und die Verwaltung von Objekte(n) in einem bestimmten Bucket. In diesem Tutorial exponieren Sie eine `GET`-Methode für die `{folder}/{item}`-Ressource, um eine Abbildung aus einem Bucket abzurufen. Weitere Nutzungsbeispiele der `{folder}/{item}` Ressource finden Sie in der Beispiel-API, [OpenAPI-Definitionen der Beispiel-API als Amazon-S3-Proxy](api-as-s3-proxy-export-swagger-with-extensions.md).

**Exponieren der GET-Methode in einer item-Ressource**

1. Wählen Sie die **/\$1item\$1**-Ressource aus und klicken Sie dann auf **Methode erstellen**. 

1. Wählen Sie als Methodentyp **GET** aus.

1. Für **Integrationstyp** wählen Sie **AWS-Service** aus.

1. Wählen Sie für den Ort aus **AWS-Region**, AWS-Region an dem Sie Ihren Amazon S3 S3-Bucket erstellt haben. 

1. Wählen Sie für **AWS-Service** **Amazon Simple Storage Service** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Für **HTTP-Methode** wählen Sie **GET** aus.

1. Wählen Sie für **Aktionstyp** **Pfadüberschreibung verwenden** aus.

1. Geben Sie für **Pfadüberschreibung** **\$1bucket\$1/\$1object\$1** ein.

1. Geben Sie für **Ausführungsrolle** den Rollen-ARN für **APIGatewayS3ProxyPolicy** ein.

1. Wählen Sie **Methode erstellen** aus.

Die Pfadparameter `{folder}` und `{item}` werden in der Amazon-S3-Endpunkt-URL festgelegt. Der -Pfadparameter der Methodenanforderung muss dem -Pfadparameter der Integrationsanforderung zugeordnet werden.

In diesem Schritt führen Sie folgende Aufgaben aus:
+ Ordnen Sie den Pfadparameter `{folder}` der Methodenanforderung dem Pfadparameter `{bucket}` der Integrationsanforderung zu.
+ Ordnen Sie den Pfadparameter `{item}` der Methodenanforderung dem Pfadparameter `{object}` der Integrationsanforderung zu.

**Zuordnen von `{folder}` zu `{bucket}` und `{item}` zu `{object}`**

1.  Klicken Sie auf der Registerkarte **Integrationsanfrage** unter **Einstellungen für Integrationsanfragen** auf **Bearbeiten**. 

1. Klicken Sie auf **URL-Pfadparameter**.

1. Klicken Sie auf **Pfadparameter hinzufügen**.

1. Geben Sie unter **Name** **bucket** ein.

1. Geben Sie für **Zugeordnet von** **method.request.path.folder** ein.

1. Klicken Sie auf **Pfadparameter hinzufügen**.

1. Geben Sie unter **Name** **object** ein.

1. Geben Sie für **Zugeordnet von** **method.request.path.item** ein.

1. Wählen Sie **Speichern**.

**Testen der `/{folder}/{object} GET`-Methode**

1. Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

1. Geben Sie den Namen Ihres Buckets unter **Pfad** für **Ordner** ein.

1. Geben Sie unter **Pfad**, **Element** den Namen eines Elements ein.

1. Wählen Sie **Test** aus.

   Der Antworttext enthält den Inhalt des Elements.

      
![\[Testen der GET-Methode zur Erstellung eines Amazon-S3-Bucket.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/aws_proxy_s3_test_api_item_get_new_console.png)

   Die Anforderung gibt den Klartext („Hello world“) als Inhalt der angegebenen Datei (test.txt) in dem entsprechenden Amazon-S3-Bucket (amzn-s3-demo-bucket) zurück.

 Um Binärdateien, die in API Gateway als irgendetwas anderes als utf-8-codierter JSON-Inhalt betrachtet werden, herunter- oder hochzuladen, sind zusätzliche API-Einstellungen erforderlich. Dies kann wie folgt beschrieben werden: 

**Herunterladen oder Hochladen von Binärdateien von S3**

1.  Registrieren Sie die Medientypen der betroffenen Datei bei den APIs binaryMediaTypes. Sie können Sie von der Konsole aus erledigen: 

   1. Wählen Sie **API-Einstellungen** für die API aus.

   1. Klicken Sie unter **Binäre Medientypen** auf **Medientypen verwalten**.

   1. Klicken Sie auf **Binären Medientyp hinzufügen** und geben Sie dann den erforderlichen Medientyp ein, z. B. `image/png`.

   1. Wählen Sie zum Speichern der Einstellung **Save Changes** (Änderungen speichern) aus.

1. Fügen Sie der Methodenanforderung den Header `Content-Type` and/or `Accept` (zum Hochladen) (zum Herunterladen) hinzu, damit der Client den erforderlichen binären Medientyp angeben und ihn der Integrationsanforderung zuordnen muss.

1. Setzen Sie **Content Handling** in der Integrationsanfrage auf `Passthrough` (für das Hochladen), und in einer Integrationsantwort (für das Herunterladen). Stellen Sie sicher, dass keine Mapping-Vorlage für den betroffenen Inhaltstyp definiert ist. Weitere Informationen finden Sie unter [Datentransformationen für REST APIs in API Gateway](rest-api-data-transformations.md).

Die maximale Größe der Nutzlast ist 10 MB. Siehe [Kontingente für die Konfiguration und Ausführung einer REST-API in API Gateway](api-gateway-execution-service-limits-table.md).

Stellen Sie sicher, dass für Dateien in Amazon S3 die richtigen Inhaltstypen als Metadaten der Dateien hinzugefügt wurden. Bei streamfähigen Medieninhalten muss den Metadaten möglicherweise auch `Content-Disposition:inline` hinzugefügt werden.

Weitere Informationen zur Unterstützung von Binärdateien in API Gateway finden Sie in [Inhaltstypkonvertierungen in API Gateway](api-gateway-payload-encodings-workflow.md).

# OpenAPI-Definitionen der Beispiel-API als Amazon-S3-Proxy
<a name="api-as-s3-proxy-export-swagger-with-extensions"></a>

Die folgenden OpenAPI-Definitionen beschreiben eine API, die als Amazon-S3-Proxy operiert. Diese API enthält mehr Amazon-S3-Operationen als die API, die Sie im Tutorial erstellt haben. Die folgenden Methoden sind in den OpenAPI-Definitionen exponiert:
+ Bereitstellung von GET bei der Stammressource der API, um [alle Amazon S3-Buckets eines Aufrufers aufzulisten](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html).
+ Bereitstellung von GET bei einer Folder-Ressource, um [eine Liste aller Objekte in einem Amazon S3-Bucket anzuzeigen](https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html).
+ Bereitstellung von PUT bei einer Folder-Ressource, um [einen Bucket zu Amazon S3 hinzuzufügen](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html).
+ Bereitstellung von DELETE bei einer Folder-Ressource, um [einen Bucket aus Amazon S3 zu entfernen](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html).
+ Machen Sie GET auf einer Folder/Item Ressource verfügbar, um [ein Objekt aus einem Amazon S3 S3-Bucket anzuzeigen oder herunterzuladen](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html).
+ Machen Sie PUT auf einer Folder/Item Ressource verfügbar, um [ein Objekt in einen Amazon S3 S3-Bucket hochzuladen](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html).
+ Machen Sie HEAD auf einer Folder/Item Ressource verfügbar, [um Objektmetadaten in einem Amazon S3 S3-Bucket abzurufen](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html).
+ Machen Sie DELETE für eine Folder/Item Ressource verfügbar, um [ein Objekt aus einem Amazon S3 S3-Bucket zu entfernen](https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html).

Anweisung zum Importieren einer API mithilfe der OpenAPI-Definition finden Sie unter [Entwickeln APIs Sie REST mit OpenAPI in API Gateway](api-gateway-import-api.md).

Eine Anleitung zur Erstellung einer ähnlichen API finden Sie unter [Tutorial: REST-API als AmazonS3-Proxy erstellen](integrating-api-with-aws-services-s3.md).

Informationen zum Aufrufen dieser API mit [Postman](https://www.postman.com/), das die AWS IAM-Autorisierung unterstützt, finden Sie unter. [Aufrufen der API mit einem REST-API-Client](api-as-s3-proxy-test-using-postman.md)

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2016-10-13T23:04:43Z",
    "title": "MyS3"
  },
  "host": "9gn28ca086.execute-api.{region}.amazonaws.com",
  "basePath": "/S3",
  "schemes": [
    "https"
  ],
  "paths": {
    "/": {
      "get": {
        "produces": [
          "application/json"
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Length": {
                "type": "string"
              },
              "Timestamp": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type",
                "method.response.header.Content-Length": "integration.response.header.Content-Length",
                "method.response.header.Timestamp": "integration.response.header.Date"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path//",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "GET",
          "type": "aws"
        }
      }
    },
    "/{folder}": {
      "get": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Length": {
                "type": "string"
              },
              "Date": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type",
                "method.response.header.Date": "integration.response.header.Date",
                "method.response.header.Content-Length": "integration.response.header.content-length"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.bucket": "method.request.path.folder"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "GET",
          "type": "aws"
        }
      },
      "put": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Length": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type",
                "method.response.header.Content-Length": "integration.response.header.Content-Length"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.bucket": "method.request.path.folder",
            "integration.request.header.Content-Type": "method.request.header.Content-Type"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "PUT",
          "type": "aws"
        }
      },
      "delete": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Date": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type",
                "method.response.header.Date": "integration.response.header.Date"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.bucket": "method.request.path.folder"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "DELETE",
          "type": "aws"
        }
      }
    },
    "/{folder}/{item}": {
      "get": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "item",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "content-type": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.content-type": "integration.response.header.content-type",
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.object": "method.request.path.item",
            "integration.request.path.bucket": "method.request.path.folder"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "GET",
          "type": "aws"
        }
      },
      "head": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "item",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Length": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type",
                "method.response.header.Content-Length": "integration.response.header.Content-Length"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.object": "method.request.path.item",
            "integration.request.path.bucket": "method.request.path.folder"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "HEAD",
          "type": "aws"
        }
      },
      "put": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "item",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Length": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type",
                "method.response.header.Content-Length": "integration.response.header.Content-Length"
              }
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.object": "method.request.path.item",
            "integration.request.path.bucket": "method.request.path.folder",
            "integration.request.header.Content-Type": "method.request.header.Content-Type"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "PUT",
          "type": "aws"
        }
      },
      "delete": {
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "item",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "folder",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Length": {
                "type": "string"
              },
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response"
          },
          "500": {
            "description": "500 response"
          }
        },
        "security": [
          {
            "sigv4": []
          }
        ],
        "x-amazon-apigateway-integration": {
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400"
            },
            "default": {
              "statusCode": "200"
            },
            "5\\d{2}": {
              "statusCode": "500"
            }
          },
          "requestParameters": {
            "integration.request.path.object": "method.request.path.item",
            "integration.request.path.bucket": "method.request.path.folder"
          },
          "uri": "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "passthroughBehavior": "when_no_match",
          "httpMethod": "DELETE",
          "type": "aws"
        }
      }
    }
  },
  "securityDefinitions": {
    "sigv4": {
      "type": "apiKey",
      "name": "Authorization",
      "in": "header",
      "x-amazon-apigateway-authtype": "awsSigv4"
    }
  },
  "definitions": {
    "Empty": {
      "type": "object",
      "title": "Empty Schema"
    }
  }
}
```

------
#### [ OpenAPI 3.0 ]

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "MyS3",
    "version" : "2016-10-13T23:04:43Z"
  },
  "servers" : [ {
    "url" : "https://9gn28ca086.execute-api.{region}.amazonaws.com/{basePath}",
    "variables" : {
      "basePath" : {
        "default" : "S3"
      }
    }
  } ],
  "paths" : {
    "/{folder}" : {
      "get" : {
        "parameters" : [ {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Content-Length" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Date" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "GET",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.Content-Type" : "integration.response.header.Content-Type",
                "method.response.header.Date" : "integration.response.header.Date",
                "method.response.header.Content-Length" : "integration.response.header.content-length"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.bucket" : "method.request.path.folder"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      },
      "put" : {
        "parameters" : [ {
          "name" : "Content-Type",
          "in" : "header",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Content-Length" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "PUT",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.Content-Type" : "integration.response.header.Content-Type",
                "method.response.header.Content-Length" : "integration.response.header.Content-Length"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.bucket" : "method.request.path.folder",
            "integration.request.header.Content-Type" : "method.request.header.Content-Type"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      },
      "delete" : {
        "parameters" : [ {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Date" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "DELETE",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.Content-Type" : "integration.response.header.Content-Type",
                "method.response.header.Date" : "integration.response.header.Date"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.bucket" : "method.request.path.folder"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      }
    },
    "/{folder}/{item}" : {
      "get" : {
        "parameters" : [ {
          "name" : "item",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "content-type" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "GET",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.content-type" : "integration.response.header.content-type",
                "method.response.header.Content-Type" : "integration.response.header.Content-Type"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.object" : "method.request.path.item",
            "integration.request.path.bucket" : "method.request.path.folder"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      },
      "put" : {
        "parameters" : [ {
          "name" : "Content-Type",
          "in" : "header",
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "item",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Content-Length" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "PUT",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.Content-Type" : "integration.response.header.Content-Type",
                "method.response.header.Content-Length" : "integration.response.header.Content-Length"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.object" : "method.request.path.item",
            "integration.request.path.bucket" : "method.request.path.folder",
            "integration.request.header.Content-Type" : "method.request.header.Content-Type"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      },
      "delete" : {
        "parameters" : [ {
          "name" : "item",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Content-Length" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "DELETE",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200"
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.object" : "method.request.path.item",
            "integration.request.path.bucket" : "method.request.path.folder"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      },
      "head" : {
        "parameters" : [ {
          "name" : "item",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        }, {
          "name" : "folder",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Content-Length" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "HEAD",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path/{bucket}/{object}",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.Content-Type" : "integration.response.header.Content-Type",
                "method.response.header.Content-Length" : "integration.response.header.Content-Length"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "requestParameters" : {
            "integration.request.path.object" : "method.request.path.item",
            "integration.request.path.bucket" : "method.request.path.folder"
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      }
    },
    "/" : {
      "get" : {
        "responses" : {
          "400" : {
            "description" : "400 response",
            "content" : { }
          },
          "500" : {
            "description" : "500 response",
            "content" : { }
          },
          "200" : {
            "description" : "200 response",
            "headers" : {
              "Content-Length" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Timestamp" : {
                "schema" : {
                  "type" : "string"
                }
              },
              "Content-Type" : {
                "schema" : {
                  "type" : "string"
                }
              }
            },
            "content" : {
              "application/json" : {
                "schema" : {
                  "$ref" : "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration" : {
          "credentials" : "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "httpMethod" : "GET",
          "uri" : "arn:aws:apigateway:us-west-2:s3:path//",
          "responses" : {
            "4\\d{2}" : {
              "statusCode" : "400"
            },
            "default" : {
              "statusCode" : "200",
              "responseParameters" : {
                "method.response.header.Content-Type" : "integration.response.header.Content-Type",
                "method.response.header.Content-Length" : "integration.response.header.Content-Length",
                "method.response.header.Timestamp" : "integration.response.header.Date"
              }
            },
            "5\\d{2}" : {
              "statusCode" : "500"
            }
          },
          "passthroughBehavior" : "when_no_match",
          "type" : "aws"
        }
      }
    }
  },
  "components" : {
    "schemas" : {
      "Empty" : {
        "title" : "Empty Schema",
        "type" : "object"
      }
    }
  }
}
```

------

# Aufrufen der API mit einem REST-API-Client
<a name="api-as-s3-proxy-test-using-postman"></a>

Als end-to-end Tutorial zeigen wir nun, wie die API mithilfe von [Postman](https://www.postman.com/) aufgerufen wird, das die IAM-Autorisierung unterstützt. AWS <a name="api-as-s3-proxy-test-using-postman-steps"></a>

**So rufen Sie die Amazon S3-Proxy-API mit Postman auf**

1. Stellen Sie die API bereit (oder erneut bereit). Notieren Sie die Basis-URL der API, die neben **Invoke URL** oben im **Stage Editor** angezeigt wird.

1. Starten Sie Postman.

1. Wählen Sie **Autorisierung** und anschließend `AWS Signature`. Geben Sie die Access Key ID und den Secret Access Key Ihres IAM-Benutzers in die jeweiligen **AccessKey**SecretKey****Eingabefelder ein. Geben Sie im AWS-Region Textfeld Region die **AWS Region** ein, für die Ihre API bereitgestellt wird. Geben Sie `execute-api` im Eingabefeld **Servicename** ein.

   Sie können ein Schlüsselpaar über die Registerkarte **Security Credentials (Sicherheitsanmeldeinformationen)** von Ihrem IAM-Benutzerkonto in der IAM Management Console erstellen.

1. So fügen Sie einen Bucket mit dem Namen `amzn-s3-demo-bucket` zu Ihrem Amazon S3-Konto in der Region `{region}` hinzu:

   1. Wählen Sie in der Dropdown-Methodenliste **PUT** aus und geben Sie die Methoden-URL ein (`https://api-id.execute-api.aws-region.amazonaws.com/stage/folder-name`)

   1. Geben Sie bei `Content-Type` den Header-Wert `application/xml` ein. Sie müssen möglicherweise vorhandene Header löschen, bevor Sie den Content-Type angeben können.

   1. Wählen Sie das Menüelement **Body** aus, und geben Sie das folgende XML-Fragment als Anforderungstext ein:

      ```
      <CreateBucketConfiguration> 
        <LocationConstraint>{region}</LocationConstraint> 
      </CreateBucketConfiguration>
      ```

   1. Wählen Sie **Senden** aus, um die Anforderung zu senden. Bei Erfolg erhalten Sie die Antwort `200 OK` mit einer leeren Nutzlast. 

1. Um zu einem Bucket eine Textdatei hinzuzufügen, befolgen Sie die obigen Anweisungen. Wenn Sie den Bucket-Namen **amzn-s3-demo-bucket** für `{folder}` und den Dateinamen für **Readme.txt** für `{item}` in der URL angeben und die Textzeichenfolge **Hello, World\$1** als Dateiinhalt (und damit als Anforderungsnutzlast) angeben, wird die Anforderung

   ```
   PUT /S3/amzn-s3-demo-bucket/Readme.txt HTTP/1.1
   Host: 9gn28ca086.execute-api.{region}.amazonaws.com
   Content-Type: application/xml
   X-Amz-Date: 20161015T062647Z
   Authorization: AWS4-HMAC-SHA256 Credential=access-key-id/20161015/{region}/execute-api/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date, Signature=ccadb877bdb0d395ca38cc47e18a0d76bb5eaf17007d11e40bf6fb63d28c705b
   Cache-Control: no-cache
   Postman-Token: 6135d315-9cc4-8af8-1757-90871d00847e
   
   Hello, World!
   ```

   Wenn alles einwandfrei verläuft, erhalten Sie die Antwort `200 OK` mit einer leeren Nutzlast.

1. Um den Inhalt der Datei `Readme.txt` abzurufen, die wir soeben zum `amzn-s3-demo-bucket`-Bucket hinzugefügt haben, erstellen wir eine GET-Anforderung, die wie folgt aussieht:

   ```
   GET /S3/amzn-s3-demo-bucket/Readme.txt HTTP/1.1
   Host: 9gn28ca086.execute-api.{region}.amazonaws.com
   Content-Type: application/xml
   X-Amz-Date: 20161015T063759Z
   Authorization: AWS4-HMAC-SHA256 Credential=access-key-id/20161015/{region}/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=ba09b72b585acf0e578e6ad02555c00e24b420b59025bc7bb8d3f7aed1471339
   Cache-Control: no-cache
   Postman-Token: d60fcb59-d335-52f7-0025-5bd96928098a
   ```

   Bei Erfolg erhalten Sie die Antwort `200 OK` mit der Textzeichenfolge `Hello, World!` als Nutzlast.

1. Um Elemente im `amzn-s3-demo-bucket`-Bucket aufzulisten, senden Sie die folgende Anforderung:

   ```
   GET /S3/amzn-s3-demo-bucket HTTP/1.1
   Host: 9gn28ca086.execute-api.{region}.amazonaws.com
   Content-Type: application/xml
   X-Amz-Date: 20161015T064324Z
   Authorization: AWS4-HMAC-SHA256 Credential=access-key-id/20161015/{region}/execute-api/aws4_request, SignedHeaders=content-type;host;x-amz-date, Signature=4ac9bd4574a14e01568134fd16814534d9951649d3a22b3b0db9f1f5cd4dd0ac
   Cache-Control: no-cache
   Postman-Token: 9c43020a-966f-61e1-81af-4c49ad8d1392
   ```

   Bei Erfolg erhalten Sie die Antwort `200 OK` mit einer XML-Nutzlast mit einem einzelnen Element im angegebenen Bucket, es sei denn, Sie haben noch mehr Dateien zu dem Bucket hinzugefügt, bevor Sie diese Anforderung gesendet haben.

   ```
   <?xml version="1.0" encoding="UTF-8"?>
   <ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
       <Name>apig-demo-5</Name>
       <Prefix></Prefix>
       <Marker></Marker>
       <MaxKeys>1000</MaxKeys>
       <IsTruncated>false</IsTruncated>
       <Contents>
           <Key>Readme.txt</Key>
           <LastModified>2016-10-15T06:26:48.000Z</LastModified>
           <ETag>"65a8e27d8879283831b664bd8b7f0ad4"</ETag>
           <Size>13</Size>
           <Owner>
               <ID>06e4b09e9d...603addd12ee</ID>
               <DisplayName>user-name</DisplayName>
           </Owner>
           <StorageClass>STANDARD</StorageClass>
       </Contents>
   </ListBucketResult>
   ```

**Anmerkung**  
Um ein Bild hoch- oder herunterzuladen, müssen Sie für die Inhaltsbehandlung die Option CONVERT\$1TO\$1BINARY auswählen.

# Tutorial: REST-API als Amazon Kinesis-Proxy erstellen
<a name="integrating-api-with-aws-services-kinesis"></a>

Auf dieser Seite wird beschrieben, wie eine REST-API durch Integration des `AWS`-Typs für den Zugriff auf Kinesis erstellt und konfiguriert wird. 

**Anmerkung**  
 Um Ihre API Gateway-API in Kinesis zu integrieren, müssen Sie eine Region wählen, in der sowohl das API Gateway als auch die Kinesis-Services verfügbar sind. Informationen zur Verfügbarkeit der Regionen finden Sie unter [Service-Endpunkte und Kontingente](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html).

 Zur Veranschaulichung erstellen wir eine Beispiel-API, so dass ein Client die folgenden Aufgaben ausführen kann: 

1. Verfügbare Streams des Benutzers in Kinesis auflisten 

1. Erstellen, Beschreiben oder Löschen eines bestimmten Streams

1. Lesen von Datensätzen aus einem oder Schreiben von Datensätzen in einen bestimmten Stream

 Für die Ausführung der obigen Aufgaben stellt die API Methoden für verschiedene Ressourcen bereit, um Folgendes aufzurufen: 

1. Die `ListStreams`-Aktion in Kinesis 

1. Die Aktion `CreateStream`, `DescribeStream` oder `DeleteStream`

1. Die `GetRecords`- oder `PutRecords`-Aktion (einschließlich `PutRecord`) in Kinesis

 Genauer gesagt wird die API wie folgt erstellt: 
+  Machen Sie eine HTTP-GET-Methode für die `/streams` API-Ressource verfügbar und integrieren Sie die Methode in die [ListStreams](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListStreams.html)Aktion in Kinesis, um die Streams im Konto des Aufrufers aufzulisten. 
+  Machen Sie eine HTTP-POST-Methode für die `/streams/{stream-name}` API-Ressource verfügbar und integrieren Sie die Methode in die [CreateStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_CreateStream.html)Aktion in Kinesis, um einen benannten Stream im Konto des Aufrufers zu erstellen. 
+  Machen Sie eine HTTP-GET-Methode für die `/streams/{stream-name}` API-Ressource verfügbar und integrieren Sie die Methode in die [DescribeStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DescribeStream.html)Aktion in Kinesis, um einen benannten Stream im Konto des Aufrufers zu beschreiben. 
+  Machen Sie eine HTTP-DELETE-Methode für die `/streams/{stream-name}` API-Ressource verfügbar und integrieren Sie die Methode in die [DeleteStream](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DeleteStream.html)Aktion in Kinesis, um einen Stream im Konto des Anrufers zu löschen. 
+  Machen Sie eine HTTP-PUT-Methode für die `/streams/{stream-name}/record` API-Ressource verfügbar und integrieren Sie die Methode in die [PutRecord](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html)Aktion in Kinesis. Dadurch kann der Client einen einzelnen Datensatz zum benannten Stream hinzufügen. 
+  Machen Sie eine HTTP-PUT-Methode für die `/streams/{stream-name}/records` API-Ressource verfügbar und integrieren Sie die Methode in die [PutRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html)Aktion in Kinesis. Dadurch kann der Client eine Liste mit Datensätzen zum benannten Stream hinzufügen. 
+  Stellen Sie eine HTTP-GET-Methode für die `/streams/{stream-name}/records` API-Ressource bereit und integrieren Sie die Methode in die [GetRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html)Aktion in Kinesis. Auf diese Weise kann der Client Datensätze im benannten Stream mit einem angegebenen gemeinsamen Iterator auflisten. Ein gemeinsamer Iterator gibt die gemeinsame Position an, ab der Datensätze sequenziell ausgelesen werden sollen.
+  Stellen Sie eine HTTP-GET-Methode für die `/streams/{stream-name}/sharditerator` API-Ressource bereit und integrieren Sie die Methode in die [GetShardIterator](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetShardIterator.html)Aktion in Kinesis. Diese Hilfsmethode muss der `ListStreams`-Aktion in Kinesis zur Verfügung gestellt werden. 

 Sie können die hier vorgestellten Anweisungen auf andere Kinesis-Aktionen anwenden. Die vollständige Liste der Kinesis-Aktionen finden Sie unter [Amazon Kinesis API-Referenz](https://docs.aws.amazon.com/kinesis/latest/APIReference/Welcome.html). 

 Anstatt die API Gateway-Konsole zur Erstellung der Beispiel-API zu verwenden, können Sie die Beispiel-API mit der API Gateway [Import API](https://docs.aws.amazon.com/apigateway/latest/api/API_ImportRestApi.html) in API Gateway importieren. Informationen zur Verwendung der Import-API finden Sie unter [Entwickeln APIs Sie REST mit OpenAPI in API Gateway](api-gateway-import-api.md). 

## Erstellen Sie eine IAM-Rolle und Richtlinien für den Zugriff der API auf Kinesis
<a name="integrate-with-kinesis-create-iam-role-and-policy"></a>

 Einer IAM-Rolle müssen entsprechende IAM-Richtlinien zugeordnet sein, damit die API Kinesis-Aktionen aufrufen kann. In dieser Übung erstellen Sie eine neue IAM-Rolle.

**So erstellen Sie die Ausführungsrolle AWS für den Service-Proxy**

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

1. Wählen Sie **Roles**.

1. Wählen Sie **Rolle erstellen** aus.

1.  Wählen Sie unter **Typ der vertrauenswürdigen Entität auswählen** die Option **AWS Dienst** aus, wählen Sie dann **API Gateway** aus und wählen Sie **Erlaubt API Gateway, Logs in Logs zu CloudWatch übertragen**.

1.  Klicken Sie auf **Weiter** und dann erneut auf **Weiter**.

1. Geben Sie für **Role name (Rollenname)** den Namen **APIGatewayKinesisProxyPolicy** ein und klicken Sie auf **Create role (Rolle erstellen)**.

1. Wählen Sie in der Liste **Roles** die Rolle aus, die Sie gerade erstellt haben. Möglicherweise müssen Sie scrollen oder die Rolle über die Suchleiste finden.

1. Wählen Sie für die ausgewählte Rolle die Registerkarte **Berechtigungen hinzufügen** aus.

1. Wählen Sie in der Dropdown-Liste **Berechtigungen anfügen** aus.

1. Geben Sie im Suchfeld **AmazonKinesisFullAccess** ein und wählen Sie **Berechtigungen hinzufügen** aus. 
**Anmerkung**  
Dieses Tutorial verwendet der Einfachheit halber eine verwaltete Richtlinie. Als Best Practice sollten Sie Ihre eigene IAM-Richtlinie erstellen, um die erforderlichen Mindestberechtigungen zu gewähren. 

1. Notieren Sie sich den neu erstellten **Rollen-ARN**, Sie werden ihn später brauchen.

## Eine API als Kinesis-Proxy erstellen
<a name="api-gateway-create-api-as-kinesis-proxy"></a>

Führen Sie die folgenden Schritte aus, um die API in der API Gateway-Konsole zu erstellen.

**Um eine API als AWS Service-Proxy für Kinesis zu erstellen**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wenn Sie API Gateway zum ersten Mal verwenden, sehen Sie eine Seite, die Sie mit den Funktionen des Service vertraut macht. Wählen Sie unter **REST-API** die Option **Erstellen** aus. Wenn das Popup-Fenster **Create Example API (Beispiel-API erstellen)** angezeigt wird, klicken Sie auf **OK**.

   Wenn Sie API Gateway nicht zum ersten Mal verwenden, wählen Sie **Create API (API erstellen)**. Wählen Sie unter **REST-API** die Option **Build (Erstellen)** aus.

1. Klicken Sie auf **New API (Neue API)**. 

1. Geben Sie unter **API name (API-Name)** **KinesisProxy** ein. Belassen Sie alle Standardwerte für die anderen Felder unverändert. 

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Wählen Sie als **IP-Adresstyp** die Option. **IPv4**

1. Wählen Sie **Create API (API erstellen)** aus. 

 Nachdem die API erstellt wurde, zeigt die API Gateway-Konsole die Seite **Resources (Ressourcen)** an, die nur die Root-Ressource (`/`) der API enthält. 

## Streams in Kinesis auflisten
<a name="api-gateway-list-kinesis-streams"></a>

 Kinesis unterstützt die Aktion `ListStreams` mit dem folgenden REST-API-Aufruf: 

```
POST /?Action=ListStreams HTTP/1.1
Host: kinesis.<region>.<domain>
Content-Length: <PayloadSizeBytes>
User-Agent: <UserAgentString>
Content-Type: application/x-amz-json-1.1
Authorization: <AuthParams>
X-Amz-Date: <Date>
        
{
   ...
}
```

In der oben gezeigten REST-API-Anforderung wird die Aktion im `Action`-Abfrageparameter angegeben. Alternativ können Sie stattdessen die Aktion in einer `X-Amz-Target`-Kopfzeile angeben:

```
POST / HTTP/1.1
Host: kinesis.<region>.<domain>
Content-Length: <PayloadSizeBytes>
User-Agent: <UserAgentString>
Content-Type: application/x-amz-json-1.1
Authorization: <AuthParams>
X-Amz-Date: <Date>
X-Amz-Target: Kinesis_20131202.ListStreams        
{
   ...
}
```

In diesem Tutorial verwenden wir den Abfrageparameter, um Aktionen festzulegen.

Um eine Kinesis-Aktion in der API bereitzustellen, fügen Sie eine `/streams`-Ressource zum Stamm der API hinzu. Richten Sie dann eine `GET`-Methode für die Ressource ein und integrieren Sie die Methode mit der `ListStreams`-Aktion von Kinesis. 

Das folgende Verfahren beschreibt die Auflistung von Kinesis-Streams mit Hilfe der API Gateway-Konsole. 

**So listen Sie Kinesis-Streams über die API Gateway-Konsole auf:**

1. Wählen Sie die `/`-Ressource aus und klicken Sie dann auf **Ressource erstellen**. 

1. Geben Sie für **Resource name (Ressourcenname)** **streams** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1.  Wählen Sie die `/streams`-Ressource aus, klicken Sie auf **Methode erstellen** und gehen Sie dann wie folgt vor:

   1. Wählen Sie als **Methodentyp** die Option **GET** (Abrufen) aus.
**Anmerkung**  
Das HTTP-Verb für eine Methode, die von einem Client aufgerufen wird, kann sich von dem HTTP-Verb unterscheiden, das für eine Integration für das Backend erforderlich ist. Hier wählen wir `GET` aus, da das Auflisten von Streams intuitiv ein READ-Vorgang ist. 

   1. Als **Integrationstyp** wählen Sie **AWS -Dienst** aus.

   1. Wählen Sie für den AWS-Region Ort aus **AWS-Region**, an dem Sie Ihren Kinesis-Stream erstellt haben. 

   1. Für **AWS-Service** wählen Sie **Kinesis** aus.

   1. Lassen Sie die **AWS -Subdomain** leer.

   1. Wählen Sie in **HTTP method** **POST**.
**Anmerkung**  
Wir haben hier `POST` gewählt, weil Kinesis erfordert, dass die Aktion `ListStreams` mit aufgerufen wird. 

   1. Für **Aktionstyp** wählen Sie **Aktionsname verwenden** aus.

   1. Für **Aktionsname** geben Sie **ListStreams** ein.

   1. Für **Ausführungsrolle** geben Sie den ARN Ihrer Ausführungsrolle ein.

   1. Die Voreinstellung unter **Passthrough** für **Content-Handling** bleibt unverändert.

   1. Wählen Sie **Methode erstellen** aus.

1. Klicken Sie auf der Registerkarte **Integrationsanfrage** unter **Einstellungen für Integrationsanfragen** auf **Bearbeiten**. 

1. Wählen Sie für **Anforderungstext-Pass-Through** die Einstellung **Wenn keine Vorlagen definiert sind (empfohlen)** aus.

1.  Klicken Sie auf **URL-Abfragezeichenfolgen-Parameter** und gehen Sie dann wie folgt vor:

   1. Klicken Sie auf **Parameter Anforderungsheader hinzufügen**.

   1. Geben Sie unter **Name** **Content-Type** ein.

   1. Geben Sie für **Zugeordnet von** **'application/x-amz-json-1.1'** ein.

    Wir verwenden eine Zuweisung für den Anfrageparameter, um den `Content-Type`-Header auf den statischen Wert `'application/x-amz-json-1.1'` einzustellen und damit Kinesis mitzuteilen, dass die Eingabe in einer bestimmten JSON-Version erfolgt. 

1. Wählen Sie **Mapping-Vorlagen** und dann **Mapping-Vorlage hinzufügen** aus und gehen Sie dann wie folgt vor:

   1. Geben Sie für **Inhaltstyp** **application/json** ein.

   1. Geben Sie für **Vorlage** **\$1\$1** ein.

   1. Wählen Sie **Speichern**.

    Die [ListStreams](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListStreams.html#API_ListStreams_RequestSyntax)Anfrage benötigt eine Nutzlast im folgenden JSON-Format: 

   ```
   {
       "ExclusiveStartStreamName": "string",
       "Limit": number
   }
   ```

   Die Eigenschaften sind jedoch optional. Wir haben uns für eine leere JSON-Nutzlast entschieden, um die Standardwerte zu verwenden.

1. Testen Sie die GET-Methode für die **/streams**-Ressource zum Aufrufen der `ListStreams`-Aktion in Kinesis:

   Wählen Sie die Registerkarte **Test**. Möglicherweise müssen Sie die rechte Pfeiltaste wählen, um die Registerkarte anzuzeigen.

   Klicken Sie auf **Test**, um Ihre Methode zu testen.

    Wenn Sie bereits zwei Streams mit den Namen „myStream“ und „yourStream“ in Kinesis erstellt haben, gibt der Test im Erfolgsfall die Antwort „200 OK“ mit der folgenden Nutzlast zurück: 

   ```
   {
        "HasMoreStreams": false,
        "StreamNames": [
            "myStream",
            "yourStream"
        ]
   }
   ```

## Stream in Kinesis erstellen, beschreiben und löschen
<a name="api-gateway-create-describe-delete-stream"></a>

 Das Erstellen, Beschreiben und Löschen eines Streams in Kinesis umfasst jeweils die folgenden Kinesis REST-API-Anfragen: 

```
POST /?Action=CreateStream HTTP/1.1
Host: kinesis.region.domain
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "ShardCount": number,
    "StreamName": "string"
}
```

```
POST /?Action=DescribeStream HTTP/1.1
Host: kinesis.region.domain
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "StreamName": "string"
}
```

```
POST /?Action=DeleteStream HTTP/1.1
Host: kinesis.region.domain
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "StreamName":"string"
}
```

 Sie können die API so erstellen, dass sie die erforderliche Eingabe als JSON-Nutzlast der Methodenanforderung akzeptiert und die Nutzlast bis zur Integrationsanforderung weiterleitet. Die API wird jedoch geringfügig abgewandelt, um weitere Beispiele für die Datenzuweisung zwischen Methoden- und Integrationsanforderungen sowie Methoden- und Integrationsantworten bereitzustellen. 

 Wir machen die Methoden`GET`,`POST`, und `Delete` HTTP für eine to-be-named `Stream` Ressource verfügbar. Sie verwenden die Pfadvariable `{stream-name}` als Platzhalter für die Stream-Ressource und integrieren diese API-Methoden in die entsprechenden `DescribeStream`-, `CreateStream`- und `DeleteStream`-Aktionen von Kinesis. Wir benötigen, dass der Client andere Eingabedaten als Header, Abfrageparameter oder Nutzdaten einer Methodenanforderung weitergibt. Wir stellen Mapping-Vorlagen zur Verfügung, um die Daten in die erforderliche Nutzlast der Integrationsanforderung zu transformieren. 

**Erstellen einer \$1Stream-name\$1-Ressource**

1. Wählen Sie die Ressource **/streams** aus und klicken Sie dann auf **Ressource erstellen**.

1. Die **Proxy-Ressource** bleibt ausgeschaltet. 

1. Wählen Sie für **Ressourcenpfad** `/streams` aus.

1. Geben Sie für **Resource name (Ressourcenname)** **\$1stream-name\$1** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

**So konfigurieren und testen Sie die GET-Methode für eine Stream-Ressource**

1. Wählen Sie die Ressource **/\$1stream-name\$1** aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie als **Methodentyp** die Option **GET** (Abrufen) aus.

1. Als **Integrationstyp** wählen Sie **AWS -Dienst** aus.

1. Wählen Sie für den AWS-Region Ort aus **AWS-Region**, an dem Sie Ihren Kinesis-Stream erstellt haben. 

1. Für **AWS-Service** wählen Sie **Kinesis** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Wählen Sie in **HTTP method** **POST**.

1. Für **Aktionstyp** wählen Sie **Aktionsname verwenden** aus.

1. Für **Aktionsname** geben Sie **DescribeStream** ein.

1. Für **Ausführungsrolle** geben Sie den ARN Ihrer Ausführungsrolle ein.

1. Die Voreinstellung unter **Passthrough** für **Content-Handling** bleibt unverändert.

1. Wählen Sie **Methode erstellen** aus.

1. Fügen Sie im Abschnitt **Integrationsanfrage** die folgenden **Parameter für URL-Anforderungsheader** hinzu:

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   Die Aufgabe folgt demselben Verfahren, um die Zuweisung des Anforderungsparameters für die Methode `GET /streams` einzurichten.

1. Fügen Sie die folgende Textzuweisungsvorlage hinzu, um Daten der Methodenanforderung `GET /streams/{stream-name}` der Integrationsanforderung `POST /?Action=DescribeStream` zuzuweisen:

   ```
   {
       "StreamName": "$input.params('stream-name')"
   }
   ```

   Diese Zuweisungsvorlage generiert die erforderliche Nutzlast der Integrationsanforderung für die Aktion `DescribeStream` von Kinesis aufgrund des Pfadparameterwerts `stream-name` der Methodenanforderung.

1. Klicken Sie auf die Registerkarte **Test**, um die `GET /stream/{stream-name}`-Methode zum Aufrufen der `DescribeStream`-Aktion in Kinesis zu testen.

1. Geben Sie unter **Stream-Name** den Namen eines vorhandenen Kinesis-Streams für **Pfad** ein.

1. Wählen Sie **Test** aus. Wenn der Test erfolgreich ist, wird die Antwort "200 OK" mit einer Nutzlast ähnlich der folgenden zurückgegeben: 

   ```
   {
     "StreamDescription": {
       "HasMoreShards": false,
       "RetentionPeriodHours": 24,
       "Shards": [
         {
           "HashKeyRange": {
             "EndingHashKey": "68056473384187692692674921486353642290",
             "StartingHashKey": "0"
           },
           "SequenceNumberRange": {
             "StartingSequenceNumber": "49559266461454070523309915164834022007924120923395850242"
           },
           "ShardId": "shardId-000000000000"
         },
         ...
         {
           "HashKeyRange": {
             "EndingHashKey": "340282366920938463463374607431768211455",
             "StartingHashKey": "272225893536750770770699685945414569164"
           },
           "SequenceNumberRange": {
             "StartingSequenceNumber": "49559266461543273504104037657400164881014714369419771970"
           },
           "ShardId": "shardId-000000000004"
         }
       ],
       "StreamARN": "arn:aws:kinesis:us-east-1:12345678901:stream/myStream",
       "StreamName": "myStream",
       "StreamStatus": "ACTIVE"
     }
   }
   ```

    Nach der Bereitstellung der API können Sie eine REST-Anforderung für diese API-Methode erstellen: 

   ```
   GET https://your-api-id.execute-api.region.amazonaws.com/stage/streams/myStream HTTP/1.1
   Host: your-api-id.execute-api.region.amazonaws.com
   Content-Type: application/json
   Authorization: ...
   X-Amz-Date: 20160323T194451Z
   ```

**So konfigurieren und testen Sie die POST-Methode für eine Stream-Ressource**

1. Wählen Sie die Ressource **/\$1stream-name\$1** aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie unter **Method type** (Methodentyp) die Option **POST** aus.

1. Als **Integrationstyp** wählen Sie **AWS -Dienst** aus.

1. Wählen Sie für den AWS-Region Ort aus **AWS-Region**, an dem Sie Ihren Kinesis-Stream erstellt haben. 

1. Für **AWS-Service** wählen Sie **Kinesis** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Wählen Sie in **HTTP method** **POST**.

1. Für **Aktionstyp** wählen Sie **Aktionsname verwenden** aus.

1. Für **Aktionsname** geben Sie **CreateStream** ein.

1. Für **Ausführungsrolle** geben Sie den ARN Ihrer Ausführungsrolle ein.

1. Die Voreinstellung unter **Passthrough** für **Content-Handling** bleibt unverändert.

1. Wählen Sie **Methode erstellen** aus.

1. Fügen Sie im Abschnitt **Integrationsanfrage** die folgenden **Parameter für URL-Anforderungsheader** hinzu:

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   Die Aufgabe folgt demselben Verfahren, um die Zuweisung des Anforderungsparameters für die Methode `GET /streams` einzurichten.

1.  Fügen Sie die folgende Textzuweisungsvorlage hinzu, um Daten der Methodenanforderung `POST /streams/{stream-name}` der Integrationsanforderung `POST /?Action=CreateStream` zuzuweisen: 

   ```
   {
       "ShardCount": #if($input.path('$.ShardCount') == '') 5 #else $input.path('$.ShardCount') #end,
       "StreamName": "$input.params('stream-name')"
   }
   ```

    In der vorhergehenden Zuweisungsvorlage legen wir `ShardCount` auf einen festen Wert von 5 fest, wenn vom Client kein Wert in der Nutzlast der Methodenanforderung angegeben wird. 

1. Klicken Sie auf die Registerkarte **Test**, um die `POST /stream/{stream-name}`-Methode zum Aufrufen der `CreateStream`-Aktion in Kinesis zu testen.

1. Geben Sie für **Path** unter **Stream-Name** den Namen eines neuen Kinesis-Streams für Pfad ein.

1. Wählen Sie **Test** aus. Wenn der Test erfolgreich ist, wird die Antwort "200 OK" ohne Daten zurückgegeben. 

    Nach der Bereitstellung der API können Sie auch eine REST-API-Anfrage im Hinblick auf die POST-Methode für eine Stream-Ressource erstellen, um die `CreateStream`-Aktion in Amazon Kinesis aufzurufen: 

   ```
   POST https://your-api-id.execute-api.region.amazonaws.com/stage/streams/yourStream HTTP/1.1
   Host: your-api-id.execute-api.region.amazonaws.com
   Content-Type: application/json
   Authorization: ...
   X-Amz-Date: 20160323T194451Z
   
   { 
       "ShardCount": 5
   }
   ```

**Konfigurieren und Testen der DELETE-Methode für eine Stream-Ressource**

1. Wählen Sie die Ressource **/\$1stream-name\$1** aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie als **Methodentyp** **LÖSCHEN** aus.

1. Als **Integrationstyp** wählen Sie **AWS -Dienst** aus.

1. Wählen Sie für den AWS-Region Ort aus **AWS-Region**, an dem Sie Ihren Kinesis-Stream erstellt haben. 

1. Für **AWS-Service** wählen Sie **Kinesis** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Wählen Sie in **HTTP method** **POST**.

1. Für **Aktionstyp** wählen Sie **Aktionsname verwenden** aus.

1. Für **Aktionsname** geben Sie **DeleteStream** ein.

1. Für **Ausführungsrolle** geben Sie den ARN Ihrer Ausführungsrolle ein.

1. Die Voreinstellung unter **Passthrough** für **Content-Handling** bleibt unverändert.

1. Wählen Sie **Methode erstellen** aus.

1. Fügen Sie im Abschnitt **Integrationsanfrage** die folgenden **Parameter für URL-Anforderungsheader** hinzu:

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   Die Aufgabe folgt demselben Verfahren, um die Zuweisung des Anforderungsparameters für die Methode `GET /streams` einzurichten.

1.  Fügen Sie die folgende Textzuweisungsvorlage hinzu, um Daten der Methodenanforderung `DELETE /streams/{stream-name}` der entsprechenden Integrationsanforderung `POST /?Action=DeleteStream` zuzuweisen: 

   ```
   {
       "StreamName": "$input.params('stream-name')"
   }
   ```

    Diese Zuweisungsvorlage generiert die erforderliche Eingabe für die Aktion `DELETE /streams/{stream-name}` aus dem vom Client bereitgestellten URL-Pfad `stream-name`. 

1. Klicken Sie auf die Registerkarte **Test**, um die `DELETE /stream/{stream-name}`-Methode zum Aufrufen der `DeleteStream`-Aktion in Kinesis zu testen.

1. Geben Sie unter **Stream-Name** den Namen eines vorhandenen Kinesis-Streams für **Pfad** ein.

1. Wählen Sie **Test** aus. Wenn der Test erfolgreich ist, wird die Antwort "200 OK" ohne Daten zurückgegeben. 

    Nach der Bereitstellung der API können Sie auch die folgende REST-API-Anfrage im Hinblick auf die DELETE-Methode für die Stream-Ressource erstellen, um die `DeleteStream`-Aktion in Amazon Kinesis aufzurufen: 

   ```
   DELETE https://your-api-id.execute-api.region.amazonaws.com/stage/streams/yourStream HTTP/1.1
   Host: your-api-id.execute-api.region.amazonaws.com
   Content-Type: application/json
   Authorization: ...
   X-Amz-Date: 20160323T194451Z
   
   {}
   ```

## Datensätze aus einem Stream in Kinesis abrufen und Datensätze zu einem Stream hinzufügen
<a name="api-gateway-get-and-add-records-to-stream"></a>

 Nachdem Sie einen Stream in Kinesis erstellt haben, können Sie dem Stream Datensätze hinzufügen und die Daten aus dem Stream lesen. Zum Hinzufügen von Datensätzen muss die [PutRecord](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecord.html#API_PutRecord_Examples)Aktion [PutRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html#API_PutRecords_Examples)oder in Kinesis aufgerufen werden. Erstere fügt dem Stream mehrere Datensätze hinzu, letztere hingegen einen einzigen Datensatz. 

```
POST /?Action=PutRecords HTTP/1.1
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "Records": [
        {
            "Data": blob,
            "ExplicitHashKey": "string",
            "PartitionKey": "string"
        }
    ],
    "StreamName": "string"
}
```

oder

```
POST /?Action=PutRecord HTTP/1.1
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "Data": blob,
    "ExplicitHashKey": "string",
    "PartitionKey": "string",
    "SequenceNumberForOrdering": "string",
    "StreamName": "string"
}
```

 Hier identifiziert `StreamName` den Zieldatenstrom zum Hinzufügen von Datensätzen. `StreamName`, `Data`, und `PartitionKey` sind erforderliche Eingabedaten. In diesem Beispiel werden die Standardwerte für alle optionalen Eingabedaten verwendet. Es erfolgt keine explizite Angabe entsprechender Werte in der Eingabe für die Methodenanforderung. 

 Das Lesen von Daten in Kinesis läuft darauf hinaus, die [GetRecords](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_GetRecords.html#API_GetRecords_Examples)Aktion aufzurufen: 

```
POST /?Action=GetRecords HTTP/1.1
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes

{
    "ShardIterator": "string",
    "Limit": number
}
```

Hier wird der Quell-Stream, von dem die Datensätze abgerufen werden, im erforderlichen `ShardIterator`-Wert angegeben. Dies wird in der folgenden Kinesis-Aktion zum Abrufen eines gemeinsamen Iterators verdeutlicht:

```
POST /?Action=GetShardIterator HTTP/1.1
Host: kinesis.region.domain
Authorization: AWS4-HMAC-SHA256 Credential=..., ...
...
Content-Type: application/x-amz-json-1.1
Content-Length: PayloadSizeBytes
                
{
    "ShardId": "string",
    "ShardIteratorType": "string",
    "StartingSequenceNumber": "string",
    "StreamName": "string"
}
```

 Für die Aktionen `GetRecords` und `PutRecords` werden die Methoden `GET` und `PUT` entsprechend für eine `/records`-Ressource bereitgestellt, die einem benannten Stream hinzugefügt wird (`/{stream-name}`). Ebenso wird die `PutRecord`-Aktion als `PUT`-Methode für eine `/record`-Ressource verfügbar gemacht. 

 Da die Aktion `GetRecords` als Eingabe einen `ShardIterator`-Wert verwendet, der durch Aufrufen der Hilfsaktion `GetShardIterator` gewonnen wurde, stellen Sie eine `GET`-Hilfsmethode für eine `ShardIterator`-Ressource bereit (`/sharditerator`). 

**So erstellen Sie die Ressourcen /record, /records und /sharditerator**

1. Wählen Sie die Ressource **/\$1stream-name\$1** aus und klicken Sie dann auf **Ressource erstellen**.

1. Die **Proxy-Ressource** bleibt ausgeschaltet. 

1. Wählen Sie für **Ressourcenpfad** `/{stream-name}` aus.

1. Geben Sie für **Resource name (Ressourcenname)** **record** ein.

1. **CORS (Cross Origin Resource Sharing)** bleibt ausgeschaltet.

1. Wählen Sie **Create Resource** (Ressource erstellen) aus.

1. Wiederholen Sie die Schritte oben, um eine **/records**- und eine **/sharditerator**-Ressource zu erstellen. Die endgültige API sollte wie folgt aussehen:

      
![\[Erstellen Sie die Methoden Records:GET|PUT|PUT|GET für die API.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/api-gateway-kinesis-proxy-setup-streams-stream-record-method-new-console.png)

 In den folgenden vier Verfahren wird beschrieben, wie Sie die jeweiligen Methoden einrichten, Daten aus den Methodenanforderungen den Integrationsanforderungen zuweisen und die Methoden testen. 

**Einrichten und Testen der `PUT /streams/{stream-name}/record`-Methode zum Aufruf von `PutRecord` in Kinesis:**

1. Wählen Sie **/record** aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie unter **Methodentyp** **PUT** aus.

1. Als **Integrationstyp** wählen Sie **AWS -Dienst** aus.

1. Wählen Sie für den AWS-Region Ort aus **AWS-Region**, an dem Sie Ihren Kinesis-Stream erstellt haben. 

1. Für **AWS-Service** wählen Sie **Kinesis** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Wählen Sie in **HTTP method** **POST**.

1. Für **Aktionstyp** wählen Sie **Aktionsname verwenden** aus.

1. Für **Aktionsname** geben Sie **PutRecord** ein.

1. Für **Ausführungsrolle** geben Sie den ARN Ihrer Ausführungsrolle ein.

1. Die Voreinstellung unter **Passthrough** für **Content-Handling** bleibt unverändert.

1. Wählen Sie **Methode erstellen** aus.

1. Fügen Sie im Abschnitt **Integrationsanfrage** die folgenden **Parameter für URL-Anforderungsheader** hinzu:

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   Die Aufgabe folgt demselben Verfahren, um die Zuweisung des Anforderungsparameters für die Methode `GET /streams` einzurichten.

1.  Fügen Sie die folgende Textzuweisungsvorlage hinzu, um Daten der Methodenanforderung `PUT /streams/{stream-name}/record` der entsprechenden Integrationsanforderung `POST /?Action=PutRecord` zuzuweisen: 

   ```
   {
       "StreamName": "$input.params('stream-name')",
       "Data": "$util.base64Encode($input.json('$.Data'))",
       "PartitionKey": "$input.path('$.PartitionKey')"
   }
   ```

    In dieser Zuweisungsvorlage wird davon ausgegangen, dass die Nutzlast der Methodenanforderung folgendes Format aufweist: 

   ```
   {
      "Data": "some data",
      "PartitionKey": "some key"
   }
   ```

   Diese Daten können mithilfe des folgenden JSON-Schemas modelliert werden:

   ```
   {
     "$schema": "http://json-schema.org/draft-04/schema#",
     "title": "PutRecord proxy single-record payload",
     "type": "object",
     "properties": {
         "Data": { "type": "string" },
         "PartitionKey": { "type": "string" }
     }
   }
   ```

    Sie können ein Modell mit diesem Schema erstellen und es verwenden, um die Generierung der Zuweisungsvorlage zu vereinfachen. Sie können eine Zuweisungsvorlage jedoch auch ohne ein Modell erstellen. 

1.  Testen Sie die Methode `PUT /streams/{stream-name}/record`, indem Sie die Pfadvariable `stream-name` auf den Namen eines vorhandenen Streams festlegen, eine Nutzlast im erforderlichen Format bereitstellen und die Methodenanforderung dann senden. Das Ergebnis im Erfolgsfall ist die Antwort `200 OK `mit einer Nutzlast in folgendem Format: 

   ```
   {
     "SequenceNumber": "49559409944537880850133345460169886593573102115167928386",
     "ShardId": "shardId-000000000004"
   }
   ```

**So richten Sie die `PUT /streams/{stream-name}/records`-Methode zum Aufruf von `PutRecords` in Kinesis ein und testen sie:**

1. Wählen Sie die Ressource **/records** aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie unter **Methodentyp** **PUT** aus.

1. Als **Integrationstyp** wählen Sie **AWS -Dienst** aus.

1. Wählen Sie für den AWS-Region Ort aus **AWS-Region**, an dem Sie Ihren Kinesis-Stream erstellt haben. 

1. Für **AWS-Service** wählen Sie **Kinesis** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Wählen Sie in **HTTP method** **POST**.

1. Für **Aktionstyp** wählen Sie **Aktionsname verwenden** aus.

1. Für **Aktionsname** geben Sie **PutRecords** ein.

1. Für **Ausführungsrolle** geben Sie den ARN Ihrer Ausführungsrolle ein.

1. Die Voreinstellung unter **Passthrough** für **Content-Handling** bleibt unverändert.

1. Wählen Sie **Methode erstellen** aus.

1. Fügen Sie im Abschnitt **Integrationsanfrage** die folgenden **Parameter für URL-Anforderungsheader** hinzu:

   ```
   Content-Type: 'x-amz-json-1.1'
   ```

   Die Aufgabe folgt demselben Verfahren, um die Zuweisung des Anforderungsparameters für die Methode `GET /streams` einzurichten.

1.  Fügen Sie die folgende Zuweisungsvorlage hinzu, um Daten der `PUT /streams/{stream-name}/records`-Methodenanforderung der entsprechenden `POST /?Action=PutRecords`-Integrationsanforderung zuzuweisen: 

   ```
   {
       "StreamName": "$input.params('stream-name')",
       "Records": [
          #foreach($elem in $input.path('$.records'))
             {
               "Data": "$util.base64Encode($elem.data)",
               "PartitionKey": "$elem.partition-key"
             }#if($foreach.hasNext),#end
           #end
       ]
   }
   ```

   In dieser Zuweisungsvorlage wird davon ausgegangen, dass die Nutzlast der Methodenanforderung anhand des folgenden JSON-Schemas modelliert werden kann:

   ```
   {
     "$schema": "http://json-schema.org/draft-04/schema#",
     "title": "PutRecords proxy payload data",
     "type": "object",
     "properties": {
       "records": {
         "type": "array",
         "items": {
           "type": "object",
           "properties": {
             "data": { "type": "string" },
             "partition-key": { "type": "string" }
           }
         }
       }
     }
   }
   ```

    Sie können ein Modell mit diesem Schema erstellen und es verwenden, um die Generierung der Zuweisungsvorlage zu vereinfachen. Sie können eine Zuweisungsvorlage jedoch auch ohne ein Modell erstellen. 

   In diesem Tutorial haben wir zwei geringfügig unterschiedliche Nutzdatenformate verwendet, um zu veranschaulichen, dass ein API-Entwickler je nach Bedarf das Backend-Datenformat für den Client offenlegen oder gegenüber dem Client verbergen kann. Eines dieser Formate ist für die Methode `PUT /streams/{stream-name}/records` bestimmt (oben). Ein anderes Format wird für die Methode `PUT /streams/{stream-name}/record` (im vorherigen Verfahren) verwendet. In einer Produktionsumgebung sollten beide Formate konsistent bleiben. 

1. 

    Testen Sie die Methode `PUT /streams/{stream-name}/records`, indem Sie die Pfadvariable `stream-name` auf einen vorhandenen Stream festlegen, die folgende Nutzlast bereitstellen und die Methodenanforderung senden. 

   ```
   {
       "records": [
           {
               "data": "some data",
               "partition-key": "some key"
           },
           {
               "data": "some other data",
               "partition-key": "some key"
           }
       ]
   }
   ```

   Das Ergebnis im Erfolgsfall ist die Antwort "200 OK" mit einer Nutzlast, die der folgenden Ausgabe ähnelt: 

   ```
   {
     "FailedRecordCount": 0,
     "Records": [
       {
         "SequenceNumber": "49559409944537880850133345460167468741933742152373764162",
         "ShardId": "shardId-000000000004"
       },
       {
         "SequenceNumber": "49559409944537880850133345460168677667753356781548470338",
         "ShardId": "shardId-000000000004"
       }
     ]
   }
   ```

**Richten Sie die `GET /streams/{stream-name}/sharditerator`-Methode ein und testen Sie sie, indem Sie `GetShardIterator` in Kinesis aufrufen**

Die Methode `GET /streams/{stream-name}/sharditerator` ist eine Hilfsmethode, um einen erforderlichen gemeinsamen Iterator vor dem Aufrufen der Methode `GET /streams/{stream-name}/records` zu beschaffen.

1. Wählen Sie die Ressource **/sharditerator** aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie als **Methodentyp** die Option **GET** (Abrufen) aus.

1. Als **Integrationstyp** wählen Sie **AWS -Dienst** aus.

1. Wählen Sie für den AWS-Region Ort aus **AWS-Region**, an dem Sie Ihren Kinesis-Stream erstellt haben. 

1. Für **AWS-Service** wählen Sie **Kinesis** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Wählen Sie in **HTTP method** **POST**.

1. Für **Aktionstyp** wählen Sie **Aktionsname verwenden** aus.

1. Für **Aktionsname** geben Sie **GetShardIterator** ein.

1. Für **Ausführungsrolle** geben Sie den ARN Ihrer Ausführungsrolle ein.

1. Die Voreinstellung unter **Passthrough** für **Content-Handling** bleibt unverändert.

1. Klicken Sie auf **Parameter für URL-Abfragezeichenfolgen**.

   Die `GetShardIterator`-Aktion erfordert die Eingabe eines ShardId-Werts. Zur Weitergabe eines vom Client bereitgestellten `ShardId`-Werts wird der Methodenanforderung ein `shard-id`-Abfrageparameter wie nachfolgend dargestellt hinzugefügt: 

1. Wählen Sie **Abfragezeichenfolge hinzufügen** aus.

1. Geben Sie unter **Name** **shard-id** ein.

1. Lassen Sie die Optionen **Required** (Obligatorisch) and **Caching** (Cache) deaktiviert.

1. Wählen Sie **Methode erstellen** aus.

1. Fügen Sie im Abschnitt **Integrationsanforderung** die folgende Zuweisungsvorlage hinzu, um die erforderlichen Eingaben (`ShardId` und `StreamName`) für die `GetShardIterator`-Aktion aus den Parametern `shard-id` und `stream-name` der Methodenanforderung zu generieren. Durch die Zuweisungsvorlage wird außerdem `ShardIteratorType` auf die Standardeinstellung `TRIM_HORIZON` festgelegt.

   ```
   {
       "ShardId": "$input.params('shard-id')",
       "ShardIteratorType": "TRIM_HORIZON",
       "StreamName": "$input.params('stream-name')"
   }
   ```

1.  Verwenden Sie die Option **Test** in der Amazon API Gateway-Konsole, geben Sie einen vorhandenen Stream-Namen als Wert der Variablen `stream-name` **Path** ein, setzen Sie die `shard-id` **Query string** auf einen vorhandenen `ShardId`-Wert (z. B. `shard-000000000004`) und wählen Sie **Test**. 

    Im Erfolgsfall sieht die Ausgabe der Antwortnutzlast folgendermaßen oder ähnlich aus: 

   ```
   {
     "ShardIterator": "AAAAAAAAAAFYVN3VlFy..."
   }
   ```

   Notieren Sie sich den Wert für `ShardIterator`. Sie benötigen ihn, um Datensätze aus einem Stream abzurufen.

**So konfigurieren und testen Sie die `GET /streams/{stream-name}/records`-Methode zum Aufrufen der `GetRecords`-Aktion in Kinesis:**

1. Wählen Sie die Ressource **/records** aus und klicken Sie dann auf **Methode erstellen**.

1. Wählen Sie als **Methodentyp** die Option **GET** (Abrufen) aus.

1. Als **Integrationstyp** wählen Sie **AWS -Dienst** aus.

1. Wählen Sie für den AWS-Region Ort aus **AWS-Region**, an dem Sie Ihren Kinesis-Stream erstellt haben. 

1. Für **AWS-Service** wählen Sie **Kinesis** aus.

1. Lassen Sie die **AWS -Subdomain** leer.

1. Wählen Sie in **HTTP method** **POST**.

1. Für **Aktionstyp** wählen Sie **Aktionsname verwenden** aus.

1. Für **Aktionsname** geben Sie **GetRecords** ein.

1. Für **Ausführungsrolle** geben Sie den ARN Ihrer Ausführungsrolle ein.

1. Die Voreinstellung unter **Passthrough** für **Content-Handling** bleibt unverändert.

1. Wählen Sie **HTTP-Anforderungs-Headers** aus.

    Die `GetRecords`-Aktion erfordert die Eingabe eines `ShardIterator`-Werts. Für eine Weitergabe eines vom Client bereitgestellten `ShardIterator`-Werts muss der Methodenanforderung ein `Shard-Iterator`-Header-Parameter hinzugefügt werden.

1. Wählen Sie **Add header**.

1. Geben Sie unter **Name** **Shard-Iterator** ein.

1. Lassen Sie die Optionen **Required** (Obligatorisch) and **Caching** (Cache) deaktiviert.

1. Wählen Sie **Methode erstellen** aus.

1.  Fügen Sie die folgende Textzuweisungsvorlage im Abschnitt **Integrationsanforderung** hinzu, um den `Shard-Iterator`-Header-Parameterwert dem `ShardIterator`-Eigenschaftswert der JSON-Nutzlast für die `GetRecords`-Aktion in Kinesis zuzuweisen. 

   ```
   {
       "ShardIterator": "$input.params('Shard-Iterator')"
   }
   ```

1.  Mithilfe der Option **Test** in der Amazon-API-Gateway-Konsole geben Sie einen vorhandenen Stream-Namen als Wert der Variablen `stream-name`-**Pfad** ein, setzen den `Shard-Iterator`-**Header** auf den `ShardIterator`-Wert aus dem Testdurchlauf der `GET /streams/{stream-name}/sharditerator`-Methode (oben) und klicken dann auf **Test**. 

    Im Erfolgsfall sieht die Ausgabe der Antwortnutzlast folgendermaßen oder ähnlich aus: 

   ```
   {
     "MillisBehindLatest": 0,
     "NextShardIterator": "AAAAAAAAAAF...",
     "Records": [ ... ]
   }
   ```

# OpenAPI-Definitionen einer Beispiel-API als Kinesis-Proxy
<a name="api-as-kinesis-proxy-export-swagger-with-extensions"></a>

Nachfolgend finden Sie OpenAPI-Definitionen für die in diesem Tutorial verwendete Beispiel-API als Kinesis-Proxy. 

------
#### [ OpenAPI 3.0 ]

```
{
  "openapi": "3.0.0",
  "info": {
    "title": "KinesisProxy",
    "version": "2016-03-31T18:25:32Z"
  },
  "paths": {
    "/streams/{stream-name}/sharditerator": {
      "get": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "shard-id",
            "in": "query",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetShardIterator",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardId\": \"$input.params('shard-id')\",\n    \"ShardIteratorType\": \"TRIM_HORIZON\",\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/records": {
      "get": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "Shard-Iterator",
            "in": "header",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetRecords",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardIterator\": \"$input.params('Shard-Iterator')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "put": {
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PutRecordsMethodRequestPayload"
              }
            },
            "application/x-amz-json-1.1": {
              "schema": {
                "$ref": "#/components/schemas/PutRecordsMethodRequestPayload"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecords",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\",\n    \"Records\": [\n          {\n            \"Data\": \"$util.base64Encode($elem.data)\",\n            \"PartitionKey\": \"$elem.partition-key\"\n          }#if($foreach.hasNext),#end\n    ]\n}",
            "application/x-amz-json-1.1": "{\n  \"StreamName\": \"$input.params('stream-name')\",\n  \"records\" : [\n    {\n        \"Data\" : \"$elem.data\",\n        \"PartitionKey\" : \"$elem.partition-key\"\n    }#if($foreach.hasNext),#end\n  ]\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}": {
      "get": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/DescribeStream",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "post": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/CreateStream",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardCount\": 5,\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "delete": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          },
          "400": {
            "description": "400 response",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {}
          },
          "500": {
            "description": "500 response",
            "headers": {
              "Content-Type": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "content": {}
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/DeleteStream",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "5\\d{2}": {
              "statusCode": "500",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/record": {
      "put": {
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecord",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\",\n    \"Data\": \"$util.base64Encode($input.json('$.Data'))\",\n    \"PartitionKey\": \"$input.path('$.PartitionKey')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams": {
      "get": {
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Empty"
                }
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/ListStreams",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Empty": {
        "type": "object"
      },
      "PutRecordsMethodRequestPayload": {
        "type": "object",
        "properties": {
          "records": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "data": {
                  "type": "string"
                },
                "partition-key": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  }
}
```

------
#### [ OpenAPI 2.0 ]

```
{
  "swagger": "2.0",
  "info": {
    "version": "2016-03-31T18:25:32Z",
    "title": "KinesisProxy"
  },
  "basePath": "/test",
  "schemes": [
    "https"
  ],
  "paths": {
    "/streams": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/ListStreams",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/DescribeStream",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "post": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/CreateStream",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardCount\": 5,\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "delete": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            },
            "headers": {
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "400": {
            "description": "400 response",
            "headers": {
              "Content-Type": {
                "type": "string"
              }
            }
          },
          "500": {
            "description": "500 response",
            "headers": {
              "Content-Type": {
                "type": "string"
              }
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/DeleteStream",
          "responses": {
            "4\\d{2}": {
              "statusCode": "400",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "default": {
              "statusCode": "200",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            },
            "5\\d{2}": {
              "statusCode": "500",
              "responseParameters": {
                "method.response.header.Content-Type": "integration.response.header.Content-Type"
              }
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/record": {
      "put": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecord",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\",\n    \"Data\": \"$util.base64Encode($input.json('$.Data'))\",\n    \"PartitionKey\": \"$input.path('$.PartitionKey')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/records": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "Shard-Iterator",
            "in": "header",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetRecords",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardIterator\": \"$input.params('Shard-Iterator')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      },
      "put": {
        "consumes": [
          "application/json",
          "application/x-amz-json-1.1"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "Content-Type",
            "in": "header",
            "required": false,
            "type": "string"
          },
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "in": "body",
            "name": "PutRecordsMethodRequestPayload",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PutRecordsMethodRequestPayload"
            }
          },
          {
            "in": "body",
            "name": "PutRecordsMethodRequestPayload",
            "required": true,
            "schema": {
              "$ref": "#/definitions/PutRecordsMethodRequestPayload"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/PutRecords",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"StreamName\": \"$input.params('stream-name')\",\n    \"Records\": [\n          {\n            \"Data\": \"$util.base64Encode($elem.data)\",\n            \"PartitionKey\": \"$elem.partition-key\"\n          }#if($foreach.hasNext),#end\n    ]\n}",
            "application/x-amz-json-1.1": "{\n  \"StreamName\": \"$input.params('stream-name')\",\n  \"records\" : [\n    {\n        \"Data\" : \"$elem.data\",\n        \"PartitionKey\" : \"$elem.partition-key\"\n    }#if($foreach.hasNext),#end\n  ]\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    },
    "/streams/{stream-name}/sharditerator": {
      "get": {
        "consumes": [
          "application/json"
        ],
        "produces": [
          "application/json"
        ],
        "parameters": [
          {
            "name": "stream-name",
            "in": "path",
            "required": true,
            "type": "string"
          },
          {
            "name": "shard-id",
            "in": "query",
            "required": false,
            "type": "string"
          }
        ],
        "responses": {
          "200": {
            "description": "200 response",
            "schema": {
              "$ref": "#/definitions/Empty"
            }
          }
        },
        "x-amazon-apigateway-integration": {
          "type": "aws",
          "credentials": "arn:aws:iam::123456789012:role/apigAwsProxyRole",
          "uri": "arn:aws:apigateway:us-east-1:kinesis:action/GetShardIterator",
          "responses": {
            "default": {
              "statusCode": "200"
            }
          },
          "requestParameters": {
            "integration.request.header.Content-Type": "'application/x-amz-json-1.1'"
          },
          "requestTemplates": {
            "application/json": "{\n    \"ShardId\": \"$input.params('shard-id')\",\n    \"ShardIteratorType\": \"TRIM_HORIZON\",\n    \"StreamName\": \"$input.params('stream-name')\"\n}"
          },
          "passthroughBehavior": "when_no_match",
          "httpMethod": "POST"
        }
      }
    }
  },
  "definitions": {
    "Empty": {
      "type": "object"
    },
    "PutRecordsMethodRequestPayload": {
      "type": "object",
      "properties": {
        "records": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "data": {
                "type": "string"
              },
              "partition-key": {
                "type": "string"
              }
            }
          }
        }
      }
    }
  }
}
```

------

# Tutorial: Erstellen Sie eine REST-API mit AWS SDKs oder AWS CLI
<a name="api-gateway-create-api-cli-sdk"></a>

Verwenden Sie das folgende Tutorial, um eine PetStore API zu erstellen, die die `GET /pets/{petId}` Methoden `GET /pets` und unterstützt. Die Methoden sind mit einem HTTP-Endpunkt integriert. Sie können diesem Tutorial mit dem AWS SDK für JavaScript, dem SDK for Python (Boto3) oder dem folgen. AWS CLI Das API richten Sie mithilfe der folgenden Funktionen und Befehle ein:

------
#### [ JavaScript v3 ]
+ [ CreateRestApiCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/CreateRestApiCommand/)
+ [ CreateResourceCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/CreateResourceCommand/)
+ [ PutMethodCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/PutMethodCommand/)
+ [ PutMethodResponseCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/PutMethodResponseCommand/)
+ [ PutIntegrationCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/PutIntegrationCommand/)
+ [ PutIntegrationResponseCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/PutIntegrationResponseCommand/)
+ [ CreateDeploymentCommand](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/api-gateway/command/CreateDeploymentCommand/)

------
#### [ Python ]
+ [ create\$1rest\$1api](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/create_rest_api.html)
+ [ create\$1resource](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/create_resource.html)
+ [ put\$1method](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/put_method.html)
+ [ put\$1method\$1response](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/put_method_response.html)
+ [ put\$1integration](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/put_integration.html)
+ [ put\$1integration\$1response](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/put_integration_response.html)
+ [ create\$1deployment](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/apigateway/client/create_deployment.html)

------
#### [ AWS CLI ]
+ [create-rest-api](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-rest-api.html)
+  [create-resource](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-resource.html) 
+  [put-method](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method.html) 
+  [put-method-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-method-response.html) 
+  [put-integration](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-integration.html) 
+  [put-integration-response](https://docs.aws.amazon.com/cli/latest/reference/apigateway/put-integration-response.html) 
+  [create-deployment](https://docs.aws.amazon.com/cli/latest/reference/apigateway/create-deployment.html) 

------

Weitere Informationen zum AWS SDK für JavaScript v3 finden Sie unter [Wofür ist das AWS SDK](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/welcome.html)? JavaScript . Weitere Informationen zum SDK für Python (Boto3) finden Sie unter [AWS SDK für Python (Boto3)](https://docs.aws.amazon.com/pythonsdk). Weitere Informationen zu dem AWS CLI finden Sie unter [Was ist der AWS CLI?](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) .

## Richten Sie eine Edge-optimierte API PetStore ein
<a name="api-gateway-create-api-cli-sdk-tutorial"></a>

In diesem Tutorial verwenden Beispielbefehle Platzhalterwerte für Werte IDs wie API-ID und Ressourcen-ID. Nach Abschluss des Tutorials ersetzen Sie die Beispielwerte mit Ihren eigenen Werten.

**Um eine PetStore Edge-optimierte API einzurichten, verwenden Sie AWS SDKs**

1. Erstellen Sie mithilfe des folgenden Beispiels eine `RestApi`-Entity:

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient, CreateRestApiCommand} from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new CreateRestApiCommand({
       name: "Simple PetStore (JavaScript v3 SDK)",
       description: "Demo API created using the AWS SDK for JavaScript v3",
       version: "0.00.001",
       binaryMediaTypes: [
       '*']
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.error(Couldn't create API:\n", err)
   }
   })();
   ```

   Ein erfolgreicher Aufruf gibt Ihre API-ID und die Root-Ressourcen-ID Ihrer API in einer Ausgabe wie folgt zurück:

   ```
   {
     id: 'abc1234',
     name: 'PetStore (JavaScript v3 SDK)',
     description: 'Demo API created using the AWS SDK for node.js',
     createdDate: 2017-09-05T19:32:35.000Z,
     version: '0.00.001',
     rootResourceId: 'efg567'
     binaryMediaTypes: [ '*' ] 
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.create_rest_api(
           name='Simple PetStore (Python SDK)',
           description='Demo API created using the AWS SDK for Python',
           version='0.00.001',
           binaryMediaTypes=[
               '*'
           ]
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Couldn't create REST API %s.", error)
       raise
   attribute=["id","name","description","createdDate","version","binaryMediaTypes","apiKeySource","endpointConfiguration","disableExecuteApiEndpoint","rootResourceId"]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Ein erfolgreicher Aufruf gibt Ihre API-ID und die Root-Ressourcen-ID Ihrer API in einer Ausgabe wie folgt zurück:

   ```
   {'id': 'abc1234', 'name': 'Simple PetStore (Python SDK)', 'description': 'Demo API created using the AWS SDK for Python', 'createdDate': datetime.datetime(2024, 4, 3, 14, 31, 39, tzinfo=tzlocal()), 'version': '0.00.001', 'binaryMediaTypes': ['*'], 'apiKeySource': 'HEADER', 'endpointConfiguration': {'types': ['EDGE']}, 'disableExecuteApiEndpoint': False, 'rootResourceId': 'efg567'}
   ```

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

   ```
   aws apigateway create-rest-api --name 'Simple PetStore (AWS CLI)' --region us-west-2
   ```

   Die Ausgabe dieses Befehls ist wie folgt:

   ```
   {
       "id": "abcd1234", 
       "name": "Simple PetStore (AWS CLI)", 
       "createdDate": "2022-12-15T08:07:04-08:00",
       "apiKeySource": "HEADER",
       "endpointConfiguration": {
           "types": [
               "EDGE"
           ]
       },
       "disableExecuteApiEndpoint": false,
       "rootResourceId": "efg567"
   }
   ```

------

   Die von Ihnen erstellte API hat die API-ID `abcd1234` und die Root-Ressourcen-ID `efg567`. Diese Werte verwenden Sie nun bei der Einrichtung Ihrer API.

1. Als Nächstes erstellen Sie eine untergeordnete Ressource für die Root-Ressource. Hierzu geben Sie `RootResourceId` als den `parentId`-Eigenschaftswert an. Erstellen Sie anhand des folgenden Beispiels eine `/pets`-Ressource für Ihre API:

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  CreateResourceCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new CreateResourceCommand({
       restApiId: 'abcd1234',
       parentId: 'efg567',
       pathPart: 'pets'
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The '/pets' resource setup failed:\n", err)
   }
   })();
   ```

   Ein erfolgreicher Aufruf gibt Informationen zur Ressource in einer Ausgabe wie folgt zurück:

   ```
   {
       "path": "/pets", 
       "pathPart": "pets", 
       "id": "aaa111", 
       "parentId": "efg567'"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.create_resource(
           restApiId='abcd1234',
           parentId='efg567',
           pathPart='pets'
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("The '/pets' resource setup failed: %s.", error)
       raise
   attribute=["id","parentId", "pathPart", "path",]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Ein erfolgreicher Aufruf gibt Informationen zur Ressource in einer Ausgabe wie folgt zurück:

   ```
   {'id': 'aaa111', 'parentId': 'efg567', 'pathPart': 'pets', 'path': '/pets'}
   ```

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

   ```
   aws apigateway create-resource --rest-api-id abcd1234 \
     --region us-west-2 \
     --parent-id efg567 \
     --path-part pets
   ```

   Die Ausgabe dieses Befehls ist wie folgt:

   ```
   {
       "id": "aaa111", 
       "parentId": "efg567",
       "pathPart": "pets",
       "path": "/pets"
   }
   ```

------

   Die von Ihnen erstellte `/pets`-Ressource hat die Ressourcen-ID `aaa111`. Diesen Wert verwenden Sie bei der Einrichtung Ihrer API.

1. Als Nächstes fügen Sie der `/pets`-Ressource eine untergeordnete Ressource hinzu. Diese Ressource, `/{petId}`, besitzt einen Pfadparameter für die `{petId}`. Wenn Sie einen Teil eines Pfads zu einem Pfadparameter machen wollen, setzen Sie ihn in geschweifte Klammern `{ }`. Erstellen Sie anhand des folgenden Beispiels eine `/pets/{petId}`-Ressource für Ihre API:

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  CreateResourceCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new CreateResourceCommand({
       restApiId: 'abcd1234',
       parentId: 'aaa111',
       pathPart: '{petId}'
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The '/pets/{petId}' resource setup failed:\n", err)
   }
   })();
   ```

   Ein erfolgreicher Aufruf gibt Informationen zur Ressource in einer Ausgabe wie folgt zurück:

   ```
   {
       "path": "/pets/{petId}", 
       "pathPart": "{petId}", 
       "id": "bbb222", 
       "parentId": "aaa111'"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.create_resource(
           restApiId='abcd1234',
           parentId='aaa111',
           pathPart='{petId}'
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("The '/pets/{petId}' resource setup failed: %s.", error)
       raise
   attribute=["id","parentId", "pathPart", "path",]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Ein erfolgreicher Aufruf gibt Informationen zur Ressource in einer Ausgabe wie folgt zurück:

   ```
   {'id': 'bbb222', 'parentId': 'aaa111', 'pathPart': '{petId}', 'path': '/pets/{petId}'}
   ```

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

   ```
   aws apigateway create-resource --rest-api-id abcd1234 \
     --region us-west-2 \
     --parent-id aaa111 \
     --path-part '{petId}'
   ```

   Die Ausgabe dieses Befehls ist wie folgt:

   ```
   {
       "id": "bbb222",
       "parentId": "aaa111",
       "path": "/pets/{petId}", 
       "pathPart": "{petId}"
   }
   ```

------

   Die von Ihnen erstellte `/pets/{petId}`-Ressource hat die Ressourcen-ID `bbb222`. Diesen Wert verwenden Sie bei der Einrichtung Ihrer API.

1. In den nächsten zwei Schritten fügen Sie HTTP-Methoden zu Ihren Ressourcen hinzu. In diesem Tutorial legen Sie fest, dass die Methoden offenen Zugriff haben sollen. Hierfür setzen Sie `authorization-type` auf `NONE`. Damit nur authentifizierte Benutzer die Methode aufrufen können, können Sie IAM-Rollen und -Richtlinien, einen Lambda-Genehmiger (früher als benutzerdefinierter Genehmiger bekannt) oder einen Amazon Cognito-Benutzerpool verwenden. Weitere Informationen finden Sie unter [Steuern und verwalten Sie den Zugriff auf REST APIs in API Gateway](apigateway-control-access-to-api.md).

   Fügen Sie anhand des folgenden Beispiels die `/pets`-HTTP-Methode der `GET`-Ressource hinzu:

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutMethodCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutMethodCommand({
       restApiId: 'abcd1234',
       resourceId: 'aaa111',
       httpMethod: 'GET',
       authorizationType: 'NONE'
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The 'GET /pets' method setup failed:\n", err)
   }
   })();
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {
       "apiKeyRequired": false, 
       "httpMethod": "GET", 
       "authorizationType": "NONE"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_method(
           restApiId='abcd1234',
           resourceId='aaa111',
           httpMethod='GET',
           authorizationType='NONE'
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("The 'GET /pets' method setup failed: %s", error)
       raise
   attribute=["httpMethod","authorizationType","apiKeyRequired"]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {'httpMethod': 'GET', 'authorizationType': 'NONE', 'apiKeyRequired': False}
   ```

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

   ```
   aws apigateway put-method --rest-api-id abcd1234 \
     --resource-id aaa111 \
     --http-method GET \
     --authorization-type "NONE" \
     --region us-west-2
   ```

   Die Ausgabe dieses Befehls ist wie folgt:

   ```
   {
       "httpMethod": "GET", 
       "authorizationType": "NONE",
       "apiKeyRequired": false
   }
   ```

------

1. Fügen Sie anhand des folgenden Beispiels die `GET`-HTTP-Methode zur `/pets/{petId}`-Ressource hinzu und legen Sie die `requestParameters`-Eigenschaft so fest, dass der vom Client bereitgestellte `petId`-Wert an das Backend übergeben wird:

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutMethodCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutMethodCommand({
       restApiId: 'abcd1234',
       resourceId: 'bbb222',
       httpMethod: 'GET',
       authorizationType: 'NONE'
       requestParameters: {
           "method.request.path.petId" : true
       }
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The 'GET /pets/{petId}' method setup failed:\n", err)
   }
   })();
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {
       "apiKeyRequired": false, 
       "httpMethod": "GET", 
       "authorizationType": "NONE",
       "requestParameters": {
          "method.request.path.petId": true
       }
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_method(
           restApiId='abcd1234',
           resourceId='bbb222',
           httpMethod='GET',
           authorizationType='NONE',
           requestParameters={
               "method.request.path.petId": True
           }
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("The 'GET /pets/{petId}' method setup failed: %s", error)
       raise
   attribute=["httpMethod","authorizationType","apiKeyRequired", "requestParameters" ]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {'httpMethod': 'GET', 'authorizationType': 'NONE', 'apiKeyRequired': False, 'requestParameters': {'method.request.path.petId': True}}
   ```

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

   ```
   aws apigateway put-method --rest-api-id abcd1234 \
     --resource-id bbb222 --http-method GET \
     --authorization-type "NONE" \
     --region us-west-2 \
     --request-parameters method.request.path.petId=true
   ```

   Die Ausgabe dieses Befehls ist wie folgt:

   ```
   {
       "httpMethod": "GET", 
       "authorizationType": "NONE", 
       "apiKeyRequired": false, 
       "requestParameters": {
           "method.request.path.petId": true
       }
   }
   ```

------

1. Fügen Sie mithilfe des folgenden Beispiels die 200 OK-Methodenantwort für die `GET /pets`-Methode hinzu:

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutMethodResponseCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutMethodResponseCommand({
       restApiId: 'abcd1234',
       resourceId: 'aaa111',
       httpMethod: 'GET',
       statusCode: '200'
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("Set up the 200 OK response for the 'GET /pets' method failed:\n", err)
   }
   })();
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {
       "statusCode": "200"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_method_response(
           restApiId='abcd1234',
           resourceId='aaa111',
           httpMethod='GET',
           statusCode='200'
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Set up the 200 OK response for the 'GET /pets' method failed %s.", error)
       raise
   attribute=["statusCode"]
   filtered_result ={key:result[key] for key in attribute}
   logger.info(filtered_result)
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {'statusCode': '200'}
   ```

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

   ```
   aws apigateway put-method-response --rest-api-id abcd1234 \ 
     --resource-id aaa111 --http-method GET \
     --status-code 200  --region us-west-2
   ```

   Die Ausgabe dieses Befehls ist wie folgt:

   ```
   {
       "statusCode": "200"
   }
   ```

------

1. Fügen Sie mithilfe des folgenden Beispiels die 200 OK-Methodenantwort für die `GET /pets/{petId}`-Methode hinzu:

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutMethodResponseCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutMethodResponseCommand({
       restApiId: 'abcd1234',
       resourceId: 'bbb222',
       httpMethod: 'GET',
       statusCode: '200'
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("Set up the 200 OK response for the 'GET /pets/{petId}' method failed:\n", err)
   }
   })();
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {
       "statusCode": "200"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_method_response(
           restApiId='abcd1234',
           resourceId='bbb222',
           httpMethod='GET',
           statusCode='200'
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Set up the 200 OK response for the 'GET /pets/{petId}' method failed %s.", error)
       raise
   attribute=["statusCode"]
   filtered_result ={key:result[key] for key in attribute}
   logger.info(filtered_result)
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {'statusCode': '200'}
   ```

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

   ```
   aws apigateway put-method-response --rest-api-id abcd1234 \ 
     --resource-id bbb222 --http-method GET \
     --status-code 200  --region us-west-2
   ```

   Die Ausgabe dieses Befehls ist wie folgt:

   ```
   {
       "statusCode": "200"
   }
   ```

------

1. Konfigurieren Sie anhand des folgenden Beispiels eine Integration für die `GET /pets`-Methode mit einem HTTP-Endpunkt. Der HTTPS-Endpunkt lautet `http://petstore-demo-endpoint.execute-api.com/petstore/pets`.

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutIntegrationCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutIntegrationCommand({
       restApiId: 'abcd1234',
       resourceId: 'aaa111',
       httpMethod: 'GET',
       type: 'HTTP',
       integrationHttpMethod: 'GET',
       uri: 'http://petstore-demo-endpoint.execute-api.com/petstore/pets'
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("Set up the integration of the 'GET /pets' method of the API failed:\n", err)
   }
   })();
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {
       "httpMethod": "GET", 
       "passthroughBehavior": "WHEN_NO_MATCH", 
       "cacheKeyParameters": [], 
       "type": "HTTP", 
       "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets", 
       "cacheNamespace": "ccc333"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_integration(
           restApiId='abcd1234',
           resourceId='aaa111',
           httpMethod='GET',
           type='HTTP',
           integrationHttpMethod='GET',
           uri='http://petstore-demo-endpoint.execute-api.com/petstore/pets'
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Set up the integration of the 'GET /' method of the API failed %s.", error)
       raise
   attribute=["httpMethod","passthroughBehavior","cacheKeyParameters", "type", "uri", "cacheNamespace"]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {'httpMethod': 'GET', 'passthroughBehavior': 'WHEN_NO_MATCH', 'cacheKeyParameters': [], 'type': 'HTTP', 'uri': 'http://petstore-demo-endpoint.execute-api.com/petstore/pets', 'cacheNamespace': 'ccc333'}
   ```

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

   ```
   aws apigateway put-integration --rest-api-id abcd1234 \
     --resource-id aaa111 --http-method GET --type HTTP \
     --integration-http-method GET \
     --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets' \
     --region us-west-2
   ```

   Die Ausgabe dieses Befehls ist wie folgt:

   ```
   {
       "type": "HTTP",
       "httpMethod": "GET",
       "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
       "connectionType": "INTERNET",
       "passthroughBehavior": "WHEN_NO_MATCH",
       "timeoutInMillis": 29000,
       "cacheNamespace": "6sxz2j",
       "cacheKeyParameters": []
   }
   ```

------

1. Konfigurieren Sie anhand des folgenden Beispiels eine Integration für die `GET /pets/{petId}`-Methode mit einem HTTP-Endpunkt. Der HTTPS-Endpunkt lautet `http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}`. Im folgenden Schritt ordnen Sie den Pfadparameter `petId` dem Integrationsendpunkt-Pfadparameter `id` zu.

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutIntegrationCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutIntegrationCommand({
       restApiId: 'abcd1234',
       resourceId: 'bbb222',
       httpMethod: 'GET',
       type: 'HTTP',
       integrationHttpMethod: 'GET',
       uri: 'http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}'
       requestParameters: {
           "integration.request.path.id": "method.request.path.petId"
        }
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("Set up the integration of the 'GET /pets/{petId}' method of the API failed:\n", err)
   }
   })();
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {
       "httpMethod": "GET", 
       "passthroughBehavior": "WHEN_NO_MATCH", 
       "cacheKeyParameters": [], 
       "type": "HTTP", 
       "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}", 
       "cacheNamespace": "ddd444",
       "requestParameters": {
          "integration.request.path.id": "method.request.path.petId"
       }
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_integration(
           restApiId='ieps9b05sf',
           resourceId='t8zeb4',
           httpMethod='GET',
           type='HTTP',
           integrationHttpMethod='GET',
           uri='http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}',
           requestParameters={
               "integration.request.path.id": "method.request.path.petId"
           }
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Set up the integration of the 'GET /pets/{petId}' method of the API failed %s.", error)
       raise
   attribute=["httpMethod","passthroughBehavior","cacheKeyParameters", "type", "uri", "cacheNamespace", "requestParameters"]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {'httpMethod': 'GET', 'passthroughBehavior': 'WHEN_NO_MATCH', 'cacheKeyParameters': [], 'type': 'HTTP', 'uri': 'http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}', 'cacheNamespace': 'ddd444', 'requestParameters': {'integration.request.path.id': 'method.request.path.petId'}}}
   ```

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

   ```
   aws apigateway put-integration --rest-api-id abcd1234 \
     --resource-id bbb222 --http-method GET --type HTTP \
     --integration-http-method GET \
     --uri 'http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}' \ 
     --request-parameters '{"integration.request.path.id":"method.request.path.petId"}' \
     --region us-west-2
   ```

   Die Ausgabe dieses Befehls ist wie folgt:

   ```
   {
       "type": "HTTP",
       "httpMethod": "GET",
       "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}",
       "connectionType": "INTERNET",
       "requestParameters": {
           "integration.request.path.id": "method.request.path.petId"
       },
       "passthroughBehavior": "WHEN_NO_MATCH",
       "timeoutInMillis": 29000,
       "cacheNamespace": "rjkmth",
       "cacheKeyParameters": []
   }
   ```

------

1. Fügen Sie anhand des folgenden Beispiels die Integrationsantwort der `GET /pets`-Integration hinzu:

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutIntegrationResponseCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutIntegrationResponseCommand({
       restApiId: 'abcd1234',
       resourceId: 'aaa111',
       httpMethod: 'GET',
       statusCode: '200',
       selectionPattern: ''
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The 'GET /pets' method integration response setup failed:\n", err)
   }
   })();
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {
       "selectionPattern": "", 
       "statusCode": "200"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_integration_response(
           restApiId='abcd1234',
           resourceId='aaa111',
           httpMethod='GET',
           statusCode='200',
           selectionPattern='',
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Set up the integration response of the 'GET /pets' method of the API failed: %s", error)
       raise
   attribute=["selectionPattern","statusCode"]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {'selectionPattern': "", 'statusCode': '200'}
   ```

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

   ```
   aws apigateway put-integration-response --rest-api-id abcd1234 \
     --resource-id aaa111 --http-method GET \
     --status-code 200 --selection-pattern ""  \
     --region us-west-2
   ```

   Die Ausgabe dieses Befehls ist wie folgt:

   ```
   {
       "statusCode": "200",
       "selectionPattern": "" 
   }
   ```

------

1. Fügen Sie anhand des folgenden Beispiels die Integrationsantwort der `GET /pets/{petId}`-Integration hinzu:

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  PutIntegrationResponseCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new PutIntegrationResponseCommand({
       restApiId: 'abcd1234',
       resourceId: 'bbb222',
       httpMethod: 'GET',
       statusCode: '200',
       selectionPattern: ''
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The 'GET /pets/{petId}' method integration response setup failed:\n", err)
   }
   })();
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {
       "selectionPattern": "", 
       "statusCode": "200"
   }
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.put_integration_response(
           restApiId='abcd1234',
           resourceId='bbb222',
           httpMethod='GET',
           statusCode='200',
           selectionPattern='',
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Set up the integration response of the 'GET /pets/{petId}' method of the API failed: %s", error)
       raise
   attribute=["selectionPattern","statusCode"]
   filtered_result ={key:result[key] for key in attribute}
   print(filtered_result)
   ```

   Ein erfolgreicher Aufruf gibt Folgendes zurück:

   ```
   {'selectionPattern': "", 'statusCode': '200'}
   ```

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

   ```
   aws apigateway put-integration-response --rest-api-id abcd1234 \
     --resource-id bbb222 --http-method GET 
     --status-code 200 --selection-pattern ""  
     --region us-west-2
   ```

   Die Ausgabe dieses Befehls ist wie folgt:

   ```
   {
       "statusCode": "200",
       "selectionPattern": "" 
   }
   ```

------

   Nachdem Sie die Integrationsantwort erstellt haben, kann Ihre API verfügbare Haustiere auf der PetStore Website abfragen und einzelne Haustiere mit einer bestimmten Kennung anzeigen. Sie müssen Ihre fertiggestellte API bereitstellen, damit sie von Ihren Kunden abgerufen werden kann. Wir empfehlen, Ihre API gründlich zu testen, bevor Sie sie bereitstellen.

1. Testen Sie anhand des folgenden Beispiel die `GET /pets`-Methode: 

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  TestInvokeMethodCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new TestInvokeMethodCommand({
       restApiId: 'abcd1234',
       resourceId: 'aaa111',
       httpMethod: 'GET',
       pathWithQueryString: '/',
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The test on 'GET /pets' method failed:\n", err)
   }
   })();
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.test_invoke_method(
           restApiId='abcd1234',
           resourceId='aaa111',
           httpMethod='GET',
           pathWithQueryString='/',
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Test invoke method on 'GET /pets' failed: %s", error)
       raise
   print(result)
   ```

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

   ```
   aws apigateway test-invoke-method --rest-api-id abcd1234 /
     --resource-id aaa111 /
     --http-method GET /
     --path-with-query-string '/'
   ```

------

1. Testen Sie anhand des folgenden Beispiels die `GET /pets/{petId}`-Methode mit einer `petId` von 3:

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  TestInvokeMethodCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new TestInvokeMethodCommand({
       restApiId: 'abcd1234',
       resourceId: 'bbb222',
       httpMethod: 'GET',
       pathWithQueryString: '/pets/3',
   });
   try {
       const results = await apig.send(command)
       console.log(results)
   } catch (err) {
       console.log("The test on 'GET /pets/{petId}' method failed:\n", err)
   }
   })();
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.test_invoke_method(
           restApiId='abcd1234',
           resourceId='bbb222',
           httpMethod='GET',
           pathWithQueryString='/pets/3',
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Test invoke method on 'GET /pets/{petId}' failed: %s", error)
       raise
   print(result)
   ```

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

   ```
   aws apigateway test-invoke-method --rest-api-id abcd1234 /
     --resource-id bbb222 /
     --http-method GET /
     --path-with-query-string '/pets/3'
   ```

------

   Nach einem erfolgreichen Test Ihrer API können Sie diese nun auf einer Stufe bereitstellen.

1. Stellen Sie anhand des folgenden Beispiels Ihre API in einer Stufe mit dem Namen `test` bereit. Nach der Bereitstellung Ihrer API in einer Stufe können API-Aufrufer nun Ihre API aufrufen.

------
#### [ JavaScript v3 ]

   ```
   import {APIGatewayClient,  CreateDeploymentCommand } from "@aws-sdk/client-api-gateway";
   (async function (){
   const apig = new APIGatewayClient({region:"us-east-1"});
   const command = new CreateDeploymentCommand({
       restApiId: 'abcd1234',
       stageName: 'test',
       stageDescription: 'test deployment'
   });
   try {
       const results = await apig.send(command)
       console.log("Deploying API succeeded\n", results)
   } catch (err) {
       console.log("Deploying API failed:\n", err)
   }
   })();
   ```

------
#### [ Python ]

   ```
   import botocore
   import boto3
   import logging
   
   logger = logging.getLogger()
   apig = boto3.client('apigateway')
   
   try:
       result = apig.create_deployment(
           restApiId='ieps9b05sf',
           stageName='test',
           stageDescription='my test stage',
       )
   except botocore.exceptions.ClientError as error:
       logger.exception("Error deploying stage  %s.", error)
       raise
   print('Deploying API succeeded')
   print(result)
   ```

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

   ```
   aws apigateway create-deployment --rest-api-id abcd1234 \ 
     --region us-west-2 \
     --stage-name test \
     --stage-description 'Test stage' \
     --description 'First deployment'
   ```

   Die Ausgabe dieses Befehls ist wie folgt:

   ```
   {
       "id": "ab1c1d",
       "description": "First deployment",
       "createdDate": "2022-12-15T08:44:13-08:00"
   }
   ```

------

   D. h. dass Ihre API jetzt von Kunden aufgerufen werden kann. Sie können diese API testen, indem Sie die `https://abcd1234.execute-api.us-west-2.amazonaws.com/test/pets`-URL in einen Browser eingeben und `abcd1234` durch den Bezeichner Ihrer API ersetzen.

Weitere Beispiele zum Erstellen oder Aktualisieren einer API mithilfe von AWS SDKs oder finden Sie unter [Aktionen für die AWS CLI Verwendung von API Gateway AWS SDKs](https://docs.aws.amazon.com/code-library/latest/ug/api-gateway_code_examples_actions.html).

## Automatische Einrichtung Ihrer API
<a name="api-gateway-create-api-cli-sdk-iac"></a>

Anstatt Ihre API zu erstellen step-by-step, können Sie die Erstellung und Bereinigung von AWS Ressourcen automatisieren, indem Sie OpenAPI oder Terraform verwenden CloudFormation, um Ihre API zu erstellen.

### OpenAPI 3.0-Definition
<a name="api-gateway-create-api-cli-sdk-template-OpenAPI"></a>

Sie können eine OpenAPI-Definition in API Gateway importieren. Weitere Informationen finden Sie unter [Entwickeln APIs Sie REST mit OpenAPI in API Gateway](api-gateway-import-api.md).

```
{
  "openapi" : "3.0.1",
  "info" : {
    "title" : "Simple PetStore (OpenAPI)",
    "description" : "Demo API created using OpenAPI",
    "version" : "2024-05-24T20:39:34Z"
  },
  "servers" : [ {
    "url" : "{basePath}",
    "variables" : {
      "basePath" : {
        "default" : "Prod"
      }
    }
  } ],
  "paths" : {
    "/pets" : {
      "get" : {
        "responses" : {
          "200" : {
            "description" : "200 response",
            "content" : { }
          }
        },
        "x-amazon-apigateway-integration" : {
          "type" : "http",
          "httpMethod" : "GET",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
          "responses" : {
            "default" : {
              "statusCode" : "200"
            }
          },
          "passthroughBehavior" : "when_no_match",
          "timeoutInMillis" : 29000
        }
      }
    },
    "/pets/{petId}" : {
      "get" : {
        "parameters" : [ {
          "name" : "petId",
          "in" : "path",
          "required" : true,
          "schema" : {
            "type" : "string"
          }
        } ],
        "responses" : {
          "200" : {
            "description" : "200 response",
            "content" : { }
          }
        },
        "x-amazon-apigateway-integration" : {
          "type" : "http",
          "httpMethod" : "GET",
          "uri" : "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}",
          "responses" : {
            "default" : {
              "statusCode" : "200"
            }
          },
          "requestParameters" : {
            "integration.request.path.id" : "method.request.path.petId"
          },
          "passthroughBehavior" : "when_no_match",
          "timeoutInMillis" : 29000
        }
      }
    }
  },
  "components" : { }
}
```

### AWS CloudFormation Vorlage
<a name="api-gateway-create-api-cli-sdk-template-CloudFormation"></a>

Informationen zum Bereitstellen Ihrer CloudFormation Vorlage finden Sie unter [Einen Stack auf der AWS CloudFormation Konsole](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-create-stack.html) erstellen.

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  Api:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      Name: Simple PetStore (AWS CloudFormation)
  PetsResource:
    Type: 'AWS::ApiGateway::Resource'
    Properties:
      RestApiId: !Ref Api
      ParentId: !GetAtt Api.RootResourceId
      PathPart: 'pets'
  PetIdResource:
    Type: 'AWS::ApiGateway::Resource'
    Properties:
      RestApiId: !Ref Api
      ParentId: !Ref PetsResource
      PathPart: '{petId}'
  PetsMethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref PetsResource
      HttpMethod: GET
      AuthorizationType: NONE
      Integration:
        Type: HTTP
        IntegrationHttpMethod: GET
        Uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets/
        IntegrationResponses:
          - StatusCode: '200'
      MethodResponses:
        - StatusCode: '200'
  PetIdMethodGet:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      RestApiId: !Ref Api
      ResourceId: !Ref PetIdResource
      HttpMethod: GET
      AuthorizationType: NONE
      RequestParameters: 
        method.request.path.petId: true
      Integration:
        Type: HTTP
        IntegrationHttpMethod: GET
        Uri: http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}
        RequestParameters:
          integration.request.path.id: method.request.path.petId
        IntegrationResponses:
          - StatusCode: '200'
      MethodResponses:
        - StatusCode: '200'
  ApiDeployment:
    Type: 'AWS::ApiGateway::Deployment'
    DependsOn:
      - PetsMethodGet
    Properties:
      RestApiId: !Ref Api
      StageName: Prod
Outputs:
  ApiRootUrl:
    Description: Root Url of the API
    Value: !Sub 'https://${Api}.execute-api.${AWS::Region}.amazonaws.com/Prod'
```

### Terraform-Konfiguration
<a name="api-gateway-create-api-cli-sdk-template-terraform"></a>

Weitere Informationen zu Terraform finden Sie unter [Terraform](https://developer.hashicorp.com/terraform/intro).

```
provider "aws" {
  region = "us-east-1" # Update with your desired region
}
resource "aws_api_gateway_rest_api" "Api" {
  name        = "Simple PetStore (Terraform)"
  description = "Demo API created using Terraform"
}
resource "aws_api_gateway_resource" "petsResource"{
    rest_api_id = aws_api_gateway_rest_api.Api.id
    parent_id = aws_api_gateway_rest_api.Api.root_resource_id
    path_part = "pets"
}
resource "aws_api_gateway_resource" "petIdResource"{
    rest_api_id = aws_api_gateway_rest_api.Api.id
    parent_id = aws_api_gateway_resource.petsResource.id
    path_part = "{petId}"
}
resource "aws_api_gateway_method" "petsMethodGet" {
  rest_api_id   = aws_api_gateway_rest_api.Api.id
  resource_id   = aws_api_gateway_resource.petsResource.id
  http_method   = "GET"
  authorization = "NONE"
}


resource "aws_api_gateway_method_response" "petsMethodResponseGet" {
    rest_api_id = aws_api_gateway_rest_api.Api.id 
    resource_id = aws_api_gateway_resource.petsResource.id
    http_method = aws_api_gateway_method.petsMethodGet.http_method 
    status_code ="200"
}

resource "aws_api_gateway_integration" "petsIntegration" {
  rest_api_id = aws_api_gateway_rest_api.Api.id
  resource_id = aws_api_gateway_resource.petsResource.id
  http_method = aws_api_gateway_method.petsMethodGet.http_method
  type        = "HTTP"
  
  uri                     = "http://petstore-demo-endpoint.execute-api.com/petstore/pets"
  integration_http_method = "GET"
  depends_on              = [aws_api_gateway_method.petsMethodGet]
}

resource "aws_api_gateway_integration_response" "petsIntegrationResponse" {
    rest_api_id = aws_api_gateway_rest_api.Api.id
    resource_id = aws_api_gateway_resource.petsResource.id
    http_method = aws_api_gateway_method.petsMethodGet.http_method
    status_code = aws_api_gateway_method_response.petsMethodResponseGet.status_code
}

resource "aws_api_gateway_method" "petIdMethodGet" {
    rest_api_id   = aws_api_gateway_rest_api.Api.id
    resource_id   = aws_api_gateway_resource.petIdResource.id
    http_method   = "GET"
    authorization = "NONE"
    request_parameters = {"method.request.path.petId" = true}
}

resource "aws_api_gateway_method_response" "petIdMethodResponseGet" {
    rest_api_id = aws_api_gateway_rest_api.Api.id 
    resource_id = aws_api_gateway_resource.petIdResource.id
    http_method = aws_api_gateway_method.petIdMethodGet.http_method 
    status_code ="200"
}


resource "aws_api_gateway_integration" "petIdIntegration" {
    rest_api_id = aws_api_gateway_rest_api.Api.id
    resource_id = aws_api_gateway_resource.petIdResource.id
    http_method = aws_api_gateway_method.petIdMethodGet.http_method
    type        = "HTTP"
    uri                     = "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{id}"
    integration_http_method = "GET"
    request_parameters = {"integration.request.path.id" = "method.request.path.petId"}
    depends_on              = [aws_api_gateway_method.petIdMethodGet]
}

resource "aws_api_gateway_integration_response" "petIdIntegrationResponse" {
    rest_api_id = aws_api_gateway_rest_api.Api.id
    resource_id = aws_api_gateway_resource.petIdResource.id
    http_method = aws_api_gateway_method.petIdMethodGet.http_method
    status_code = aws_api_gateway_method_response.petIdMethodResponseGet.status_code
}


resource "aws_api_gateway_deployment" "Deployment" {
  rest_api_id = aws_api_gateway_rest_api.Api.id
  depends_on  = [aws_api_gateway_integration.petsIntegration,aws_api_gateway_integration.petIdIntegration ]
}
resource "aws_api_gateway_stage" "Stage" {
  stage_name    = "Prod"
  rest_api_id   = aws_api_gateway_rest_api.Api.id
  deployment_id = aws_api_gateway_deployment.Deployment.id
}
```

# Tutorial: Erstellen einer privaten REST-API
<a name="private-api-tutorial"></a>

In diesem Tutorial erstellen Sie eine private REST-API. Clients können nur von Ihrer Amazon VPC aus auf die API zugreifen. Die API ist vom öffentlichen Internet isoliert, was eine übliche Sicherheitsanforderung ist.

Dieses Tutorial nimmt ungefähr 30 Minuten in Anspruch. Zunächst verwenden Sie eine CloudFormation Vorlage, um eine Amazon VPC, einen VPC-Endpunkt und eine AWS Lambda Funktion zu erstellen und eine Amazon EC2 EC2-Instance zu starten, mit der Sie Ihre API testen werden. Als Nächstes verwenden Sie die, AWS-Managementkonsole um eine private API zu erstellen und eine Ressourcenrichtlinie anzuhängen, die den Zugriff nur von Ihrem VPC-Endpunkt aus erlaubt. Zuletzt testen Sie Ihre API. 

![\[Übersicht der privaten API, die Sie in diesem Tutorial erstellen.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/private-api-tutorial-diagram.png)


Um dieses Tutorial abzuschließen, benötigen Sie ein AWS Konto und einen AWS Identity and Access Management Benutzer mit Konsolenzugriff. Weitere Informationen finden Sie unter [Einrichten der API Gateway](setting-up.md).

In diesem Tutorial wird AWS-Managementkonsole verwendet. Eine CloudFormation Vorlage, die diese API und alle zugehörigen Ressourcen erstellt, finden Sie unter [template.yaml](samples/private-api-full-template.zip).

**Topics**
+ [Schritt 1: Erstellen von Abhängigkeiten](#private-api-tutorial-create-dependencies)
+ [Schritt 2: Erstellen einer privaten API](#private-api-tutorial-create-api)
+ [Schritt 3: Erstellen Sie eine Methode und Integration](#private-api-tutorial-create-method)
+ [Schritt 4: Anhängen einer Ressourcenrichtlinie](#private-api-tutorial-attach-resource-policy)
+ [Schritt 5: Bereitstellen Ihrer API](#private-api-tutorial-deploy-api)
+ [Schritt 6: Stellen Sie sicher, dass Ihre API nicht öffentlich zugänglich ist](#private-api-tutorial-test-private-api)
+ [Schritt 7: Verbinden Sie sich mit einer Instance in Ihrer VPC und rufen Sie Ihre API auf](#private-api-tutorial-connect-to-instance)
+ [Schritt 8: Bereinigen](#private-api-tutorial-cleanup)
+ [Nächste Schritte: Automatisieren Sie mit CloudFormation](#private-api-tutorial-next-steps)

## Schritt 1: Erstellen von Abhängigkeiten
<a name="private-api-tutorial-create-dependencies"></a>

[Laden Sie diese Vorlage herunter und entpacken Sie sie. CloudFormation](samples/private-api-starter-template.zip) Sie verwenden die Vorlage, um alle Abhängigkeiten für Ihre private API zu erstellen, einschließlich einer Amazon VPC, eines VPC-Endpunkts und einer Lambda-Funktion, die als Backend Ihrer API dient. Sie erstellen die private API später.

**Um einen Stapel zu erstellen CloudFormation**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie **Stack erstellen** und dann **Mit neuen Ressourcen (Standard)** aus.

1. Wählen Sie unter **Vorlage angeben** die Option **Vorlagendatei hochladen** aus.

1. Wählen Sie die Vorlage aus, die Sie heruntergeladen haben.

1. Wählen Sie **Weiter** aus. 

1. Geben Sie für **Stack-Name** die Zeichenfolge **private-api-tutorial** ein und klicken Sie auf **Weiter**.

1. Wählen Sie in **Stack-Optionen konfigurieren** die Option **Weiter** aus.

1. Bestätigen Sie bei **Capabilities**, dass IAM-Ressourcen in Ihrem Konto erstellt werden CloudFormation können.

1. Wählen Sie **Weiter** und anschließend **Absenden** aus.

CloudFormation stellt die Abhängigkeiten für Ihre API bereit, was einige Minuten dauern kann. **Wenn der Status Ihres CloudFormation Stacks **CREATE\$1COMPLETE** lautet, wählen Sie Outputs.** Notieren Sie sich Ihre VPC-Endpunkt-ID. Sie benötigen sie für spätere Schritte in diesem Tutorial. 

## Schritt 2: Erstellen einer privaten API
<a name="private-api-tutorial-create-api"></a>

Sie erstellen eine private API, um nur Clients in Ihrer VPC den Zugriff darauf zu ermöglichen.

**Erstellen einer privaten API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie **API erstellen** und dann für **Rest-API** die Option **Erstellen** aus.

1. Geben Sie unter **API name (API-Name)** **private-api-tutorial** ein.

1. Wählen Sie für **API endpoint type** (API-Endpunkttyp) die Option **Private** (Privat) aus.

1. Geben Sie für **VPC-Endpunkt IDs** die VPC-Endpunkt-ID aus den **Ausgaben** Ihres CloudFormation Stacks ein.

1. Wählen Sie bei **IP address type** (IP-Adresstyp) **Dualstack**.

1. Wählen Sie **Create API** (API erstellen) aus.

## Schritt 3: Erstellen Sie eine Methode und Integration
<a name="private-api-tutorial-create-method"></a>

Sie erstellen eine `GET` Methode und eine Lambda-Integration, um `GET`-Anfragen an Ihre API zu bearbeiten. Wenn ein Client Ihre API aufruft, sendet API Gateway die Anfrage an die Lambda-Funktion, die Sie in Schritt 1 erstellt haben und gibt dann eine Antwort an den Client zurück.

**So erstellen Sie eine Methode und Integration**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Wählen Sie **Methode erstellen** aus.

1. Für **Methodentyp** wählen Sie `GET` aus.

1. Wählen Sie für den **Integration type** (Integrationstyp) die Option **Lambda function** (Lambda-Funktion) aus.

1. Schalten Sie die **Lambda-Proxy-Integration** ein. Mit einer Lambda-Proxy-Integration sendet API Gateway ein Ereignis mit einer definierten Struktur an Lambda und transformiert die Antwort von Ihrer Lambda-Funktion in eine HTTP-Antwort.

1. Wählen Sie für die **Lambda-Funktion** die Funktion aus, die Sie mit der CloudFormation Vorlage in Schritt 1 erstellt haben. Der Name der Funktion beginnt mit **private-api-tutorial**.

1. Wählen Sie **Methode erstellen** aus.

## Schritt 4: Anhängen einer Ressourcenrichtlinie
<a name="private-api-tutorial-attach-resource-policy"></a>

Sie hängen Ihrer API eine [Ressourcenrichtlinie](apigateway-resource-policies.md) an, die es Clients ermöglicht, Ihre API nur über Ihren VPC-Endpunkt aufzurufen. Um den Zugriff auf Ihre API weiter einzuschränken, können Sie auch eine [VPC-Endpunktrichtlinie](apigateway-vpc-endpoint-policies.md) für Ihren VPC-Endpunkt konfigurieren, aber das ist für dieses Tutorial nicht erforderlich.

**So hängen Sie eine Ressourcenrichtlinie an**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Wählen Sie **Ressourcenrichtlinie** aus und klicken Sie dann auf **Richtlinie erstellen**.

1. Geben Sie die folgende Richtlinie ein: *vpceID*Ersetzen Sie es durch Ihre VPC-Endpunkt-ID aus den **Ausgaben** Ihres CloudFormation Stacks.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": "execute-api:/*",
               "Condition": {
                   "StringNotEquals": {
                       "aws:sourceVpce": "vpce-abcd1234"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Principal": "*",
               "Action": "execute-api:Invoke",
               "Resource": "execute-api:/*"
           }
       ]
   }
   ```

------

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

## Schritt 5: Bereitstellen Ihrer API
<a name="private-api-tutorial-deploy-api"></a>

Als Nächstes stellen Sie Ihre API bereit, um sie Clients in Ihrer Amazon VPC zur Verfügung zu stellen.

**So stellen Sie eine API bereit**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Klicken Sie auf **Deploy API**.

1. Wählen Sie für **Stufe** die Option **Neue Stufe** aus.

1. Geben Sie für **Stage name (Stufenname)** **test** ein.

1. (Optional) Geben Sie unter **Description (Beschreibung)** eine Beschreibung ein.

1. Wählen Sie **Deploy (Bereitstellen)** aus.

Jetzt sind Sie bereit, Ihre API zu testen.

## Schritt 6: Stellen Sie sicher, dass Ihre API nicht öffentlich zugänglich ist
<a name="private-api-tutorial-test-private-api"></a>

Verwenden Sie, `curl` um zu überprüfen, ob Sie Ihre API nicht außerhalb Ihrer Amazon VPC aufrufen können.

**So testen Sie Ihre API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Wählen Sie im Hauptnavigationsbereich **Stufen** aus und klicken Sie dann auf die Stufe **Test**.

1. Wählen Sie unter **Stufendetails** das Kopiersymbol aus, um die Aufruf-URL Ihrer API zu kopieren. Die URL sieht folgendermaßen aus `https://abcdef123.execute-api.us-west-2.amazonaws.com/test`. Für den VPC-Endpunkt, den Sie in Schritt 1 erstellt haben, ist privates DNS aktiviert, sodass Sie die bereitgestellte URL zum Aufrufen Ihrer API verwenden können.

1. Verwenden Sie curl, um zu versuchen, Ihre API von außerhalb Ihrer VPC aufzurufen.

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

   Curl zeigt an, dass der Endpunkt Ihrer API nicht aufgelöst werden kann. Wenn Sie eine andere Antwort erhalten, gehen Sie zurück zu Schritt 2 und stellen Sie sicher, dass Sie **Privat** für den Endpunkttyp Ihrer API auswählen.

   ```
   curl: (6) Could not resolve host: abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

Als Nächstes stellen Sie eine Verbindung zu einer Amazon-EC2-Instance in Ihrer VPC her, um Ihre API aufzurufen.

## Schritt 7: Verbinden Sie sich mit einer Instance in Ihrer VPC und rufen Sie Ihre API auf
<a name="private-api-tutorial-connect-to-instance"></a>

Als Nächstes testen Sie Ihre API aus Ihrer Amazon VPC heraus. Um auf Ihre private API zuzugreifen, stellen Sie eine Verbindung zu einer Amazon-EC2-Instance in Ihrer VPC her und verwenden dann curl, um Ihre API aufzurufen. Sie verwenden Systems-Manager Session-Manager, um eine Verbindung mit Ihrer Instance im Browser herzustellen.

**So testen Sie Ihre API**

1. Öffnen Sie die Amazon-EC2-Konsole unter [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/).

1. Wählen Sie **Instances**.

1. Wählen Sie den Instanznamen aus **private-api-tutorial**, den Sie mit der CloudFormation Vorlage in Schritt 1 erstellt haben.

1. Wählen Sie **Verbinden** und wählen Sie dann **Session-Manager**.

1. Wählen Sie **Verbinden** , um eine browserbasierte Sitzung für Ihre Instance zu starten.

1. Verwenden Sie in Ihrer Session-Manager-Sitzung curl, um Ihre API aufzurufen. Sie können Ihre API aufrufen, da Sie eine Instance in Ihrer Amazon VPC verwenden.

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/test
   ```

   Stellen Sie sicher, dass Sie die Antwort erhalte `Hello from Lambda!`.

![\[Sie verwenden Session-Manager, um Ihre API aus Ihrer Amazon VPC heraus aufzurufen.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/private-api-tutorial-invoke.png)


Sie haben erfolgreich eine API erstellt, auf die nur von Ihrer Amazon VPC aus zugegriffen werden kann und dann überprüft, dass sie funktioniert.

## Schritt 8: Bereinigen
<a name="private-api-tutorial-cleanup"></a>

Um unnötige Kosten zu vermeiden, löschen Sie die Ressourcen, die Sie im Rahmen dieses Tutorials erstellt haben. Mit den folgenden Schritten werden Ihre REST-API und Ihr CloudFormation Stack gelöscht.

**So löschen Sie eine REST-API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie auf der **APIs**Seite eine API aus. Wählen Sie **API-Aktionen** aus, klicken Sie auf **API löschen** und bestätigen Sie anschließend Ihre Auswahl.

**Um einen CloudFormation Stapel zu löschen**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie Ihren CloudFormation Stack aus.

1. Wählen Sie **Löschen** und bestätigen Sie dann Ihre Auswahl.

## Nächste Schritte: Automatisieren Sie mit CloudFormation
<a name="private-api-tutorial-next-steps"></a>

Sie können die Erstellung und Bereinigung aller an diesem Tutorial beteiligten AWS Ressourcen automatisieren. Eine vollständige CloudFormation -Beispielvorlage finden Sie unter [template.yaml](samples/private-api-full-template.zip).

# Amazon API Gateway-HTTP-API-Tutorials
<a name="api-gateway-http-tutorials"></a>

Die folgenden Tutorials bieten praktische Übungen, die Ihnen beim Kennenlernen von API Gateway HTTP APIs helfen.

**Topics**
+ [Tutorial: Erstellen einer CRUD-HTTP-API mit Lambda und DynamoDB](http-api-dynamo-db.md)
+ [Tutorial: Erstellen einer HTTP-API mit privater Integration für einen Amazon-ECS-Service](http-api-private-integration.md)

# Tutorial: Erstellen einer CRUD-HTTP-API mit Lambda und DynamoDB
<a name="http-api-dynamo-db"></a>

In diesem Tutorial erstellen Sie eine serverlose API, die Elemente aus einer DynamoDB-Tabelle erstellt, liest, aktualisiert und löscht. DynamoDB ist ein vollständig verwalteter NoSQL-Datenbankservice, der schnelle und vorhersehbare Leistung nahtlos skalierbar bereitstellt. Dieses Tutorial dauert ungefähr 30 Minuten, und Sie können es im Rahmen des [kostenlosen Kontingents von AWS](https://aws.amazon.com/free/) durchgehen.

Zunächst erstellen Sie mit der DynamoDB-Konsole eine [DynamoDB-Tabelle](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html). Dann erstellen Sie mit der AWS Lambda Konsole eine [Lambda-Funktion](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html). Als Nächstes erstellen Sie eine HTTP-API mit der API-Gateway-Konsole. Zuletzt testen Sie Ihre API.

Wenn Sie Ihre HTTP-API aufrufen, leitet API Gateway die Anfrage an Ihre Lambda-Funktion weiter. Die Lambda-Funktion interagiert mit DynamoDB und gibt eine Antwort an API Gateway zurück. API Gateway gibt dann eine Antwort an Sie zurück.

![\[Übersicht der HTTP-API, die Sie in diesem Tutorial erstellen.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/ddb-crud.png)


Um diese Übung abzuschließen, benötigen Sie ein AWS Konto und einen AWS Identity and Access Management Benutzer mit Konsolenzugriff. Weitere Informationen finden Sie unter [Einrichten der API Gateway](setting-up.md).

In diesem Tutorial wird AWS-Managementkonsole verwendet. Eine AWS SAM Vorlage, mit der diese API und alle zugehörigen Ressourcen erstellt werden, finden Sie unter [samples/http-dynamo-tutorial.zip](samples/http-dynamo-tutorial.zip).

**Topics**
+ [Schritt 1: Erstellen einer DynamoDB-Tabelle](#http-api-dynamo-db-create-table)
+ [Schritt 2: Erstellen einer Lambda-Funktion](#http-api-dynamo-db-create-function)
+ [Schritt 3: HTTP-API erstellen](#http-api-dynamo-db-create-api)
+ [Schritt 4: Routen erstellen](#http-api-dynamo-db-create-routes)
+ [Schritt 5: Eine Integration erstellen](#http-api-dynamo-db-create-integration)
+ [Schritt 6: Ihre Integration an Routen anfügen](#http-api-dynamo-db-attach-integrations)
+ [Schritt 7: Ihre API testen](#http-api-dynamo-db-invoke-api)
+ [Schritt 8: Bereinigen](#http-api-dynamo-db-cleanup)
+ [Nächste Schritte: Automatisieren Sie mit AWS SAM oder CloudFormation](#http-api-dynamo-db-next-steps)

## Schritt 1: Erstellen einer DynamoDB-Tabelle
<a name="http-api-dynamo-db-create-table"></a>

Sie verwenden eine [DynamoDB-Tabelle](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html), um Daten für Ihre API zu speichern. 

Jedes Element hat eine eindeutige ID, die wir als [Partitionsschlüssel](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey) für die Tabelle verwenden.

**So erstellen Sie eine DynamoDB-Tabelle**

1. Öffnen Sie die DynamoDB-Konsole unter. [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)

1. Wählen Sie **Create table** aus.

1. Geben Sie für **Table name** (Tabellenname) **http-crud-tutorial-items** ein.

1. Geben Sie unter **Partitionsschlüssel** den Wert **id** ein.

1. Wählen Sie **Create table** (Tabelle erstellen) aus.

## Schritt 2: Erstellen einer Lambda-Funktion
<a name="http-api-dynamo-db-create-function"></a>

Sie erstellen eine [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)-Funktion für das Backend Ihrer API. Diese Lambda-Funktion erstellt, liest, aktualisiert und löscht Elemente aus DynamoDB. Die Funktion verwendet [ Ereignisse von API Gateway](http-api-develop-integrations-lambda.md#http-api-develop-integrations-lambda.proxy-format), um zu bestimmen, wie mit DynamoDB interagiert wird. Der Einfachheit halber verwendet dieses Tutorial eine einzige Lambda-Funktion. Als Best Practice sollten Sie separate Funktionen für jede Route erstellen. Weitere Informationen finden Sie unter [Der Lambda-Monolith](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/monolith).

**So erstellen Sie eine Lambda-Funktion**

1. Melden Sie sich bei der Lambda-Konsole unter [https://console.aws.amazon.com/lambda](https://console.aws.amazon.com/lambda) an.

1. Wählen Sie **Create function (Funktion erstellen)**.

1. Geben Sie für **Function name (Funktionsname)** **http-crud-tutorial-function** ein.

1. Wählen Sie für **Laufzeit** die neueste unterstützte **Node.js**- oder **Python**-Laufzeit aus.

1. Wählen Sie unter **Berechtigungen** die Option **Standard-Ausführungsrolle ändern** aus.

1. Wählen Sie **Neue Rolle aus Richtlinienvorlagen erstellen aus AWS **.

1. Geben Sie für **Role name (Rollenname)** den Namen **http-crud-tutorial-role** ein.

1. Wählen Sie für **Policy templates (Richtlinienvorlagen)** **Simple microservice permissions** aus. Diese Richtlinie gewährt der Lambda-Funktion die Berechtigung, mit DynamoDB zu interagieren.
**Anmerkung**  
Dieses Tutorial verwendet der Einfachheit halber eine verwaltete Richtlinie. Als Best Practice sollten Sie Ihre eigene IAM-Richtlinie erstellen, um die erforderlichen Mindestberechtigungen zu gewähren.

1. Wählen Sie **Create function (Funktion erstellen)**.

1. Öffnen Sie die Lambda-Funktion im Code-Editor der Konsole und ersetzen Sie den Inhalt durch den folgenden Code. Wählen Sie **Deploy (Bereitstellen)** aus, um Ihre Funktion zu aktualisieren.

------
#### [ Node.js ]

```
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
import {
  DynamoDBDocumentClient,
  ScanCommand,
  PutCommand,
  GetCommand,
  DeleteCommand,
} from "@aws-sdk/lib-dynamodb";

const client = new DynamoDBClient({});

const dynamo = DynamoDBDocumentClient.from(client);

const tableName = "http-crud-tutorial-items";

export const handler = async (event, context) => {
  let body;
  let statusCode = 200;
  const headers = {
    "Content-Type": "application/json",
  };

  try {
    switch (event.routeKey) {
      case "DELETE /items/{id}":
        await dynamo.send(
          new DeleteCommand({
            TableName: tableName,
            Key: {
              id: event.pathParameters.id,
            },
          })
        );
        body = `Deleted item ${event.pathParameters.id}`;
        break;
      case "GET /items/{id}":
        body = await dynamo.send(
          new GetCommand({
            TableName: tableName,
            Key: {
              id: event.pathParameters.id,
            },
          })
        );
        body = body.Item;
        break;
      case "GET /items":
        body = await dynamo.send(
          new ScanCommand({ TableName: tableName })
        );
        body = body.Items;
        break;
      case "PUT /items":
        let requestJSON = JSON.parse(event.body);
        await dynamo.send(
          new PutCommand({
            TableName: tableName,
            Item: {
              id: requestJSON.id,
              price: requestJSON.price,
              name: requestJSON.name,
            },
          })
        );
        body = `Put item ${requestJSON.id}`;
        break;
      default:
        throw new Error(`Unsupported route: "${event.routeKey}"`);
    }
  } catch (err) {
    statusCode = 400;
    body = err.message;
  } finally {
    body = JSON.stringify(body);
  }

  return {
    statusCode,
    body,
    headers,
  };
};
```

------
#### [ Python ]

```
import json
import boto3
from decimal import Decimal

client = boto3.client('dynamodb')
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table('http-crud-tutorial-items')
tableName = 'http-crud-tutorial-items'


def lambda_handler(event, context):
    print(event)
    body = {}
    statusCode = 200
    headers = {
        "Content-Type": "application/json"
    }

    try:
        if event['routeKey'] == "DELETE /items/{id}":
            table.delete_item(
                Key={'id': event['pathParameters']['id']})
            body = 'Deleted item ' + event['pathParameters']['id']
        elif event['routeKey'] == "GET /items/{id}":
            body = table.get_item(
                Key={'id': event['pathParameters']['id']})
            body = body["Item"]
            responseBody = [
                {'price': float(body['price']), 'id': body['id'], 'name': body['name']}]
            body = responseBody
        elif event['routeKey'] == "GET /items":
            body = table.scan()
            body = body["Items"]
            print("ITEMS----")
            print(body)
            responseBody = []
            for items in body:
                responseItems = [
                    {'price': float(items['price']), 'id': items['id'], 'name': items['name']}]
                responseBody.append(responseItems)
            body = responseBody
        elif event['routeKey'] == "PUT /items":
            requestJSON = json.loads(event['body'])
            table.put_item(
                Item={
                    'id': requestJSON['id'],
                    'price': Decimal(str(requestJSON['price'])),
                    'name': requestJSON['name']
                })
            body = 'Put item ' + requestJSON['id']
    except KeyError:
        statusCode = 400
        body = 'Unsupported route: ' + event['routeKey']
    body = json.dumps(body)
    res = {
        "statusCode": statusCode,
        "headers": {
            "Content-Type": "application/json"
        },
        "body": body
    }
    return res
```

------

## Schritt 3: HTTP-API erstellen
<a name="http-api-dynamo-db-create-api"></a>

Die HTTP-API bietet einen HTTP-Endpunkt für Ihre Lambda-Funktion. In diesem Schritt erstellen Sie eine leere API. In den folgenden Schritten konfigurieren Sie Routen und Integrationen, um Ihre API und Ihre Lambda-Funktion zu verbinden.



**So erstellen Sie eine HTTP-API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie **Create API (API erstellen)** und dann für **HTTP API** die Option **Build (Erstellen)** aus.

1. Geben Sie unter **API name (API-Name)** **http-crud-tutorial-api** ein.

1. Wählen Sie als **IP-Adresstyp** die Option. **IPv4**

1. Wählen Sie **Next**.

1. Wählen Sie für **Configure routes (Routen konfigurieren)** die Option **Next (Weiter)** aus, um die Routenerstellung zu überspringen. Sie werden Routen später erstellen.

1. Überprüfen Sie die Phase, die API Gateway für Sie erstellt, und wählen Sie dann **Next (Weiter)** aus.

1. Wählen Sie **Create** aus.

## Schritt 4: Routen erstellen
<a name="http-api-dynamo-db-create-routes"></a>

Routen sind eine Möglichkeit, eingehende API-Anforderungen an Backend-Ressourcen zu senden. Routen bestehen aus zwei Teilen: einer HTTP-Methode und einem Ressourcenpfad, zum Beispie, `GET /items`. Für diese Beispiel-API erstellen wir vier Routen:
+ `GET /items/{id}`
+ `GET /items`
+ `PUT /items`
+ `DELETE /items/{id}`

**So werden Routen erstellt**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Wählen Sie **Routes (Routen)** aus.

1. Wählen Sie **Create** aus.

1. Wählen Sie für **Methode** **GET** aus.

1. Für den Pfad geben Sie ei **/items/\$1id\$1**. `{id}` am Ende des Pfads ist ein Pfadparameter, den API Gateway vom Anforderungspfad abruft, wenn ein Client eine Anforderung stellt.

1. Wählen Sie **Create** aus.

1. Wiederholen Sie die Schritte 4-7 für `GET /items`, `DELETE /items/{id}` und `PUT /items`.

![\[Ihre API hat Routen für GET /items, GET /items/{id}, DELETE /items/{id} und PUT /items.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/ddb-create-routes.png)


## Schritt 5: Eine Integration erstellen
<a name="http-api-dynamo-db-create-integration"></a>

Sie erstellen eine Integration, um eine Route mit Backend-Ressourcen zu verbinden. Für diese Beispiel-API erstellen Sie eine Lambda-Integration, die Sie für alle Routen verwenden.

**So wird eine Integration erstellt**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Wähle Sie **Integrations (Integrationen)** aus.

1. Wählen Sie **Manage integrations (Integrationen verwalten)** und dann **Create (Erstellen)** aus.

1. Überspringen Sie **Attach this integration to a route (Diese Integration an eine Route anfügen)**. Dies werden Sie in einem späteren Schritt abschließen.

1. Für **Integration type (Integrationstyp)** wählen Sie **Lambda Function (Lambda-Funktion)** aus.

1. Geben Sie für die **Lambda function (Lambda-Funktion)** **http-crud-tutorial-function** ein.

1. Wählen Sie **Create** aus.

## Schritt 6: Ihre Integration an Routen anfügen
<a name="http-api-dynamo-db-attach-integrations"></a>

Für diese Beispiel-API verwenden Sie dieselbe Lambda-Integration für alle Routen. Nachdem Sie die Integration allen Routen der API angefügt haben, wird Ihre Lambda-Funktion aufgerufen, wenn ein Client eine Ihrer Routen aufruft.



**So werden Integrationen an Routen angefügt**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Wähle Sie **Integrations (Integrationen)** aus.

1. Wählen Sie eine Route aus.

1. Wählen Sie unter **Choose an existing integration (Eine vorhandene Integration auswählen) ** **http-crud-tutorial-function** aus.

1. Wählen Sie **Attach integration (Integration anhängen)** aus.

1. Wiederholen Sie die Schritte 4 bis 6 für alle Routen. 

Alle Routen zeigen, dass eine AWS Lambda Integration angehängt ist.

![\[Die Konsole wird AWS Lambda auf allen Routen angezeigt, um darauf hinzuweisen, dass Ihre Integration angehängt ist.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/ddb-attach-integrations.png)


Jetzt, da Sie eine HTTP-API mit Routen und Integrationen haben, können Sie Ihre API testen.

## Schritt 7: Ihre API testen
<a name="http-api-dynamo-db-invoke-api"></a>

Um sicherzustellen, dass Ihre API funktioniert, verwenden Sie [curl](https://curl.se).

**So wird die URL zum Aufrufen Ihrer API abgerufen**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Notieren Sie sich die Aufruf-URL Ihrer API. Sie wird auf der Seite **Details** unter **Invoke URL (URL aufrufen)** angezeigt.  
![\[Nachdem Sie Ihre API erstellt haben, zeigt die Konsole die Aufruf-URL Ihrer API an.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/ddb-invoke-url.png)

1. Kopieren Sie die Aufruf-URL Ihrer API. 

   Die vollständige URL sieht folgendermaßen aus: `https://abcdef123.execute-api.us-west-2.amazonaws.com`. 

**Erstellen oder Aktualisieren eines Elements**
+ Verwenden Sie den folgenden Befehl, um ein Element zu erstellen oder zu aktualisieren. Der Befehl enthält einen Anfragetext mit der ID, dem Preis und dem Namen des Elements.

  ```
  curl -X "PUT" -H "Content-Type: application/json" -d "{\"id\": \"123\", \"price\": 12345, \"name\": \"myitem\"}" https://abcdef123.execute-api.us-west-2.amazonaws.com/items
  ```

**Abrufen aller Elemente**
+ Verwenden Sie den folgenden Befehl, um alle Elemente aufzulisten.

  ```
  curl https://abcdef123.execute-api.us-west-2.amazonaws.com/items
  ```

**Abrufen eines Elements**
+ Verwenden Sie den folgenden Befehl, um ein Element anhand seiner ID zu erhalten.

  ```
  curl https://abcdef123.execute-api.us-west-2.amazonaws.com/items/123
  ```

**So löschen Sie einen Artikel**

1. Verwenden Sie den folgenden Befehl, um ein Element zu löschen.

   ```
   curl -X "DELETE" https://abcdef123.execute-api.us-west-2.amazonaws.com/items/123
   ```

1. Rufen Sie alle Elemente ab, um zu überprüfen, ob das Element gelöscht wurde.

   ```
   curl https://abcdef123.execute-api.us-west-2.amazonaws.com/items
   ```

## Schritt 8: Bereinigen
<a name="http-api-dynamo-db-cleanup"></a>

Um unnötige Kosten zu vermeiden, löschen Sie die Ressourcen, die Sie im Rahmen dieser Übung „Erste Schritte“ erstellt haben. In den folgenden Schritten werden Ihre HTTP-API, Ihre Lambda-Funktion und die zugehörigen Ressourcen gelöscht.

**So löschen Sie eine DynamoDB-Tabelle**

1. Öffnen Sie die DynamoDB-Konsole unter. [https://console.aws.amazon.com/dynamodb/](https://console.aws.amazon.com/dynamodb/)

1. Wählen Sie Ihre Tabelle aus.

1. Wählen Sie **Delete Table (Tabelle löschen)**.

1. Bestätigen Sie Ihre Wahl und wählen Sie **Delete (Löschen)** aus.

**So löschen Sie eine HTTP-API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie auf der **APIs**Seite eine API aus. Wählen Sie **Actions** und anschließend **Delete**.

1. Wählen Sie **Delete (Löschen)**.

**So löschen Sie eine Lambda-Funktion**

1. Melden Sie sich bei der Lambda-Konsole unter [https://console.aws.amazon.com/lambda](https://console.aws.amazon.com/lambda) an.

1. Wählen Sie auf der Seite **Functions (Funktionen)** eine Funktion aus. Wählen Sie **Actions** und anschließend **Delete**.

1. Wählen Sie **Delete (Löschen)**.

**So löschen Sie die Protokollgruppe einer Lambda-Funktion**

1. Öffnen Sie in der CloudWatch Amazon-Konsole die [Seite Protokollgruppen](https://console.aws.amazon.com/cloudwatch/home#logs:).

1. Wählen Sie auf der Seite **Log groups (Protokollgruppen)** die Protokollgruppe (`/aws/lambda/http-crud-tutorial-function`) der Funktion aus. Wählen Sie **Actions (Aktionen)** und dann **Delete log group (Protokollgruppe löschen)** aus.

1. Wählen Sie **Delete (Löschen)**.

**So löschen Sie die Ausführungsrolle einer Lambda-Funktion**

1. Öffnen Sie in der AWS Identity and Access Management Konsole die [Seite Rollen](https://console.aws.amazon.com/iam/home?#/roles).

1. Wählen Sie die Rolle der Funktion aus, zum Beispiel, `http-crud-tutorial-role`.

1. Wählen Sie **Delete role (Rolle löschen)** aus.

1. Wählen Sie **Yes, delete (Ja, löschen)** aus.

## Nächste Schritte: Automatisieren Sie mit AWS SAM oder CloudFormation
<a name="http-api-dynamo-db-next-steps"></a>

Sie können die Erstellung und Bereinigung von AWS Ressourcen automatisieren, indem Sie CloudFormation oder AWS SAM verwenden. Ein Beispiel für eine AWS SAM -Vorlage für dieses Tutorial finden Sie unter [samples/http-dynamo-tutorial.zip](samples/http-dynamo-tutorial.zip).

 CloudFormation Beispielvorlagen finden Sie unter [CloudFormation Beispielvorlagen](https://github.com/awsdocs/amazon-api-gateway-developer-guide/tree/main/cloudformation-templates).

# Tutorial: Erstellen einer HTTP-API mit privater Integration für einen Amazon-ECS-Service
<a name="http-api-private-integration"></a>

In diesem Tutorial erstellen Sie eine serverlose API, die eine Verbindung zu einem Amazon-ECS-Service herstellt, der in einer Amazon VPC ausgeführt wird. Clients außerhalb Ihrer Amazon VPC können die API verwenden, um auf Ihren Amazon-ECS-Service zuzugreifen. 

Für dieses Tutorial brauchen Sie ungefähr eine Stunde. Zunächst verwenden Sie eine CloudFormation Vorlage, um einen Amazon VPC- und Amazon ECS-Service zu erstellen. Dann verwenden Sie die API-Gateway-Konsole, um einen VPC-Link zu erstellen. Der VPC-Link ermöglicht es API Gateway, auf den Amazon-ECS-Service zuzugreifen, der in Ihrer Amazon VPC ausgeführt wird. Als Nächstes erstellen Sie eine HTTP-API, die den VPC-Link verwendet, um eine Verbindung zu Ihrem Amazon-ECS-Service herzustellen. Zuletzt testen Sie Ihre API.

Wenn Sie Ihre HTTP-API aufrufen, leitet API Gateway die Anfrage über Ihren VPC-Link an Ihren Amazon-ECS-Service weiter und gibt dann die Antwort vom Service zurück.

![\[Übersicht der HTTP-API, die Sie in diesem Tutorial erstellen.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/private-integration.png)


Um dieses Tutorial abzuschließen, benötigen Sie ein AWS Konto und einen AWS Identity and Access Management Benutzer mit Konsolenzugriff. Weitere Informationen finden Sie unter [Einrichten der API Gateway](setting-up.md).

In diesem Tutorial wird AWS-Managementkonsole verwendet. Eine CloudFormation Vorlage, die diese API und alle zugehörigen Ressourcen erstellt, finden Sie unter [template.yaml](samples/private-integration-full-template.zip).

**Topics**
+ [Schritt 1: Erstellen Sie einen Amazon-ECS-Service](#http-api-private-integration-create-ecs-service)
+ [Schritt 2: Erstellen eines VPC-Links](#http-api-private-integration-vpc-link)
+ [Schritt 3: HTTP-API erstellen](#http-api-private-integration-create-api)
+ [Schritt 4: Erstellen einer Route](#http-api-private-integration-create-routes)
+ [Schritt 5: Eine Integration erstellen](#http-api-private-integration-create-integration)
+ [Schritt 6: Ihre API testen](#http-api-private-integration-invoke-api)
+ [Schritt 7: Bereinigen](#http-api-private-integration-cleanup)
+ [Nächste Schritte: Automatisieren Sie mit CloudFormation](#http-api-private-integration-next-steps)

## Schritt 1: Erstellen Sie einen Amazon-ECS-Service
<a name="http-api-private-integration-create-ecs-service"></a>

Amazon ECS ist ein Container-Management-Service, mit dem Sie unkompliziert Docker-Container in einem Cluster ausführen, beenden und verwalten können. In diesem Tutorial führen Sie Ihren Cluster auf einer serverlosen Infrastruktur aus, die von Amazon ECS verwaltet wird.

Laden Sie [diese CloudFormation Vorlage](samples/private-integration-cfn.zip) herunter und entpacken Sie sie, wodurch alle Abhängigkeiten für den Service, einschließlich einer Amazon VPC, erstellt werden. Sie verwenden die Vorlage, um einen Amazon-ECS-Service zu erstellen, der einen Application Load Balancer verwendet.

**Um einen Stack zu erstellen CloudFormation**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie **Stack erstellen** und dann **Mit neuen Ressourcen (Standard)** aus.

1. Wählen Sie unter **Vorlage angeben** die Option **Vorlagendatei hochladen** aus.

1. Wählen Sie die Vorlage aus, die Sie heruntergeladen haben.

1. Wählen Sie **Weiter** aus. 

1. Geben Sie für **Stack-Name** die Zeichenfolge **http-api-private-integrations-tutorial** ein und klicken Sie auf **Weiter**.

1. Wählen Sie in **Stack-Optionen konfigurieren** die Option **Weiter** aus.

1. Bestätigen Sie bei **Capabilities**, dass IAM-Ressourcen in Ihrem Konto erstellt werden CloudFormation können.

1. Wählen Sie **Weiter** und anschließend **Absenden** aus.

CloudFormation stellt den ECS-Service bereit, was einige Minuten dauern kann. Wenn der Status Ihres CloudFormation Stacks **CREATE\$1COMPLETE** lautet, können Sie mit dem nächsten Schritt fortfahren.

## Schritt 2: Erstellen eines VPC-Links
<a name="http-api-private-integration-vpc-link"></a>

Ein VPC-Link ermöglicht es API Gateway, auf private Ressourcen in einer Amazon VPC zuzugreifen. Sie verwenden einen VPC-Link, um Clients den Zugriff auf Ihren Amazon-ECS-Service über Ihre HTTP-API zu ermöglichen.

**So erstellen Sie einen VPC-Link**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Klicken Sie im Hauptnavigationsbereich auf **VPC-Links** und dann auf **Erstellen**.

   Sie müssen möglicherweise auf das Menüsymbol klicken, um den Hauptnavigationsbereich zu öffnen.

1. **Wählen Sie unter VPC-Linkversion** die Option **VPC-Link für** HTTP aus. APIs

1. Geben Sie als **Name** die Zeichenfolge „**private-integrations-tutorial**“ ein.

1. Wählen Sie für **VPC** die in Schritt 1 erstellte VPC aus. Der Name muss mit **PrivateIntegrationsStack** beginnen.

1. Wählen Sie für **Subnetze** die beiden privaten Subnetze in Ihrer VPC aus. Ihre Namen enden mit `PrivateSubnet`.

1. Wählen Sie unter **Sicherheitsgruppen** die Gruppen-ID aus, die mit `private-integrations-tutorial` beginnt und die `PrivateIntegrationsStack/PrivateIntegrationsTutorialService/Service/SecurityGroup`-Beschreibung enthält.

1. Wählen Sie **Erstellen** aus.

Nachdem Sie Ihren VPC-Link erstellt haben, bietet API-Gateway-Elastic-Network-Interfaces für den Zugriff auf Ihre VPC an. Der Vorgang kann einige Minuten dauern. In der Zwischenzeit können Sie Ihre API erstellen.

## Schritt 3: HTTP-API erstellen
<a name="http-api-private-integration-create-api"></a>

Die HTTP-API bietet einen HTTP-Endpunkt für Ihre Amazon-ECS-Service-Funktion. In diesem Schritt erstellen Sie eine leere API. In den Schritten 4 und 5 konfigurieren Sie eine Route und eine Integration, um Ihre API und Ihren Amazon-ECS-Service miteinander zu verbinden.



**So erstellen Sie eine HTTP-API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie **Create API (API erstellen)** und dann für **HTTP API** die Option **Build (Erstellen)** aus.

1. Geben Sie unter **API name (API-Name)** **http-private-integrations-tutorial** ein.

1. Wählen Sie als **IP-Adresstyp**. **IPv4**

1. Wählen Sie **Next**.

1. Wählen Sie für **Configure routes (Routen konfigurieren)** die Option **Next (Weiter)** aus, um die Routenerstellung zu überspringen. Sie werden Routen später erstellen.

1. Überprüfen Sie die Phase, die API Gateway für Sie erstellt. API Gateway erstellt eine `$default` Phase mit aktivierten automatischen Bereitstellungen, was die beste Wahl für dieses Tutorial ist. Wählen Sie **Next**.

1. Wählen Sie **Create** aus.

## Schritt 4: Erstellen einer Route
<a name="http-api-private-integration-create-routes"></a>

Routen sind eine Möglichkeit, eingehende API-Anforderungen an Backend-Ressourcen zu senden. Routen bestehen aus zwei Teilen: einer HTTP-Methode und einem Ressourcenpfad, zum Beispiel, `GET /items`. Für diese Beispiel-API erstellen wir eine Route:

**Erstellen Sie eine Route.**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Wählen Sie **Routes (Routen)** aus.

1. Wählen Sie **Create** aus.

1. Wählen Sie für **Methode** **ANY** aus.

1. Für den Pfad geben Sie ei **/\$1proxy\$1\$1**. Das `{proxy+}` am Ende des Pfades ist eine „gierige“ Pfadvariable. API Gateway sendet alle Anfragen an Ihre API an diese Route.

1. Wählen Sie **Create** aus.

## Schritt 5: Eine Integration erstellen
<a name="http-api-private-integration-create-integration"></a>

Sie erstellen eine Integration, um eine Route mit Backend-Ressourcen zu verbinden.

**So wird eine Integration erstellt**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Wähle Sie **Integrations (Integrationen)** aus.

1. Wählen Sie **Manage integrations (Integrationen verwalten)** und dann **Create (Erstellen)** aus.

1. Wählen Sie für **Diese Integration an eine Route anhängen** die **ANY/\$1proxy\$1\$1**-Route aus, die Sie zuvor erstellt haben.

1. Für **Integrationstyp** wählen Sie **Private Ressource** aus.

1. Für **Integrationsdetails** wählen Sie **Manuell auswählen**.

1. Für **Ziel-Service**wählen Sie **ALB/NLB**.

1. Für **Lastenverteilung** wählen Sie die Lastenverteilung aus, die Sie mit der CloudFormation -Vorlage in Schritt 1 erstellt haben. Der Name sollte mit **HTTP-Priva** beginnen.

1. Für den **Listener** wählen Sie **HTTP 80**.

1. Für **VPC-Link** wählen Sie den VPC-Link aus, den Sie in Schritt 2 erstellt haben. Ihr Name sollte laute `private-integrations-tutorial`.

1. Wählen Sie **Create** aus.

Um zu überprüfen, ob Ihre Route und Integration korrekt eingerichtet ist, wählen Sie **Integrationen an Routen anhängen** aus. Die Konsole zeigt, dass Sie eine `ANY /{proxy+}` Route mit einer Integration in einen VPC-Load-Balancer haben.

![\[Die Konsole zeigt, dass Sie eine /{proxy+} Route mit einer Integration in Load Balancer in einer VPC haben.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/private-integration-tutorial-route.png)


Jetzt sind Sie bereit, Ihre API zu testen.

## Schritt 6: Ihre API testen
<a name="http-api-private-integration-invoke-api"></a>

Als Nächstes testen Sie Ihre API, um sicherzustellen, dass sie funktioniert. Verwenden Sie zur Vereinfachung einen Webbrowser, um Ihre API aufzurufen.

**So testen Sie Ihre API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Notieren Sie sich die Aufruf-URL Ihrer API.  
![\[Nachdem Sie Ihre API erstellt haben, zeigt die Konsole die Aufruf-URL Ihrer API an.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/getting-started-invoke-url.png)

1. Rufen Sie in einem Webbrowser die Aufruf-URL Ihrer API auf.

   Die URL sollte wie folgt aussehen: `https://abcdef123.execute-api.us-east-2.amazonaws.com`.

   Ihr Browser sendet eine `GET`-Anforderung an die API.

1. Stellen Sie sicher, dass die Antwort Ihrer API eine Willkommensnachricht ist, die Ihnen mitteilt, dass Ihre App auf Amazon ECS ausgeführt wird.

   Wenn Sie die Willkommensnachricht sehen, haben Sie erfolgreich einen Amazon-ECS-Service erstellt, der in einer Amazon VPC ausgeführt wird und Sie haben eine API-Gateway-HTTP-API mit einem VPC-Link für den Zugriff auf den Amazon-ECS-Service verwendet.

## Schritt 7: Bereinigen
<a name="http-api-private-integration-cleanup"></a>

Um unnötige Kosten zu verhindern, löschen Sie die Ressourcen, die Sie im Rahmen dieses Tutorials erstellt haben. Mit den folgenden Schritten werden Ihr VPC-Link, Ihr CloudFormation Stack und Ihre HTTP-API gelöscht.

**So löschen Sie eine HTTP-API**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie auf der **APIs**Seite eine API aus. Wählen Sie **Aktionen**, wählen Sie **Löschen**und bestätigen Sie dann Ihre Auswahl.

**So löschen Sie einen VPC-Link**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie **VPC-Link**.

1. Wählen Sie Ihren VPC-Link aus, wählen Sie **Löschen** und bestätigen Sie dann Ihre Auswahl.

**Um einen Stapel zu löschen CloudFormation**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie Ihren CloudFormation Stack aus.

1. Wählen Sie **Löschen** und bestätigen Sie dann Ihre Auswahl.

## Nächste Schritte: Automatisieren Sie mit CloudFormation
<a name="http-api-private-integration-next-steps"></a>

Sie können die Erstellung und Bereinigung aller an diesem Tutorial beteiligten AWS Ressourcen automatisieren. Eine vollständige CloudFormation -Beispielvorlage finden Sie unter [template.yaml](samples/private-integration-full-template.zip).

# Amazon API Gateway-WebSocket-API-Tutorials
<a name="api-gateway-websocket-tutorials"></a>

Die folgenden Tutorials enthalten praktische Übungen, in denen Sie mehr über WebSocket-APIs in API Gateway erfahren.

**Topics**
+ [Tutorial: Erstellen Sie eine WebSocket Chat-App mit einer WebSocket API, Lambda und DynamoDB](websocket-api-chat-app.md)
+ [Tutorial: Erstellen Sie eine WebSocket API mit einer AWS Integration](websocket-api-step-functions-tutorial.md)

# Tutorial: Erstellen Sie eine WebSocket Chat-App mit einer WebSocket API, Lambda und DynamoDB
<a name="websocket-api-chat-app"></a>

In diesem Tutorial erstellen Sie eine serverlose Chat-Anwendung mit einer WebSocket API. Mit einer WebSocket API können Sie die bidirektionale Kommunikation zwischen Clients unterstützen. Kunden können Nachrichten erhalten, ohne Updates abfragen zu müssen.

Dieses Tutorial nimmt ungefähr 30 Minuten in Anspruch. Zunächst verwenden Sie eine CloudFormation Vorlage, um Lambda-Funktionen zu erstellen, die API-Anfragen verarbeiten, sowie eine DynamoDB-Tabelle, in der Ihr Client gespeichert wird. IDs Anschließend verwenden Sie die API Gateway Gateway-Konsole, um eine WebSocket API zu erstellen, die in Ihre Lambda-Funktionen integriert ist. Zuletzt testen Sie Ihre API, um zu prüfen, ob Nachrichten gesendet und empfangen werden.

![\[Übersicht über die Architektur der API, die Sie in diesem Tutorial erstellen.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/ws-chat-app.png)


Um dieses Tutorial abzuschließen, benötigen Sie ein AWS Konto und einen AWS Identity and Access Management Benutzer mit Konsolenzugriff. Weitere Informationen finden Sie unter [Einrichten der API Gateway](setting-up.md).

Sie benötigen außerdem `wscat`, um eine Verbindung zu Ihrer API herzustellen. Weitere Informationen finden Sie unter [Wird verwendet`wscat`, um eine Verbindung zu einer WebSocket API herzustellen und Nachrichten an diese zu senden](apigateway-how-to-call-websocket-api-wscat.md).

**Topics**
+ [Schritt 1: Erstellen von Lambda-Funktionen und einer DynamoDB-Tabelle](#websocket-api-chat-app-create-dependencies)
+ [Schritt 2: Erstellen Sie eine API WebSocket](#websocket-api-chat-app-create-api)
+ [Schritt 3: Testen Ihrer API](#websocket-api-chat-app-invoke-api)
+ [Schritt 4: Bereinigen](#websocket-api-chat-app-cleanup)
+ [Nächste Schritte: Automatisieren Sie mit CloudFormation](#websocket-api-chat-app-next-steps)

## Schritt 1: Erstellen von Lambda-Funktionen und einer DynamoDB-Tabelle
<a name="websocket-api-chat-app-create-dependencies"></a>

Laden Sie [die Vorlage zur App-Erstellung für CloudFormation](samples/ws-chat-app-starter.zip) herunter und entpacken Sie sie. Sie verwenden diese Vorlage, um eine Amazon DynamoDB-Tabelle zu erstellen, in der der Client Ihrer App gespeichert wird. IDs Jeder verbundene Client hat eine eindeutige ID, die wir als Partitionsschlüssel der Tabelle verwenden werden. Diese Vorlage erstellt auch Lambda-Funktionen, die Ihre Client-Verbindungen in DynamoDB aktualisieren und das Senden von Nachrichten an verbundene Clients verarbeiten.

**Um einen Stack zu erstellen CloudFormation**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie **Stack erstellen** und dann **Mit neuen Ressourcen (Standard)** aus.

1. Wählen Sie unter **Vorlage angeben** die Option **Vorlagendatei hochladen** aus.

1. Wählen Sie die Vorlage aus, die Sie heruntergeladen haben.

1. Wählen Sie **Weiter** aus. 

1. Geben Sie für **Stack-Name** die Zeichenfolge **websocket-api-chat-app-tutorial** ein und klicken Sie auf **Weiter**.

1. Wählen Sie in **Stack-Optionen konfigurieren** die Option **Weiter** aus.

1. Bestätigen Sie bei **Capabilities**, dass IAM-Ressourcen in Ihrem Konto erstellt werden CloudFormation können.

1. Wählen Sie **Weiter** und anschließend **Absenden** aus.

CloudFormation stellt die in der Vorlage angegebenen Ressourcen bereit. Die Bereitstellung der Ressourcen kann einige Minuten dauern. Wenn der Status Ihres CloudFormation Stacks **CREATE\$1COMPLETE** lautet, können Sie mit dem nächsten Schritt fortfahren.

## Schritt 2: Erstellen Sie eine API WebSocket
<a name="websocket-api-chat-app-create-api"></a>

Sie erstellen eine WebSocket API, um Client-Verbindungen zu verarbeiten und Anfragen an die Lambda-Funktionen weiterzuleiten, die Sie in Schritt 1 erstellt haben.



**Um eine API zu erstellen WebSocket**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie **Create API** (API erstellen) aus. **Wählen Sie dann für **WebSocket API die Option Build** aus.**

1. Geben Sie in **API name** (API-Name) **websocket-chat-app-tutorial** ein.

1. Wählen Sie als **IP-Adresstyp** die Option aus **IPv4**.

1. Geben Sie in **Route selection expression** (Ausdruck für die Routenauswahl) **request.body.action** ein. Der Ausdruck für die Routenauswahl legt die Route fest, die von API Gateway aufgerufen wird, wenn ein Client eine Nachricht sendet.

1. Wählen Sie **Next** (Weiter) aus.

1. Wählen Sie in **Predefined routes** (Vordefinierte Routen) die Optionen **Add \$1connect** (\$1connect hinzufügen), **Add \$1disconnect** (\$1disconnect hinzufügen) und **Add \$1default** (\$1default hinzufügen) aus. Die Routen **\$1connect** und **\$1disconnect** sind spezielle Routen, die API Gateway automatisch aufruft, wenn ein Client eine Verbindung zu einer API herstellt oder trennt. API Gateway ruft die Route `$default` auf, wenn keine anderen Routen mit einer Anforderung übereinstimmen.

1. Wählen Sie in **Custom routes** (Benutzerdefinierte Routen) **Add custom route** (Benutzerdefinierte Route hinzufügen) aus. Geben Sie in **Route key** (Routenschlüssel) **sendmessage** ein. Diese benutzerdefinierte Route verarbeitet Nachrichten, die an verbundene Clients gesendet werden.

1. Wählen Sie **Weiter** aus.

1. Wählen Sie in **Attach integrations** (Integrationen anfügen) für jede Route und jeden **Integration type** (Integrationstyp) „Lambda“ aus.

   Wählen Sie für **Lambda** die entsprechende Lambda-Funktion aus, mit der Sie CloudFormation in Schritt 1 erstellt haben. Der Name jeder Funktion entspricht einer Route. Für die Route **\$1connect** wählen Sie beispielsweise die Funktion mit dem Namen **websocket-chat-app-tutorial-ConnectHandler** aus.

1. Überprüfen Sie die Phase, die API Gateway für Sie erstellt. Standardmäßig erstellt API Gateway den Phasennamen `production` und stellt Ihre API automatisch für diese Phase bereit. Wählen Sie **Weiter** aus.

1. Wählen Sie **Create and deploy** (Erstellen und bereitstellen) aus.

## Schritt 3: Testen Ihrer API
<a name="websocket-api-chat-app-invoke-api"></a>

Als Nächstes testen Sie Ihre API, um sicherzustellen, dass sie korrekt funktioniert. Stellen Sie mit dem Befehl `wscat` eine Verbindung zur API her.

**So rufen Sie die URL für den Aufruf Ihrer API ab**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie Ihre API aus.

1. Wählen Sie **Stages** (Phasen) und anschließend **production** (Produktion) aus.

1. **Notieren Sie sich die URL Ihrer API. WebSocket ** Die URL sollte wie `wss://abcdef123.execute-api.us-east-2.amazonaws.com/production` aussehen.

**So stellen Sie eine Verbindung zu Ihrer API her**

1. Stellen Sie mit dem folgenden Befehl eine Verbindung zu Ihrer API her. Wenn Sie die Verbindung zu Ihrer API herstellen, ruft API Gateway die Route `$connect` auf. Bei Aufruf dieser Route wird eine Lambda-Funktion aufgerufen, mit der die Verbindungs-ID in DynamoDB gespeichert wird.

   ```
   wscat -c wss://abcdef123.execute-api.us-west-2.amazonaws.com/production
   ```

   ```
   Connected (press CTRL+C to quit)
   ```

1. Öffnen Sie ein neues Terminal. Führen Sie den Befehl **wscat** erneut mit den folgenden Parametern aus.

   ```
   wscat -c wss://abcdef123.execute-api.us-west-2.amazonaws.com/production
   ```

   ```
   Connected (press CTRL+C to quit)
   ```

   Anschließend erhalten Sie zwei verbundene Clients, die Nachrichten austauschen können.

**So senden Sie eine Nachricht**
+  API Gateway legt basierend auf dem Ausdruck für die Routenauswahl Ihrer API fest, welche Route aufgerufen wird. Der Ausdruck für die Routenauswahl Ihrer API ist `$request.body.action`. Daher ruft API Gateway die Route `sendmessage` auf, wenn Sie die folgende Nachricht senden:

  ```
  {"action": "sendmessage", "message": "hello, everyone!"}
  ```

  Die Lambda-Funktion, die der aufgerufenen Route zugeordnet ist, sammelt den Client IDs von DynamoDB. Anschließend ruft die Funktion die API-Gateway-Management-API auf und sendet die Nachricht an diese Clients. Alle verbundenen Clients erhalten die folgende Nachricht:

  ```
  < hello, everyone!
  ```

**So rufen Sie die Route „\$1default“ Ihrer API auf**
+ API Gateway ruft die Standardroute Ihrer API auf, wenn ein Client eine Nachricht sendet, die nicht mit den von Ihnen definierten Routen übereinstimmt. Die mit der Route `$default` verknüpfte Lambda-Funktion verwendet die API-Gateway-Management-API, um die Client-Daten zur Verbindung zu senden.

  ```
  test
  ```

  ```
  Use the sendmessage route to send a message. Your info: {"ConnectedAt":"2022-01-25T18:50:04.673Z","Identity":{"SourceIp":"192.0.2.1","UserAgent":null},"LastActiveAt":"2022-01-25T18:50:07.642Z","connectionID":"Mg_ugfpqPHcCIVA="}
  ```

**So trennen Sie die Verbindung zu Ihrer API**
+ Zur Trennung der Verbindung zu Ihrer API drücken Sie **CTRL\$1C**. Wenn ein Client die Verbindung zu Ihrer API trennt, ruft API Gateway die Route `$disconnect` Ihrer API auf. Die Lambda-Integration für die Route `$disconnect` Ihrer API entfernt die Verbindungs-ID aus DynamoDB.

## Schritt 4: Bereinigen
<a name="websocket-api-chat-app-cleanup"></a>

Um unnötige Kosten zu verhindern, löschen Sie die Ressourcen, die Sie im Rahmen dieses Tutorials erstellt haben. Mit den folgenden Schritten werden Ihr Stack und Ihre CloudFormation API gelöscht. WebSocket 

**Um eine WebSocket API zu löschen**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie auf der **APIs**Seite Ihre API aus. `websocket-chat-app-tutorial` Wählen Sie **Actions** (Aktionen) und **Delete** (Löschen) aus. Bestätigen Sie anschließend Ihre Auswahl.

**Um einen CloudFormation Stapel zu löschen**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie Ihren CloudFormation Stack aus.

1. Wählen Sie **Löschen** und bestätigen Sie dann Ihre Auswahl.

## Nächste Schritte: Automatisieren Sie mit CloudFormation
<a name="websocket-api-chat-app-next-steps"></a>

Sie können die Erstellung und Bereinigung aller an diesem Tutorial beteiligten AWS Ressourcen automatisieren. Eine CloudFormation Vorlage, die diese API und alle zugehörigen Ressourcen erstellt, finden Sie unter [ws-chat-app.yaml.](samples/ws-chat-app.zip)

# Tutorial: Erstellen Sie eine WebSocket API mit einer AWS Integration
<a name="websocket-api-step-functions-tutorial"></a>

In diesem Tutorial erstellen Sie eine serverlose Broadcast-Anwendung mit einer WebSocket API. Kunden können Nachrichten erhalten, ohne Updates abfragen zu müssen.

 In diesem Tutorial sehen Sie, wie Nachrichten an verbundene Clients übertragen werden. Enthalten sind außerdem ein Beispiel für einen Lambda-Genehmiger, eine Scheinintegration und eine Nicht-Proxy-Integration für Step Functions.

![\[Übersicht über die Architektur der API, die Sie in diesem Tutorial erstellen.\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/ws-sfn-app.png)


Nachdem Sie Ihre Ressourcen mithilfe einer CloudFormation Vorlage erstellt haben, verwenden Sie die API Gateway Gateway-Konsole, um eine WebSocket API zu erstellen, die sich in Ihre AWS Ressourcen integrieren lässt. Sie fügen Ihrer API einen Lambda-Authorizer hinzu und erstellen eine AWS Serviceintegration mit Step Functions, um eine State-Machine-Ausführung zu starten. Der Zustandsautomat für die Step Functions ruft eine Lambda-Funktion auf, die eine Nachricht an alle verbundenen Clients sendet.

Nachdem Sie Ihre API erstellt haben, testen Sie die Verbindung zu Ihrer API und prüfen, ob Nachrichten gesendet und empfangen werden. Dieses Tutorial nimmt ungefähr 30 Minuten in Anspruch.

**Topics**
+ [Voraussetzungen](#websocket-api-step-functions-prerequisites)
+ [Schritt 1: Erstellen von Ressourcen](#websocket-api-step-functions-create-dependencies)
+ [Schritt 2: Erstellen Sie eine API WebSocket](#websocket-api-step-functions-create-api)
+ [Schritt 3: Erstellen eines Lambda-Genehmigers](#websocket-api-step-functions-create-authorizer)
+ [Schritt 4: Erstellen einer bidirektionalen Scheinintegration](#websocket-api-step-functions-create-mock-integration)
+ [Schritt 5: Erstellen einer Nicht-Proxy-Integration mit Step Functions](#websocket-api-step-functions-create-step-function-integration)
+ [Schritt 6: Ihre API testen](#websocket-api-step-functions-test-api)
+ [Schritt 7: Bereinigen](#websocket-api-step-functions-cleanup)
+ [Nächste Schritte](#websocket-api-step-functions-next-steps)

## Voraussetzungen
<a name="websocket-api-step-functions-prerequisites"></a>

Sie benötigen die folgenden Voraussetzungen:
+ Ein AWS Konto und ein AWS Identity and Access Management Benutzer mit Konsolenzugriff. Weitere Informationen finden Sie unter [Einrichten der API Gateway](setting-up.md).
+ `wscat` für einen Verbindungsaufbau zu Ihrer API. Weitere Informationen finden Sie unter [Wird verwendet`wscat`, um eine Verbindung zu einer WebSocket API herzustellen und Nachrichten an diese zu senden](apigateway-how-to-call-websocket-api-wscat.md).

Wir empfehlen, dass Sie das WebSocket Chat-App-Tutorial abschließen, bevor Sie mit diesem Tutorial beginnen. Informationen zum Ausfüllen des WebSocket Chat-App-Tutorials finden Sie unter[Tutorial: Erstellen Sie eine WebSocket Chat-App mit einer WebSocket API, Lambda und DynamoDB](websocket-api-chat-app.md).

## Schritt 1: Erstellen von Ressourcen
<a name="websocket-api-step-functions-create-dependencies"></a>

Laden Sie [die Vorlage zur App-Erstellung für CloudFormation](samples/ws-sfn-starter.zip) herunter und entpacken Sie sie. Sie verwenden diese Vorlage, um Folgendes zu erstellen:
+ Lambda-Funktionen, die API-Anforderungen bearbeiten und den Zugriff auf Ihre API genehmigen.
+ Eine DynamoDB-Tabelle zum Speichern der Client IDs - und Hauptbenutzeridentifikation, die vom Lambda-Autorisierer zurückgegeben wurde.
+ Einen Zustandsautomaten für die Step Functions zur Versendung von Nachrichten an verbundene Clients.

**Um einen Stack zu erstellen CloudFormation**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie **Stack erstellen** und dann **Mit neuen Ressourcen (Standard)** aus.

1. Wählen Sie unter **Vorlage angeben** die Option **Vorlagendatei hochladen** aus.

1. Wählen Sie die Vorlage aus, die Sie heruntergeladen haben.

1. Wählen Sie **Weiter** aus. 

1. Geben Sie für **Stack-Name** die Zeichenfolge **websocket-step-functions-tutorial** ein und klicken Sie auf **Weiter**.

1. Wählen Sie in **Stack-Optionen konfigurieren** die Option **Weiter** aus.

1. Bestätigen Sie bei **Capabilities**, dass IAM-Ressourcen in Ihrem Konto erstellt werden CloudFormation können.

1. Wählen Sie **Weiter** und anschließend **Absenden** aus.

CloudFormation stellt die in der Vorlage angegebenen Ressourcen bereit. Die Bereitstellung der Ressourcen kann einige Minuten dauern. Wählen Sie die Registerkarte **Ausgaben**, um Ihre erstellten Ressourcen und deren Eigenschaften zu sehen ARNs. Wenn der Status Ihres CloudFormation Stacks **CREATE\$1COMPLETE** lautet, können Sie mit dem nächsten Schritt fortfahren.

## Schritt 2: Erstellen Sie eine API WebSocket
<a name="websocket-api-step-functions-create-api"></a>

Sie erstellen eine WebSocket API, um Client-Verbindungen zu verarbeiten und Anfragen an die Ressourcen weiterzuleiten, die Sie in Schritt 1 erstellt haben.

**Um eine WebSocket API zu erstellen**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie **Create API** (API erstellen) aus. **Wählen Sie dann für **WebSocket API die Option Build** aus.**

1. Geben Sie in **API name** (API-Name) **websocket-step-functions-tutorial** ein.

1. Wählen Sie als **IP-Adresstyp** die Option aus **IPv4**.

1. Geben Sie in **Route selection expression** (Ausdruck für die Routenauswahl) **request.body.action** ein.

   Der Ausdruck für die Routenauswahl legt die Route fest, die von API Gateway aufgerufen wird, wenn ein Client eine Nachricht sendet.

1. Wählen Sie **Weiter** aus.

1. Wählen Sie unter **Vordefinierte Routen** die Optionen **\$1connect hinzufügen**, **\$1disconnect hinzufügen** und **\$1default hinzufügen** aus.

   Die Routen **\$1connect** und **\$1disconnect** sind spezielle Routen, die API Gateway automatisch aufruft, wenn ein Client eine Verbindung zu einer API herstellt oder trennt. API Gateway ruft die **\$1default**-Route auf, wenn keine anderen Routen mit einer Anforderung übereinstimmen. Nachdem Sie Ihre API erstellt haben, erstellen Sie eine benutzerdefinierte Route, um eine Verbindung zu den Step Functions herzustellen.

1. Wählen Sie **Weiter** aus.

1. Gehen Sie für **Integration für \$1connect** wie folgt vor:

   1. Wühlen Sie unter **Integrationstyp** die Option **Lambda** aus.

   1. Wählen Sie für die **Lambda-Funktion** die entsprechende **\$1connect** Lambda-Funktion aus, mit der Sie CloudFormation in Schritt 1 erstellt haben. Der Lambda-Funktionsname sollte mit **websocket-step** beginnen.

1. Gehen Sie für **Integration für \$1disconnect** wie folgt vor:

   1. Wählen Sie unter **Integrationstyp** die Option **Lambda** aus.

   1. Wählen Sie für die **Lambda-Funktion** die entsprechende **\$1disconnect** Lambda-Funktion aus, mit der Sie CloudFormation in Schritt 1 erstellt haben. Der Lambda-Funktionsname sollte mit **websocket-step** beginnen.

1. Wählen Sie für **Integration für \$1default** die Option **Mock** aus.

   Bei einer Mock-Integration verwaltet API Gateway die Routenantwort ohne ein Integrations-Backend.

1. Wählen Sie **Weiter** aus.

1. Überprüfen Sie die Phase, die API Gateway für Sie erstellt. Standardmäßig erstellt API Gateway eine Stufe namens **Produktion** und stellt Ihre API automatisch für diese Stufe bereit. Wählen Sie **Weiter** aus.

1. Wählen Sie **Create and deploy** (Erstellen und bereitstellen) aus.

## Schritt 3: Erstellen eines Lambda-Genehmigers
<a name="websocket-api-step-functions-create-authorizer"></a>

Um den Zugriff auf Ihre WebSocket API zu kontrollieren, erstellen Sie einen Lambda-Autorisierer. Die CloudFormation Vorlage hat die Lambda-Autorisierungsfunktion für Sie erstellt. Sie können die Lambda-Funktion auch in der Lambda-Konsole sehen. Der Name muss mit **websocket-step-functions-tutorial-AuthorizerHandler** beginnen. Diese Lambda-Funktion verweigert alle WebSocket API-Aufrufe, es sei denn, der `Authorization` Header ist es. `Allow` Außerdem übergibt die Lambda-Funktion die `$context.authorizer.principalId`-Variable auch an Ihre API, die später in der DynamoDB-Tabelle zur Identifizierung der API-Aufrufer verwendet wird.

In diesem Schritt konfigurieren Sie die **\$1connect**-Route zur Verwendung des Lambda-Genehmigers.

**Erstellen eines Lambda-Genehmigers**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie im Hauptnavigationsbereich **Genehmiger**.

1. Klicken Sie auf **Genehmiger erstellen**.

1. Geben Sie unter **Genehmigername** **LambdaAuthorizer** ein.

1. Geben Sie für **Authorizer ARN** den Namen des Autorisierers ein, der mit der CloudFormation Vorlage erstellt wurde. Der Name muss mit **websocket-step-functions-tutorial-AuthorizerHandler** beginnen.
**Anmerkung**  
Wir empfehlen, diesen Beispielautorisierer nicht für Ihre Produktion zu verwenden. APIs

1. Wählen Sie unter **Identitätsquellentyp** die Option **Header** aus. Geben Sie für **Key (Schlüssel)** **Authorization** ein.

1. Wählen Sie **Autorisierer erstellen**.

Nachdem Sie Ihren Genehmiger erstellt haben, hängen Sie ihn an die **\$1connect**-Route Ihrer API an.

**So fügen Sie einen Genehmiger zu der \$1connect-Route hinzu**

1. Klicken Sie im Hauptnavigationsbereich auf **Routen**.

1. Wählen Sie die **\$1connect**-Route aus.

1. Wählen Sie im Abschnitt **Route request settings** (Einstellungen der Routenanforderung) die Option **Edit** (Bearbeiten) aus.

1. Öffnen Sie das Dropdown-Menü **Genehmigung** und wählen Sie Ihren Anforderungsgenehmiger aus.

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

## Schritt 4: Erstellen einer bidirektionalen Scheinintegration
<a name="websocket-api-step-functions-create-mock-integration"></a>

Als Nächstes erstellen Sie die bidirektionale Scheinintegration für die **\$1default**-Route. Mit einer Scheinintegration können Sie eine Antwort an den Client senden, ohne ein Backend zu verwenden. Wenn Sie eine Integration für die **\$1default**-Route erstellen, können Sie damit Ihren Kunden zeigen, wie sie mit Ihrer API interagieren können.

Sie konfigurieren die **\$1default**-Route, um Clients darüber zu informieren, dass sie die **SendMessage**-Route verwenden sollen.

**So erstellen Sie eine Scheinintegration**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie die **\$1default**-Route und dann die Registerkarte **Integrationsanforderung** aus.

1. Klicken Sie unter **Anforderungsvorlagen** auf **Bearbeiten**.

1. Geben Sie unter **Ausdruck für die Vorlagenauswahl** **200** ein und klicken Sie dann auf **Bearbeiten**.

1. Wählen Sie auf der Registerkarte **Integrationsanforderung** unter **Anforderungsvorlagen** die Option **Vorlage erstellen** aus.

1. Geben Sie unter **Vorlagenschlüssel** **200** ein.

1. Geben Sie für **Vorlagentext** die folgende Zuweisungsvorlage ein:

   ```
   {"statusCode": 200}
   ```

   Wählen Sie **Create template (Vorlage erstellen)** aus.

   Das Ergebnis sollte wie folgt aussehen:  
![\[Konfigurieren der Integrationsanfrage für die Scheinintegration der $default-Route\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/ws-sfn-mock-integration-request.png)

1. Wählen Sie im Bereich **\$1default-Route** die Option **Bidirektionale Kommunikation aktivieren** aus.

1. Wählen Sie die Registerkarte **Integrationsantwort** und dann **Integrationsantwort erstellen** aus.

1. Geben Sie unter **Antwortschlüssel** **\$1default** ein.

1. Geben Sie unter **Vorlagen-Auswahlausdruck** **200** ein.

1. Wählen Sie **Create response** (Antwort erstellen) aus.

1. Klicken Sie unter **Zuweisungsvorlagen** auf **Vorlage erstellen**.

1. Geben Sie unter **Vorlagenschlüssel** **200** ein.

1. Geben Sie für **Antwortvorlage** die folgende Zuweisungsvorlage ein:

   ```
   {"Use the sendmessage route to send a message. Connection ID: $context.connectionId"}
   ```

1. Wählen Sie **Create template (Vorlage erstellen)** aus.

   Das Ergebnis sollte wie folgt aussehen:  
![\[Konfigurieren der Integrationsantwort für die Scheinintegration der $default-Route\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/ws-sfn-mock-integration-response.png)

## Schritt 5: Erstellen einer Nicht-Proxy-Integration mit Step Functions
<a name="websocket-api-step-functions-create-step-function-integration"></a>

Als Nächstes erstellen Sie eine **sendmessage**-Route. Kunden können die **sendmessage**-Route zur Versendung einer Nachricht an alle verbundenen Clients aufrufen. Die **SendMessage-Route** hat eine Nicht-Proxy-Serviceintegration mit. AWS AWS Step Functions Die Integration ruft den [StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html)Befehl für den Step Functions Functions-Zustandsmaschine auf, den die CloudFormation Vorlage für Sie erstellt hat.

**So erstellen Sie eine Nicht-Proxy-Integration**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Wählen Sie **Create route (Route erstellen)** aus.

1. Geben Sie in **Route key** (Routenschlüssel) **sendmessage** ein.

1. Wählen Sie unter **Integrationstyp** die Option **AWS -Service** aus.

1. Geben Sie **AWS unter Region** die Region ein, in der Sie Ihre Vorlage bereitgestellt haben. CloudFormation 

1. Wählen Sie unter **AWS -Service** die Option **Step Functions** aus.

1. Wählen Sie in **HTTP method** **POST**.

1. Für **Aktionsname** geben Sie **StartExecution** ein.

1. Geben Sie für **Ausführungsrolle** die Ausführungsrolle ein, die durch die CloudFormation Vorlage erstellt wurde. Der Name sollte sein **WebsocketTutorialApiRole**.

1. Wählen Sie **Create route (Route erstellen)** aus.

Als Nächstes erstellen Sie eine Zuweisungsvorlage, um Anforderungsparameter an die Zustandsmaschine für Step Functions zu senden.

**Erstellen einer Zuweisungsvorlage**

1. Wählen Sie die **sendmessage**-Route und dann die Registerkarte **Integrationsanforderung** aus.

1. Klicken Sie im Abschnitt **Vorlagenanforderung** auf **Bearbeiten**.

1. Geben Sie unter **Vorlagen-Auswahlausdruck** **\$1\$1default** ein.

1. Wählen Sie **Bearbeiten** aus.

1. Klicken Sie im Abschnitt **Vorlagenanforderung** auf **Vorlage erstellen**.

1. Geben Sie unter **Vorlagenschlüssel** **\$1\$1default** ein.

1. Geben Sie für **Vorlagentext** die folgende Zuweisungsvorlage ein:

   ```
   #set($domain = "$context.domainName")
   #set($stage = "$context.stage")
   #set($body = $input.json('$'))
   #set($getMessage = $util.parseJson($body))
   #set($mymessage = $getMessage.message)
   {
   "input": "{\"domain\": \"$domain\", \"stage\": \"$stage\", \"message\": \"$mymessage\"}",
   "stateMachineArn": "arn:aws:states:us-east-2:123456789012:stateMachine:WebSocket-Tutorial-StateMachine"
   }
   ```

   Ersetzen Sie das *stateMachineArn* durch den ARN der Zustandsmaschine, die von erstellt wurde CloudFormation.

   Die Zuweisungsvorlage führt Folgendes aus:
   + Erzeugt die Variable `$domain` mithilfe der Kontextvariable `domainName`.
   + Erzeugt die Variable `$stage` mithilfe der Kontextvariable `stage`.

     Die Variablen `$domain` und `$stage` sind für die Erzeugung einer Callback-URL erforderlich.
   + Extrahiert die `message`-Eigenschaft aus der eingehenden `sendmessage`-JSON-Nachricht.
   + Erzeugt die Eingabe für den Zustandsautomaten. Die Eingabe ist die Domäne und die Phase der WebSocket API sowie die Nachricht von der `sendmessage` Route.

1. Wählen Sie **Create template (Vorlage erstellen)** aus.  
![\[Konfigurieren der sendmessage-Route\]](http://docs.aws.amazon.com/de_de/apigateway/latest/developerguide/images/ws-sfn-integration-request.png)

Sie können eine Nicht-Proxy-Integration auf den Routen **\$1connect** oder **\$1disconnect** erstellen, um direkt eine Verbindungs-ID aus der DynamoDB-Tabelle hinzuzufügen oder zu entfernen, ohne eine Lambda-Funktion aufzurufen.

## Schritt 6: Ihre API testen
<a name="websocket-api-step-functions-test-api"></a>

Als Nächstes veröffentlichen und testen Sie Ihre API, um sicherzustellen, dass sie korrekt funktioniert. Sie verwenden den `wscat` Befehl, um eine Verbindung zur API herzustellen, und dann verwenden Sie einen Slash-Befehl, um einen Ping-Frame zu senden, um die Verbindung zur WebSocket API zu überprüfen.

**Stellen Sie Ihre API bereit**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. Klicken Sie im Hauptnavigationsbereich auf **Routen**.

1. Klicken Sie auf **Deploy API**.

1. Wählen Sie unter **Stufe** **Produktion** aus.

1. (Optional) Geben Sie unter **Bereitstellungsbeschreibung** eine Beschreibung ein.

1. Wählen Sie **Bereitstellen**.

Nachdem Sie Ihre API bereitgestellt haben, können Sie sie aufrufen. Verwenden Sie die Aufruf-URL, um Ihre API aufzurufen.

**So rufen Sie die URL für den Aufruf Ihrer API auf**

1. Wählen Sie Ihre API aus.

1. Wählen Sie **Stages** (Phasen) und anschließend **production** (Produktion) aus.

1. **Notieren Sie sich die URL Ihrer API. WebSocket ** Die URL sollte wie `wss://abcdef123.execute-api.us-east-2.amazonaws.com/production` aussehen.

Jetzt, da Sie Ihre Aufruf-URL haben, können Sie die Verbindung zu Ihrer WebSocket API testen.

**So testen Sie die Verbindung zu Ihrer API**

1. Stellen Sie mit dem folgenden Befehl eine Verbindung zu Ihrer API her. Zuerst testen Sie die Verbindung, indem Sie den `/ping`-Pfad aufrufen.

   ```
   wscat -c wss://abcdef123.execute-api.us-east-2.amazonaws.com/production -H "Authorization: Allow" --slash -P
   ```

   ```
   Connected (press CTRL+C to quit)
   ```

1. Geben Sie den folgenden Befehl ein, um den Kontrollrahmen anzupingen. Sie können einen Kontrollrahmen für Keepalive-Zwecke von der Client-Seite aus verwenden.

   ```
   /ping
   ```

   Das Ergebnis sollte wie folgt aussehen:

   ```
   < Received pong (data: "")
   ```

Jetzt, da Sie die Verbindung getestet haben, können Sie Ihre API auf ordnungsgemäße Funktion prüfen. In diesem Schritt öffnen Sie ein neues Terminalfenster, damit die WebSocket API eine Nachricht an alle verbundenen Clients senden kann.

**So testen Sie Ihre API**

1. Öffnen Sie ein neues Terminal. Führen Sie den Befehl `wscat` erneut mit den folgenden Parametern aus.

   ```
   wscat -c wss://abcdef123.execute-api.us-east-2.amazonaws.com/production -H "Authorization: Allow"
   ```

   ```
   Connected (press CTRL+C to quit)
   ```

1. API Gateway legt basierend auf dem Ausdruck für die Routenanforderungsauswahl Ihrer API fest, welche Route aufgerufen wird. Der Ausdruck für die Routenauswahl Ihrer API lautet `$request.body.action`. Daher ruft API Gateway die Route `sendmessage` auf, wenn Sie die folgende Nachricht senden:

   ```
   {"action": "sendmessage", "message": "hello, from Step Functions!"}
   ```

   Die der Route zugeordnete Zustandsmaschine für Step Functions ruft eine Lambda-Funktion mit der Nachricht und der Callback-URL auf. Die Lambda-Funktion ruft die API-Gateway-Management-API auf und sendet die Nachricht an alle verbundenen Clients. Alle Clients erhalten die folgende Nachricht:

   ```
   < hello, from Step Functions!
   ```

Nachdem Sie Ihre WebSocket API getestet haben, können Sie die Verbindung zu Ihrer API trennen.

**So trennen Sie die Verbindung zu Ihrer API**
+ Zur Trennung der Verbindung zu Ihrer API drücken Sie `CTRL+C`.

  Wenn ein Client die Verbindung zu Ihrer API trennt, ruft API Gateway die Route **\$1disconnect** Ihrer API auf. Die Lambda-Integration der **\$1disconnect**-Route Ihrer API entfernt die Verbindungs-ID aus DynamoDB.

## Schritt 7: Bereinigen
<a name="websocket-api-step-functions-cleanup"></a>

Um unnötige Kosten zu verhindern, löschen Sie die Ressourcen, die Sie im Rahmen dieses Tutorials erstellt haben. Mit den folgenden Schritten werden Ihr CloudFormation Stack und Ihre WebSocket API gelöscht.

**Um eine WebSocket API zu löschen**

1. Melden Sie sich bei der API Gateway Gateway-Konsole unter [https://console.aws.amazon.com/apigatewayan](https://console.aws.amazon.com/apigateway).

1. **Wählen Sie auf der **APIs**Seite Ihre Websocket-API aus.**

1. Wählen Sie **Actions** (Aktionen) und **Delete** (Löschen) aus. Bestätigen Sie anschließend Ihre Auswahl.

**Um einen Stapel zu löschen CloudFormation**

1. Öffnen Sie die CloudFormation Konsole unter [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/).

1. Wählen Sie Ihren CloudFormation Stack aus.

1. Wählen Sie **Löschen** und bestätigen Sie dann Ihre Auswahl.

## Nächste Schritte
<a name="websocket-api-step-functions-next-steps"></a>

Sie können die Erstellung und Bereinigung aller an diesem Tutorial beteiligten AWS Ressourcen automatisieren. [Ein Beispiel für eine CloudFormation Vorlage, die diese Aktionen für dieses Tutorial automatisiert, finden Sie unter ws-sfn.zip.](samples/ws-sfn-complete.zip)