aws_rest/README.md
dzikafoczka 39d4fd1d7d rest
2024-12-22 21:13:57 +01:00

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