AWS API Gateway ist ein cloudbasierter API-Service, der einen Integrationspunkt für AWS-Services oder Services von Drittanbietern darstellt. Der Service ist sehr einfach zu nutzen. Definieren Sie zunächst eine OpenAPI-Spezifikation, definieren Sie dann Integrationen für die OpenAPI-Spezifikation und stellen Sie die Spezifikation mit CloudFormation bereit. API Gateway unterstützt fünf Arten von Integrationen:
- mock: für die Integration mit API Gateway, ohne ein Backend aufzurufen
- aws: für die Integration mit AWS-Diensten, wobei Transformationen möglich sind
- aws_proxy: für die Integration mit AWS Lambda
- http: für die Integration mit HTTP-Backends, wobei Transformationen möglich sind
- http_proxy: für die Integration mit HTTP-Backends Wir werden uns heute alle Integrationstypen ansehen
aws-cfn-update
"AWS API Gateway macht es Entwicklern leicht, sichere APIs in beliebigem Umfang zu erstellen, zu veröffentlichen, zu pflegen und zu überwachen", so
in der offiziellen Dokumentation. Obwohl das stimmt, ist es alles andere als trivial,
Beispiel Projekt
Das Beispielprojekt zeigt ein Projekt, das aus einer Reihe von Projekten besteht, die zeigen, wie man die einzelnen Integrationstypen erstellt und verwendet.
OpenAPI-Spezifikation
API Gateway unterstützt sowohl OpenAPI v2.0 alias 'swagger',
und OpenAPI v3.0. Die OpenAPI-Spezifikation macht esswagger/swagger.yaml verfügbar.
Typ:
- make merge-swagger: um die OpenAPI-Spezifikation mit CloudFormation zusammenzuführen
- make deploy: um das Projekt zu verteilen
- make delete: um das Projekt zu löschen
Mock-Integration
Das Projekt 02-mock-integration zeigt
, wie man 'Mock'-Integrationen einrichtet. Mock-Integrationen generieren API-Antworten direkt von API Gateway, ohne dass ein Integrations-Backend erforderlich ist.
Mock-Integrationen eignen sich hervorragend zur Generierung statischer Antworten wie CORS-Antworten für eine POST-Anfrage. Die AWS-Erweiterungen zur OpenAPI-Spezifikation
befinden sich im Verzeichnis swagger/aws-extensions.yaml. Ein Beispiel für eine Mock-Integration:
x-amazon-apigateway-integration:
responses:
default:
statusCode: '200'
responseParameters:
method.response.header.Content-Type: "'application/json'"
method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
method.response.header.Access-Control-Allow-Methods : "'*'"
method.response.header.Access-Control-Allow-Origin : "'*'"
responseTemplates:
application/json: |-
[{
"id": 1,
"name": "Superman"
},
{
"id": 2,
"name": "Batman"
}]
passthroughBehavior: when_no_match
requestTemplates:
application/json: |-
{
"statusCode": 200
}
type: mock
Der Mock antwortet mit einem HTTP-'200' und einer Liste von Helden im JSON-Format.
HTTP-Integration
Projekt 03-http-integration zeigt
, wie man 'http'-Integrationen einrichtet. HTTP-Integrationen sind nützlich, wenn eine API-Methode mit einem HTTP-Endpunkt integriert werden muss, wie z.B. ein Dienst
x-amazon-apigateway-integration:
responses:
default:
statusCode: '200'
responseParameters:
method.response.header.Content-Type: "'application/json'"
method.response.header.Access-Control-Allow-Headers : "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'"
method.response.header.Access-Control-Allow-Methods : "'*'"
method.response.header.Access-Control-Allow-Origin : "'*'"
passthroughBehavior: when_no_match
uri: 'https://httpbin.org/anything'
httpMethod: GET
type: http_proxy
Die http-Integration ruft httpbin.org mit einem 'GET' auf und antwortet mit einem HTTP '200'. Der Integrationstyp kann entweder 'http_proxy' oder 'http' sein.
AWS Proxy (Lambda) Integration
Projekt 04-lambda-integration zeigt
, wie Sie 'aws_proxy'-Integrationen einrichten. Die Erstellung eines Lambdas ist etwas komplizierter. Wenn Sie Python verwenden, kann das Lambda in der CloudFormation
APIGatewayInvokeLambdaRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service: apigateway.amazonaws.com
Action: sts:AssumeRole
Condition: {}
Path: /
Policies:
- PolicyName: ApiGateway
PolicyDocument:
Statement:
- Effect: Allow
Action:
- lambda:InvokeFunction
Resource:
- '*'
Die 'aws_proxy' Integration:
x-amazon-apigateway-integration:
responses: {}
uri: !Sub arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaHandler.Arn}/invocations
credentials: !GetAtt APIGatewayInvokeLambdaRole.Arn
passthroughBehavior: when_no_match
httpMethod: POST
type: aws_proxy
Beachten Sie, dass die Integration 'aws_proxy' auf die 'arn' des Lambdas verweist. Die Anmeldeinformationen für API Gateway werden durch die 'APIGatewayInvokeLambdaRole' definiert.
AWS-Service-Integration
Projekt 05-aws-service-integration zeigt , wie Sie die Integration von AWS-Diensten einrichten. API-Gateway kann die API von AWS-Services wie z.B. DynamoDB aufrufen. API Gateway muss über die Rolle verfügen, um DynamoDB aufrufen zu können:
APIGatewayRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service: apigateway.amazonaws.com
Action: sts:AssumeRole
Condition: {}
Path: /
ManagedPolicyArns:
- arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess
Die 'aws' Integration:
x-amazon-apigateway-integration:
credentials: !GetAtt APIGatewayRole.Arn
uri: !Sub "arn:aws:apigateway:${AWS::Region}:dynamodb:action/Scan"
responses:
default:
statusCode: "200"
responseTemplates:
application/json: |-
[
#foreach ($item in $input.path('$.Items'))
{
"id": "$item.id.N",
"name": "$item.name.S"
}
#if($foreach.hasNext), #end
#end
]
requestTemplates:
application/json: !Sub |
{
"TableName": "${HeroesTable}",
"ScanFilter": {
"name": {
"AttributeValueList":[ {"S":"$input.params('name')"} ],
"ComparisonOperator": "CONTAINS"
}
}
}
passthroughBehavior: when_no_templates
httpMethod: POST
type: aws
Die 'aws' Service-Integration beschreibt, welche API aufgerufen werden soll, z.B. die DynamoDB 'Scan' API. Das requestTemplate erstellt eine API-Anfrage und verwendet einen Parameter aus der Anfrage. Die DynamoDB 'Scan'-Antwort wird durch das responseTemplate in eine json-Antwort umgewandelt und verwendet die Syntax der Velocity Template Language.
Fazit
AWS Gateway Integrations macht es einfach, Backends mit einer API-Spezifikation zu integrieren. API Gateway kann mit AWS-Services (aws), http-Services (http, http_proxy), Lambda (aws_proxy) integrieren und kann direkt antworten (mock). aws-cfn-update ermöglicht es uns, alle Spezifikationen in Dateien zu trennen und in einer CloudFormation-Vorlage zusammenzuführen, wenn der Stack bereitgestellt wird. Dies ermöglicht wartbare Projekte und wiederverwendbare Skripte.
Verfasst von
Dennis Vriend
Unsere Ideen
Weitere Blogs
Contact




