2024-12-22 21:11:54 +01:00
## AWS REST Web Service
Instrukcja uruchomienia web serwisu RESTowego na platformie AWS przy użyciu `AWS Lambda` , `API Gateway` oraz `DynamoDB` :
1. 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` typu `String` .
- Kliknij przycisk `Create` .
2. 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:
```python
2024-12-22 21:13:57 +01:00
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
2024-12-22 21:11:54 +01:00
try:
# Endpoint: DELETE /posts/{id}
if event['routeKey'] == "DELETE /posts/{id}":
table.delete_item(
2024-12-22 21:13:57 +01:00
Key={'id': event['pathParameters']['id']} # id jako string
2024-12-22 21:11:54 +01:00
)
body = {"message": f"Deleted item with id {event['pathParameters']['id']}"}
# Endpoint: GET /posts/{id}
elif event['routeKey'] == "GET /posts/{id}":
response = table.get_item(
2024-12-22 21:13:57 +01:00
Key={'id': event['pathParameters']['id']} # id jako string
2024-12-22 21:11:54 +01:00
)
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
2024-12-22 21:13:57 +01:00
# Endpoint: POST /posts (automatyczne generowanie id)
2024-12-22 21:11:54 +01:00
elif event['routeKey'] == "POST /posts":
requestJSON = json.loads(event['body'])
2024-12-22 21:13:57 +01:00
# Pobierz największe istniejące id
response = table.scan()
items = response.get('Items', [])
max_id = max((int(item['id']) for item in items if item['id'].isdigit()), default=0)
# Wygeneruj nowe id
new_id = str(max_id + 1)
# Utwórz nowy wpis
new_item = {
'id': new_id,
'userId': str(requestJSON['userId']),
'title': requestJSON['title'],
'body': requestJSON['body']
}
table.put_item(Item=new_item)
# Zwróć utworzony obiekt w odpowiedzi
body = new_item
2024-12-22 21:11:54 +01:00
# Endpoint: PUT /posts/{id}
elif event['routeKey'] == "PUT /posts/{id}":
requestJSON = json.loads(event['body'])
2024-12-22 21:13:57 +01:00
# Aktualizacja danych w tabeli
2024-12-22 21:11:54 +01:00
table.update_item(
2024-12-22 21:13:57 +01:00
Key={'id': event['pathParameters']['id']}, # id jako string
2024-12-22 21:11:54 +01:00
UpdateExpression="SET userId = :userId, title = :title, body = :body",
ExpressionAttributeValues={
':userId': str(requestJSON['userId']),
':title': requestJSON['title'],
':body': requestJSON['body']
}
)
2024-12-22 21:13:57 +01:00
# Pobranie zaktualizowanego obiektu
response = table.get_item(
Key={'id': event['pathParameters']['id']}
)
if 'Item' in response:
body = response['Item']
else:
statusCode = 404
body = {"error": "Updated item not found"}
2024-12-22 21:11:54 +01:00
# 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)
}
```
3. Utwórz HTTP API w `API Gateway` do przekierowywania żądań do funkcji `AWS 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` i `DELETE` , np.:
```
GET /posts
GET /posts/{id}
POST /posts
PUT /posts/{id}
DELETE /posts/{id}
```
2024-12-22 21:12:51 +01:00
- Utwórz i przypisz integrację z funkcją `AWS Lambda` dla każdego endpointu (wybierz utworzoną wcześniej funkcję).
2024-12-22 21:11:54 +01:00
4. 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.
### Materiały
* https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-dynamo-db.html#http-api-dynamo-db-create-table