147 lines
5.1 KiB
Markdown
147 lines
5.1 KiB
Markdown
## 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
|
|
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']} # id jako string
|
|
)
|
|
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']} # id jako string
|
|
)
|
|
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 (automatyczne generowanie id)
|
|
elif event['routeKey'] == "POST /posts":
|
|
requestJSON = json.loads(event['body'])
|
|
|
|
# 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
|
|
|
|
# Endpoint: PUT /posts/{id}
|
|
elif event['routeKey'] == "PUT /posts/{id}":
|
|
requestJSON = json.loads(event['body'])
|
|
|
|
# Aktualizacja danych w tabeli
|
|
table.update_item(
|
|
Key={'id': event['pathParameters']['id']}, # id jako string
|
|
UpdateExpression="SET userId = :userId, title = :title, body = :body",
|
|
ExpressionAttributeValues={
|
|
':userId': str(requestJSON['userId']),
|
|
':title': requestJSON['title'],
|
|
':body': requestJSON['body']
|
|
}
|
|
)
|
|
|
|
# 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"}
|
|
|
|
# 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}
|
|
```
|
|
- Utwórz i przypisz integrację z funkcją `AWS Lambda` dla każdego endpointu (wybierz utworzoną wcześniej funkcję).
|
|
|
|
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 |