README.md | ||
test.ipynb |
AWS REST Web Service
Instrukcja uruchomienia web serwisu RESTowego na platformie AWS przy użyciu AWS Lambda
, API Gateway
oraz DynamoDB
:
-
Utwórz tabelę w
DynamoDB
:- Przejdź do konsoli AWS i wybierz usługę
DynamoDB
. - Kliknij przycisk
Create table
. - Wprowadź nazwę tabeli:
Posts
. - Wprowadź klucz główny:
id
typuString
. - Kliknij przycisk
Create
.
- Przejdź do konsoli AWS i wybierz usługę
-
Utwórz funkcję w
AWS Lambda
do obsługi żądańCRUD
:- Przejdź do konsoli AWS i wybierz usługę
Lambda
. - Kliknij przycisk
Create function
. - Wybierz opcję
Author from scratch
. - Wprowadź nazwę funkcji, np.
postsCRUD
. - Wybierz runtime, np.
Python 3.13
. - W sekcji
Change default execution role
wybierz opcjęUse an existing role
i wybierz rolęLabRole
. - Kliknij przycisk
Create function
. - Wklej poniższy kod do edytora funkcji:
import json import boto3 from decimal import Decimal dynamodb = boto3.resource("dynamodb") table = dynamodb.Table('Posts') def lambda_handler(event, context): print(event) body = {} statusCode = 200 try: # Endpoint: DELETE /posts/{id} if event['routeKey'] == "DELETE /posts/{id}": table.delete_item( Key={'id': event['pathParameters']['id']} ) body = {"message": f"Deleted item with id {event['pathParameters']['id']}"} # Endpoint: GET /posts/{id} elif event['routeKey'] == "GET /posts/{id}": response = table.get_item( Key={'id': event['pathParameters']['id']} ) if 'Item' in response: body = response['Item'] else: statusCode = 404 body = {"error": "Item not found"} # Endpoint: GET /posts elif event['routeKey'] == "GET /posts": response = table.scan() items = response.get('Items', []) body = items # Endpoint: POST /posts elif event['routeKey'] == "POST /posts": requestJSON = json.loads(event['body']) table.put_item( Item={ 'id': str(requestJSON['id']), # DynamoDB keys must be strings 'userId': str(requestJSON['userId']), 'title': requestJSON['title'], 'body': requestJSON['body'] } ) body = {"message": f"Created item with id {requestJSON['id']}"} # Endpoint: PUT /posts/{id} elif event['routeKey'] == "PUT /posts/{id}": requestJSON = json.loads(event['body']) table.update_item( Key={'id': event['pathParameters']['id']}, UpdateExpression="SET userId = :userId, title = :title, body = :body", ExpressionAttributeValues={ ':userId': str(requestJSON['userId']), ':title': requestJSON['title'], ':body': requestJSON['body'] } ) body = {"message": f"Updated item with id {event['pathParameters']['id']}"} # Unsupported route else: statusCode = 400 body = {"error": f"Unsupported route: {event['routeKey']}"} except Exception as e: statusCode = 500 body = {"error": str(e)} # Return the response return { "statusCode": statusCode, "headers": { "Content-Type": "application/json" }, "body": json.dumps(body) }
- Przejdź do konsoli AWS i wybierz usługę
-
Utwórz HTTP API w
API Gateway
do przekierowywania żądań do funkcjiAWS Lambda
:- Przejdź do konsoli AWS i wybierz usługę
API Gateway
. - Kliknij przycisk
Create API
. - Wybierz opcję
HTTP API
. - Wprowadź nazwę API, np.
PostsAPI
. - Przejdź przez formularz i utwórz API.
- Utwórz endpointy dla żądań
GET
,POST
,PUT
iDELETE
, np.:
GET /posts GET /posts/{id} POST /posts PUT /posts/{id} DELETE /posts/{id}
- Utwórz i przypisz integrację z funkcją
AWS Lambda
dla każdego endpointu (wybierz utworzoną wcześniej funkcję).
- Przejdź do konsoli AWS i wybierz usługę
-
I gotowe. Możesz teraz uruchomić skrypt testowy
test.ipynb
do testowania web serwisu RESTowego. Pamiętaj, by zmienić adres URL API w skrypcie na Twój adres URL.