Go to file
dzikafoczka 0ad7e25c09 rest
2024-12-22 21:14:13 +01:00
README.md rest 2024-12-22 21:13:57 +01:00
test.ipynb rest 2024-12-22 21:14:13 +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:
    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