Skip to content

Latest commit

 

History

History
 
 

CDK

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

CDK step by step

Opprett et C9 miljø

Gå til AWS konsollen og søk på c9. Opprett et nytt miljø med dine initialer som prefiks til miljø-navnet. La alle valgene stå som default og trykk next step og create environment.

Opprett CDK prosjekt

I ditt nye utviklingsmiljø, lag et unikt prefiks med dine initialer og lag en mappe til din CDK-app:

PREFIX="dine initialer her"
mkdir ${PREFIX}-cdk
cd ${PREFIX}-cdk

Vi kan opprette strukturen til et nytt cdk-prosjekt med denne kommandoen:

cdk init app "${PREFIX}-cdk-sertifiseringer" --language python

Denne kommandoen har også opprettet et virtuelt miljø som vi kan bruke for python-dependencies. Nå vil vi gjøre det klart til bruk. Med CDK versjon 2.x, alle stabile biblioteker følger med aws-cdk-pakken. Vi skal også ta i bruk noen "experimental" biblioteker. Disse kan få ødeleggende oppdateringer fremover, men fungerer for oss for nå. Vi kan legge dem til i requirements.txt-filen:

echo "aws-cdk.aws-apigatewayv2-alpha==2.3.0a0" >> requirements.txt
echo "aws-cdk.aws-apigatewayv2-integrations-alpha==2.3.0a0" >> requirements.txt

Så kan vi aktivere og bruke det nye miljøet.

source .venv/bin/activate
pip install -r requirements.txt

Sjekk at alt er ok ved å skrive

cdk ls

Videre trenger vi å kopiere inn koden som skal brukes i lambda-funksjonene. La oss lage en egen mappe for dette, og kopiere inn innholdet fra de tilsvarende filene som ligger i git-mappen.

mkdir ${PREFIX}_cdk/functions
touch ${PREFIX}_cdk/functions/upload-lambda.js
touch ${PREFIX}_cdk/functions/sertifisering-lambda.js

Kode med CDK

Nå som oppsettet er på plass, kan vi begynne å fylle inn <prefix>_cdk/<prefix>_cdk_stack.py-filen! En fullstendig fil kan kopieres fra git-mappen, men husk på å forandre på klassenavnet så det matcher stack-navnet ditt i app.py!

Først kan vi begynne med å importere det vi trenger:

from aws_cdk import (
    Stack,
    CfnOutput,
    aws_s3 as s3,
    aws_dynamodb as dynamodb,
    RemovalPolicy,
    aws_iam as iam,
    aws_lambda as _lambda,
    aws_apigatewayv2_alpha as api,
    aws_apigatewayv2_integrations_alpha as api_integrations
)
from constructs import Construct

Dersom dette gir problemer, se om du har klart å installere alle bibliotekene du trenger med pip freeze. Sjekk at du bruker det virtuelle miljøet!

Videre lager vi et prefiks slik at du kan enkelt kjenne igjen dine ressurser i AWS-konsollen. Dette må være samme prefiks som du brukte tidligere!:

# Sett inn dine initialer her!
custom_prefix = "mine-initialer"

Nå kan vi begynne å opprette ressurser inne i ___init___()-konstruktøren! La oss begynne med å lage en S3-bucket som skal hoste nettsiden.

        # S3 BUCKET
        bucket_name = f"{custom_prefix}-cdk-sertifiseringer-bucket"
        
        bucket = s3.Bucket(self, 
            bucket_name, 
            bucket_name = bucket_name,
            website_index_document = "index.html",
            removal_policy = RemovalPolicy.DESTROY,
            auto_delete_objects = True,
        )
        
        bucket.add_to_resource_policy(
            iam.PolicyStatement(
                actions = ["s3:*"],
                principals = [iam.AnyPrincipal()],
                resources = [bucket.bucket_arn + "/*"]
            )
        )

Vi trenger også et DynamoDB Table.

        # DYNAMODB
        table_name = f"{custom_prefix}-cdk-sertifiseringer"
        
        database = dynamodb.Table(self, 
            table_name,
            table_name = table_name,
            partition_key = dynamodb.Attribute(name="id", type=dynamodb.AttributeType.STRING),
            removal_policy = RemovalPolicy.DESTROY,
        )
        
        database.auto_scale_read_capacity(
            min_capacity = 1,
            max_capacity = 5
        ).scale_on_utilization(target_utilization_percent=75)
        
        database.auto_scale_write_capacity(
            min_capacity = 1,
            max_capacity = 5
        ).scale_on_utilization(target_utilization_percent=75)

Her setter vi også autoskalering på tabellen.

