Pular para o conteúdo

Infraestrutura CDK

O AWS CDK é um framework para definir infraestrutura em nuvem através de código e provisioná-la utilizando AWS CloudFormation.

O gerador de infraestrutura TypeScript cria uma aplicação AWS CDK escrita em TypeScript. A aplicação gerada inclui práticas recomendadas de segurança através de verificações com CFN Guard.

Você pode gerar um novo projeto de infraestrutura de duas formas:

  1. Instale o Nx Console VSCode Plugin se ainda não o fez
  2. Abra o console Nx no VSCode
  3. Clique em Generate (UI) na seção "Common Nx Commands"
  4. Procure por @aws/nx-plugin - ts#infra
  5. Preencha os parâmetros obrigatórios
    • Clique em Generate
    Parâmetro Tipo Padrão Descrição
    name Obrigatório string - The name of the application.
    ruleSet string aws_prototyping Rule set to validate your AWS resources with.
    directory string packages The directory of the new application.

    O gerador criará a seguinte estrutura de projeto no diretório <directory>/<name>:

    • Directorysrc
      • main.ts Ponto de entrada da aplicação que instancia estágios do CDK para implantação
      • Directorystages Definições de estágios do CDK
        • application-stage.ts Define uma coleção de stacks para implantação em um estágio
      • Directorystacks Definições de stacks do CDK
        • application-stack.ts Stack principal da aplicação
    • cdk.json Configuração do CDK
    • project.json Configuração do projeto e targets de build

    Você pode começar a escrever sua infraestrutura CDK dentro de src/stacks/application-stack.ts, por exemplo:

    src/stacks/application-stack.ts
    import { Stack, StackProps } from 'aws-cdk-lib';
    import { Bucket } from 'aws-cdk-lib/aws-s3'
    import { Construct } from 'constructs';
    export class ApplicationStack extends Stack {
    constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);
    // Declare sua infraestrutura aqui
    new Bucket(this, 'MyBucket');
    }
    }

    Você notará que o arquivo principal src/main.ts instancia um Stage do CDK chamado <namespace>-sandbox. Este estágio é destinado para seus próprios testes e desenvolvimento.

    src/main.ts
    new ApplicationStage(app, 'project-sandbox', {
    env: {
    account: process.env.CDK_DEFAULT_ACCOUNT,
    region: process.env.CDK_DEFAULT_REGION,
    },
    });

    Você pode adicionar mais estágios, por exemplo, pode definir estágios beta e prod que implantam em ambientes separados:

    src/main.ts
    new ApplicationStage(app, 'project-beta', {
    env: {
    account: '123456789012', // conta beta
    region: 'us-west-2',
    },
    });
    new ApplicationStage(app, 'project-prod', {
    env: {
    account: '098765432109', // conta prod
    region: 'us-west-2',
    },
    });

    Um Stage define uma coleção de stacks que devem ser implantadas juntas para compor sua aplicação. Você pode instanciar quantas stacks quiser dentro de um estágio, por exemplo:

    src/stages/application-stage.ts
    import { Stage, StageProps } from 'aws-cdk-lib';
    import { Construct } from 'constructs';
    import { BackendStack } from '../stacks/backend-stack.js';
    import { FrontendStack } from '../stacks/frontend-stack.js';
    /**
    * Define uma coleção de CDK Stacks que compõem sua aplicação
    */
    export class ApplicationStage extends Stage {
    constructor(scope: Construct, id: string, props?: StageProps) {
    super(scope, id, props);
    new BackendStack(this, 'Backend', {
    crossRegionReferences: true,
    })
    new FrontendStack(this, 'Frontend', {
    crossRegionReferences: true,
    });
    }
    }

    Se você usou os geradores tRPC API ou FastAPI para criar APIs, notará que já tem alguns constructs disponíveis em packages/common/constructs para implantá-los.

    Se, por exemplo, você criou uma API tRPC chamada my-api, pode simplesmente importar e instanciar o construct para adicionar toda a infraestrutura necessária:

    src/stacks/application-stack.ts
    import * as cdk from 'aws-cdk-lib';
    import { Construct } from 'constructs';
    import { MyApi } from ':my-scope/common-constructs';
    export class ApplicationStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    // Adicione a infraestrutura para sua API
    new MyApi(this, 'MyApi', {
    integrations: MyApi.defaultIntegrations(this).build(),
    });
    }
    }

    Se você usou o gerador CloudScape website, notará que já tem um construct em packages/common/constructs para implantá-lo. Por exemplo:

    src/stacks/application-stack.ts
    import * as cdk from 'aws-cdk-lib';
    import { Construct } from 'constructs';
    import { MyWebsite } from ':my-scope/common-constructs';
    export class ApplicationStack extends cdk.Stack {
    constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    // Adicione a infraestrutura para seu website
    new MyWebsite(this, 'MyWebsite');
    }
    }

    É importante garantir que o website seja declarado após quaisquer constructs de API para que a Configuração de Runtime do website inclua todas as configurações da API.

    Como parte do seu target build, além de executar os targets padrão de compilação, lint e testes, seu projeto de infraestrutura é sintetizado para CloudFormation. Isso também pode ser executado separadamente através do target synth:

    Terminal window
    pnpm nx run <my-infra>:synth

    Você encontrará sua montagem de nuvem sintetizada na pasta raiz dist, em dist/packages/<my-infra-project>/cdk.out.

    Se você está implantando uma aplicação CDK em uma conta AWS pela primeira vez, será necessário fazer o bootstrap primeiro.

    Primeiro, certifique-se de ter configurado credenciais para sua conta AWS.

    Em seguida, você pode usar o comando cdk bootstrap:

    Terminal window
    npx cdk bootstrap aws://<account-id>/<region>

    Para mais detalhes, consulte a documentação do CDK.

    Após um build, você pode implantar sua infraestrutura na AWS usando o target deploy.

    Primeiro, certifique-se de ter configurado credenciais para sua conta AWS.

    Em seguida, execute o target de deploy:

    Terminal window
    pnpm nx run <my-infra>:deploy <my-infra>-sandbox/*

    Use o target deploy-ci se estiver implantando na AWS como parte de um pipeline CI/CD.

    Terminal window
    pnpm nx run <my-infra>:deploy-ci my-stage/*

    Este target difere ligeiramente do target deploy normal por garantir que a montagem de nuvem pré-sintetizada seja implantada, em vez de sintetizar durante a execução. Isso ajuda a evitar problemas potenciais de não-determinismo devido a alterações em versões de pacotes, garantindo que cada estágio do pipeline implante usando a mesma montagem de nuvem.

    Use o target destroy para remover seus recursos:

    Terminal window
    pnpm nx run <my-infra>:destroy <my-infra>-sandbox/*

    Para mais informações sobre o CDK, consulte o Guia do Desenvolvedor CDK e a Referência da API.