Vi trenger også to lambda-funksjoner. Her kan vi referere til javascript-funksjonene vi la inn i functions-mappen.

        # LAMBDA
        upload_func = _lambda.Function(self, 
            f"{custom_prefix}-cdk-sertifisering-upload",
            function_name = f"{custom_prefix}-cdk-sertifisering-upload",
            code = _lambda.Code.from_asset(f"{custom_prefix}_cdk/functions"),
            handler = "upload-lambda.handler",
            runtime = _lambda.Runtime.NODEJS_14_X,
            environment = {
                "S3_BUCKET_NAME": bucket_name
            }
        )
        
        database_func = _lambda.Function(self, 
            f"{custom_prefix}-cdk-sertifisering-db",
            function_name = f"{custom_prefix}-cdk-sertifisering",
            code = _lambda.Code.from_asset(f"{custom_prefix}_cdk/functions"),
            handler = "sertifisering-lambda.handler",
            runtime = _lambda.Runtime.NODEJS_14_X,
            environment = {
                "TABLE_NAME": table_name
            }
        )

Hittil har vi ikke laget noen IAM-ressurser. Ved mindre vi skal gjøre noe veldig spesifikt, trenger vi ikke det heller! De blir laget for oss, men vi kan likevel spesifisere nødvendige tilganger. La oss gi database-funksjonen lese og skrive-tilgang til DynamoDB tablet vårt:

        database.grant_read_write_data(database_func)

Ingen knoting i IAM-konsollen nødvendig.

Til sist trenger vi en API gateway som nettsiden kan bruke til å interagere med backenden vår. Til dette bruker vi et HTTP API. Dette er per nå en eksperimentell del av CDK for python, og kan gjennomgå brytende forandringer i fremtiden.

        # API
        http_api = api.HttpApi(self, 
            f"{custom_prefix}-cdk-sertifiseringer-api",
            api_name = f"{custom_prefix}-cdk-sertifiseringer-api",
            cors_preflight = api.CorsPreflightOptions(
                allow_headers = ["*"],
                allow_methods = [api.CorsHttpMethod.ANY],
                allow_origins = ["*"]
            )
        )
        
        http_api.add_routes(
            path = "/sertifiseringer",
            methods = [api.HttpMethod.GET, api.HttpMethod.PUT],
            integration = api_integrations.HttpLambdaIntegration("DatabaseIntegration", database_func)
        )
        
        http_api.add_routes(
            path = "/sertifiseringer/{id}",
            methods = [api.HttpMethod.GET, api.HttpMethod.DELETE],
            integration = api_integrations.HttpLambdaIntegration("DatabaseIntegrationPathVar", database_func)
        )
        
        http_api.add_routes(
            path = "/upload",
            methods = [api.HttpMethod.PUT],
            integration = api_integrations.HttpLambdaIntegration("UploadIntegration", upload_func)
        )

For å enkelt se hva den resulterende endpoint URL-en er, kan vi outputte det til slutt.

        CfnOutput(self, "API_URL", value=http_api.api_endpoint)

Deployment

Når alt er på plass, sjekk at alt fungerer ved å igjen skrive

cdk ls

Dersom man deployer en og en forandring, kan man se hvilke ressurser som er nye og hvilke som vil slettes med kommandoen

cdk diff

Cloud Development Kit kompilerer python kode (i vårt tilfelle) til CloudFormation. Dersom du vil se den underliggende CloudFormation-koden kan du skrive

cdk synth

Til slutt er det på tide å se om det fungerer! For å deploye applikasjonen din, skriv

cdk deploy

Dette kan ta en stund, men du burde få løpende oppdateringer på hva som opprettes og rives ned. Du kan også sjekke dette i AWS-konsollen ved å søke på CloudFormation og finne din stack.

Testing

Dersom alt gikk bra, kan vi teste resultatet ved å prøve å gjenskape sertifisering-nettsiden. På din lokale maskin, naviger til git-repoet og opprett et shell i sertifisering-react-app-mappen. Vi trenger å gjøre om på en linje i src/api.js-filen, nemlig å sette apiURL til en den riktige verdien. Du finner API Gateway URLen som output til cdk deploy kommandoen, eller ved å gå i AWS-konsollen, søke på api gateway og trykke på din gateway. Kopier linken under Invoke URL og lim inn i api.js-filen.

Når URLen er på plass kan vi kjøre

npm install
npm run build

Finn din S3-bucket i AWS-konsollen (søk på s3), og last opp alle filene som finnes i build-mappen.

Til sist kan du gå under Properties på din S3 bucket, scrolle helt ned til bunnen og trykke på lenken under Static website hosting for å finne nettsiden!

Cleanup

For å slette alle ressursene du har opprettet med CDK, kan du skrive følgende i C9-terminalen:

cdk destroy

Når det er gjort kan du terminere EC2-instansen og C9-miljøet ved å gå til AWS-konsollen, søke på C9, velge ditt miljø og trykke på Delete.