Olá pessoal, sejam muito bem-vindos a mais uma aula. E nessa aula nós vamos criar o nosso primeiro projeto CDK, inclusive nós faremos também o deploy dos primeiros recursos definidos nesse projeto. Então, na verdade, nós teremos somente um recurso, que será o Bucket S3, assim como nós fizemos na aula anterior da nossa Stack em CloudFormation. Primeiro, nós vamos entender o que nós precisamos, quais são os pré-requisitos para nós começarmos a trabalhar com a AWS CDK e é por isso que eu estou com a documentação aberta. Então, procurem aí, eu recomendo que vocês venham uma olhada também nessa documentação com mais atenção, com mais calma, mas procurem pela documentação do Cloud Development Kit versão 2, que é a versão mais atual. E aqui nós temos o nosso Getting Started. Nós temos alguns tópicos aqui que são muito importantes. Primeiro temos os pré-requisitos. Ele recomenda alguns artigos aqui, os quais nós devemos ter. Novamente, recomendo que você leia, mas nós já falamos sobre alguns deles aqui nas aulas anteriores. Nós precisamos preparar o nosso ambiente local. E aqui ele diz que nós precisamos ter o Node.js instalado, versão 14.15.0 ou versão mais atual do Node.js. Então, você pode navegar aqui, fazer o download e seguir as instruções de instalação. Claro que eu não vou passar por isso, porque muito provavelmente você já tem até o Node.js e o NPM instalado na sua máquina. Em seguida, nós temos aqui ele falando sobre as linguagens de programação, nós chegaremos neste ponto ainda, mas eu gostaria de falar aqui sobre esses passos, sobre esses steps aqui. O step 1 é a criação de uma conta na AWS, coisa que nós já fizemos nas sessões anteriores. Em seguida, nós precisamos configurar o nosso acesso programático, que nós já também fizemos nas aulas anteriores, nas sessões anteriores, onde nós configuramos o nosso profile, as nossas credenciais. Então, beleza. Temos aqui agora a instalação do AWS CDK CLI. Agora, este AWS CDK CLI não é aquele mesmo CLI que nós instalamos, ele é o command line interface para o CDK, para o Cloud Development Kit. Então, nós precisamos dar uma atenção aqui para esse passo 3, que é bem simples, na verdade. Nós vamos instalar aqui o AWS CDK utilizando o NPM, vamos instalar essa ferramenta globalmente, e o comando é bem simples, é um npm install-gaws-cdk. Eu já fiz a instalação na minha máquina, por isso eu não vou rodar aqui. Em seguida, você pode confirmar rodando o CDK menos menos version, aqui ele mostra como fazer a desinstalação caso você precise, e beleza. Em seguida nós temos aqui o step 4, que é o bootstrap do nosso environment, do nosso ambiente. Então para nós trabalharmos com o CDK, nós precisamos executar essa etapa chamada Bootstrap, que nada mais é do que a criação de uma stack CloudFormation na nossa conta, na região específica com a qual nós queremos trabalhar, onde ele vai criar ali nessa stack alguns recursos necessários para a execução desses projetos, para trabalhar com esses projetos CDK. Ele vai criar, por exemplo, um bucket lá no S3, para armazenar os artefatos gerados aí pelos nossos projetos CDK. Ele vai criar também algumas roles necessárias para a criação, para a exclusão, para a modificação dos recursos que nós vamos definir nos nossos projetos. Então é simplesmente a criação de alguns recursos auxiliares para que o CDK consiga trabalhar, beleza? E nós precisamos fazer isso somente uma única vez para a nossa conta na região na qual nós vamos trabalhar. Caso você trabalhe com mais de uma conta ou com mais de uma região em contas diferentes, ou na mesma conta, você precisa fazer isso para cada região e para cada conta. Então eu vou executar aqui, na verdade eu já executei, mas eu vou mostrar aqui para vocês a execução deste comando. Deixa eu só dar um clear aqui. Eu vou rodar aqui esse decabo do strap, e aqui nós precisamos informar a AWS, dois pontos, barra, barra, o account ID, o ID da nossa conta, e nós podemos observar esse ID aqui, quando nós logamos no console da AWS, do lado direito nós temos o nosso usuário, ao clicarmos no nosso usuário nós temos aqui o account ID, nós podemos copiar esta conta, vamos voltar aqui ao terminal, beleza, barra, e agora nós precisamos informar a região, tá? E a região com a qual eu vou trabalhar é essa região, o S, o S2. Você pode escolher a região que a qual eu vou trabalhar é essa região US, USH2. Você pode escolher a região que você quiser. Isso aqui é algo mais arbitrário. Vou executar aqui. Na verdade, tem um detalhe que eu esqueci. Inclusive, eu tenho uma mensagem de erro aqui, que é o nosso profile. Eu tenho vários profiles configurados aqui na minha máquina. É por isso, inclusive, que ele deu um erro aqui, porque ele pegou o profile padrão, que não é o profile correspondente a esta conta que eu informei. Então eu vou simplesmente colocar aqui profile e vou especificar default. Com certeza, caso você não tenha mais de um profile na sua máquina, você não terá esse erro. Então caso você tenha somente o profile, você vai executar aqui sem formar esse profile e beleza, você não terá nenhum problema. Caso você tenha mais de um profile, você precisa especificar o profile. Bom, nós temos aqui já uma mensagem de sucesso dizendo que já foi feito o bootstrap desse environment e não há nenhuma alteração. Então, no meu ambiente já está tudo ok. Quando você executar aí no seu ambiente, você verá que uma nova stack foi criada. Então, eu tenho aqui a página do CloudFormation aberta e nós temos o CDK Toolkit, que é a stack que foi criada, a executaria de comando CDK Bootstrap. E nós podemos observar quais foram os eventos aqui que foram gerados e nós temos os recursos, tá? Então nós podemos observar aqui que ele criou um parâmetro lá no Parameter Store, ele criou o Goals como eu mencionei, ele cria também aqui um repositório no ECR e ele cria também um Bucket, tá? Então esses recursos aqui são simplesmente para dar o Bootstrap para dar o pontapé inicial aqui na nossa conta. E é isso. Agora nós temos aqui o nosso ambiente já configurado, beleza? Então nós vamos agora, em seguida, passar para a criação do nosso projeto de fato. E eu farei o seguinte, eu vou navegar aqui até um diretório que eu tenho aqui na minha máquina. Deixa eu verificar se é esse daqui. Deixa eu abrir aqui o diretório dos meus projetos. Então, beleza. Aí, já estou no diretório. Perfeito. Cdk. Deixa eu aumentar aqui o terminal. Aí, Agora sim. Vou criar aqui um outro diretório, um diretório específico para o nosso projeto, que eu vou chamar aqui de uma forma bem criativa de example. Beleza? Temos aqui o nosso diretório example e agora nós vamos rodar um comando do CDK, que é o CDK init. Porém, nesse comando nós precisamos passar um do CDK, que é o CDK init. Porém, nesse comando, nós precisamos passar um parâmetro, que é o parâmetro language, que vai ser a linguagem com a qual nós vamos trabalhar. Bom, como eu já mencionei nas aulas anteriores, que eu trabalho atualmente com C Sharp. Então, essa é a linguagem que eu tenho mais familiaridade, que eu já tenho uma certa expertise, então tem muitos anos que eu tenho mais familiaridade, que eu já tenho uma certa expertise, então tem muitos anos que eu trabalho com ela, e por isso, claro, eu ficaria muito mais confortável trabalhando com o C Sharp. Porém eu sei que não é a linguagem mais comum, e que atualmente muita gente está trabalhando com Python ou com JavaScript quando se fala em CDK, tem se tornado cada vez mais comum. E essas linguagens são de fato mais simples, de uma pessoa que nunca viu essas linguagens são de fato mais simples de uma pessoa que nunca viu essas linguagens de começar a aprender, tá? Talvez uma pessoa que nunca trabalhou com C Sharp vai ter uma certa dificuldade ali de entender tudo que está acontecendo, tá? Por isso, eu resolvi para os nossos exemplos, trabalhar com Python, tá? Que eu acho que é uma linguagem bem simples. Caso você não tenha trabalhado com Python, muito provavelmente você não terá dificuldades em absorver o conteúdo, em entender o código que nós vamos criar aqui, mas fique à vontade, eu sugiro que você, após ver estes exemplos, que você tente reescrever o projeto na sua linguagem favorita. A diferença das classes e de como você cria os recursos entre uma linguagem e outra é muito pouca. Você tem todas essas documentações, todos esses recursos muito bem documentados pela própria AWS. Então, nós vamos rodar aqui este comando cdk init app language python. Vamos executar aqui. Ele aqui ele inclusive já cria aqui o nosso virtual environment beleza vamos só dar um activate aqui no nosso no nosso ambiente e nós vamos também fazer o install das nossas dependências tá ah e claro como nós estamos trabalhando com python você precisa ter o python instalado aí na sua máquina, beleza? Então, eu sugiro que você dê uma olhada aí, caso você ainda não tenha, procure como realizar a instalação do Python na sua máquina. E beleza, temos aqui o nosso projeto já configurado, com todos os nossos packages já instalados, e agora eu vou abrir aqui o nosso projeto no Visual Studio Code. E agora eu vou abrir aqui o nosso projeto no Visual Studio Code. Deixa eu aumentar a fonte e deixa eu fazer também um ajuste aqui da nossa tela, tá? Para ficar fácil de nós visualizarmos. Beleza, acho que eu posso diminuir um pouquinho. E aqui temos o nosso projeto, tá? Temos aqui, ele criou um diretório example, onde ele já criou um arquivo example underline stack então nós já temos aqui uma stack, esse nome já é sugestivo nós aprendemos o que é uma stack na aula anterior, e aqui nós temos uma stack sendo definida agora em Python, então ao invés de nós termos um template CloudFormation nós vamos trabalhar com o Python para definir esseses novos recursos. Nós temos aqui também um diretório de testes e nós temos aqui um arquivo app.py. Então, uma classe aqui, um módulo Python app, onde nós temos o seguinte, nós temos a importação aqui de alguns módulos, e nós temos aqui o nosso example stack sendo importado aqui do nosso example stack. Beleza, nós temos aqui essa importação, ele traz aqui alguns comentários sobre o ambiente, sobre configurar a conta, configurar a região, mas nós vamos apagar esses comentários, porque eles não são necessários aqui, nós não vamos precisar de fazer essa configuração, nós vamos utilizar a própria conta e a região default que nós definimos lá no nosso profile, nas nossas credenciais, mas basicamente é isso. mas basicamente é isso, tá? Nós criamos aqui um app CDK a partir do módulo CDK e nós instanciamos a nossa stack, tá? Aqui nós passamos qual que é o nosso app, o app que foi criado. Então sempre que nós criamos um projeto em CDK, nós primeiro instanciamos um app, tá? Que seria a nossa aplicação, tá? Seria a instância da nossa aplicação, e aqui logo em seguida nós podemos instanciar as nossas stacks. Então nós vimos a criação de uma stack na aula anterior, aqui nós podemos definir várias stacks em um único projeto. Aqui no nosso caso nós temos somente o exemplo stack, onde nós passamos o nosso app, e passamos também o nome da nossa stack. Então esse daqui nada mais é do que o nome da stack que nós vamos criar então nós poderíamos por exemplo definir aqui fc-ifc aqui eu vou colocar cdk-test alguma coisa assim mas é claro que geralmente nós colocamos um nome aqui que se associa um pouco mais ao nome da nossa classe, ao nome do nosso exemplo stack aqui no nosso caso, mas para exemplificar eu vou deixar assim mesmo. Vamos navegar aqui a nossa stack, nós temos o construtor e aqui dentro do construtor é onde nós definimos os nossos recursos. Inclusive ele já traz aqui um exemplo, ele cria uma queue, então se nós quiséssemos criar uma queue lá no SQS, bastaria nós descomentarmos esse trecho de código. eu vou também apagar aqui esses imports beleza? e aqui só para nós relembrarmos eu vou abrir o nosso stack, o template que nós criamos na aula anterior então deixa eu pegar aqui template, beleza? temos aqui o template só para nós lembrarmos, onde nós criamos esse recurso com o nome aqui que referencia o nome da stack, colocamos o sufixo de bucket e nós simplesmente habilitamos aqui o versionamento e fazemos o output do nome do nosso bucket. Então é bem simples, a ideia é que a gente faça a mesma coisa para que a gente entenda como o CDK funciona, tá? Então vamos lá nós vamos voltar aqui no nosso example stack e aqui nós precisamos fazer a importação deste carinha aqui, AWS S3, porque nós vamos criar um bucket S3 e nós vamos chamar aqui de S3, vamos dar esse alias S3. Beleza? E aqui basta nós instanciarmos este recurso, instanciarmos essa classe. Então nós teremos aqui bucket é igual a um S3 bucket, tá? Que é a classe, na verdade, que nós precisamos instanciar. E nós vamos passar aqui self, nós precisamos passar a própria instância, a própria stack para este recurso. Nós em seguida especificamos o id, que seria este carinha aqui. Então nós vamos colocar aqui myS3Bucket. Beleza? Nós precisamos também informar o bucket name, como nós informamos aqui. Então nós passamos stack name e bucket. Então nós podemos fazer o seguinte. Como nós vimos aqui, nós passamos o nome da stack como segundo argumento que é este cara aqui, esse construct id então vamos fazer essa concatenação traço bucket e temos aqui já o nome do nosso bucket, e nós vamos colocar aqui version equal a true e beleza, temos aqui já o nosso bucket definido, então a ideia aqui é que tudo que você instancia de dentro deste módulo CDK, ele será a criação, será a definição de um recurso. Então se eu instancio um S3.bucket, eu estou dizendo que eu quero criar um bucket lá na minha infraestrutura. E eu posso passar aqui vários argumentos, então nós podemos referenciar a documentação para nós entendermos aqui o que nós podemos alterar. Mas basicamente, todas as propriedades que nós vimos lá do CloudFormation, que eu mostrei para vocês na documentação, nós podemos também especificar aqui. Às vezes vai ter alguma diferença, como nós temos aqui, por exemplo, no novo versionamento. Aqui no CloudFormation, no template, em email, nós temos versioning configuration e nós passamos aqui o status enabled. Já aqui no CloudFormation, ou melhor dizendo, aqui no CDK, nós temos essa propriedade version que nós passamos simplesmente true. Mas é basicamente isso e nós estamos trabalhando com Python. Então, nós podemos utilizar todos os recursos que o Python oferece. Se nós quiséssemos, por exemplo, criar aqui 10 buckets e passarmos o sufixo aqui de acordo com o índice desse bucket, passar aqui bucket 1, bucket 2, bucket 3 e assim por diante, nós poderíamos criar um for aqui dentro e fazer a criação desses 10 buckets. Então, tudo aquilo que a linguagem oferece, que o Python oferece, nós temos à disposição para nos auxiliar na criação da nossa infraestrutura. Por fim, assim como nós fizemos aqui no nosso template, nós teremos um output. E o output é definido da seguinte forma, nós precisamos desse CFM output, então nós vamos importá-lo aqui e nós vamos instanciar aqui o novo output. Eu não vou atribuir aqui nenhuma variável a este cara, vou simplesmente fazer essa instanciação porque nós não precisamos referenciar em lugar nenhum. Então eu passo o self aqui, lugar nenhum então eu passo self aqui em seguida eu passo o nome o nome do nosso output que seria o equivalente a essa chave, então eu vou passar aqui bucket name, nós passamos o valor dessa chave, então o nosso value ele vai ser aqui o nosso bucket ponto bucket name, então nós temos aqui todas as propriedades, aqui eu vou referenciar bucketName, e a descrição, nós podemos passar exatamente a mesma descrição, que é o nome do nosso bucketS3. E beleza, temos aqui já o nosso primeiro exemplo de projeto em CDK. Temos aqui a nossa stack definida. Já temos aqui ela referenciada no nosso app, então nós não precisamos fazer mais nenhuma alteração. Agora basta entender como nós fazemos o deploy dessa stack que foi definida no nosso projeto CDK. E isso é bem simples. Mas antes, antes de fato nós fazermos o deploy eu queria mostrar algo aqui para vocês exige um comando que é o comando cdk synth que vem de synthetize sintetizar algo o que ele faz? ele vai compilar, vamos dizer assim, compilar não a compilação mesmo do projeto, até porque Python não é um projeto compilado, mas ele vai transfer o Python desculpa porque Python não é um projeto compilado, mas ele vai transfer o Python, desculpa, ele não é uma linguagem compilada, mas o que ele faz aqui é transformar esse projeto CDK em um template CloudFormation, então quando nós executamos aqui CDK Synth dessa forma, nós vamos aguardar um pouquinho, nós veremos aqui o output de um CloudFormation, tá? Então, nós podemos observar aqui os recursos, assim como nós definimos aqui no nosso template, tá? Resources, aqui nós temos a chave, ele coloca um sufixo aqui aleatório, ele define o tipo, as três buckets, e as propriedades que ele define é o nome do bucket, aqui nós podemos observar que ele concatenou o nome da stack com um traço bucket, e ele especificou versioning configuration. Além disso, ele especifica também algumas outras propriedades, que não são propriedades específicas do bucket, mas sim desse recurso na nossa stack. Nós vamos comentar sobre essas propriedades aqui por enquanto, e ele também especifica alguns outros recursos, os metadeiras aqui, que são adicionados pelo próprio CDK. E temos também o nosso output aqui, com a referência ao nosso bucket. Inclusive, ele referencia da mesma forma como nós referenciamos, o nome aqui é diferente porque ele coloca esse sufixo. Temos algumas condições aqui, mas não precisamos nos atentar a isso. Então, agora ficou mais claro a associação que eu mencionei entre um stack CloudFormation e um projeto CDK. que eu mencionei entre um stack CloudFormation e um projeto CDK. Tudo que nós fazemos em um projeto CDK nada mais é do que a definição ou a forma automatizada de criar um template CloudFormation. Então quando nós instanciamos aqui no nosso exemplo stack instanciamos o bucket há uma sintetização que acontece quando nós rodamos o cdk-sint que cria este recurso que cria aqui um recurso no CloudFormation em CloudFormation de acordo com as propriedades que nós passamos então é basicamente isso se eu tivesse um for loop como eu mencionei, criando 10 buckets ele criaria 10 recursos CloudFormation no template. Então, eu acho que agora fica mais claro a associação entre uma coisa e outra, por isso que há uma associação entre essa abordagem mais imperativa e a abordagem declarativa do CloudFormation, por isso que faz muito mais sentido nós entendermos primeiro um pouquinho de como funciona o CloudFormation, para então nós entendermos como funciona o CDK, perfeito? E agora nós faremos de fato o nosso deploy e isso é muito simples, basta nós rodarmos aqui CDK deploy, nós precisamos passar o nosso profile vou passar aqui o profile default novamente caso você tenha mais de um profile e ele vai fazer o deploy na nossa conta de acordo com as credenciais especificadas neste profile quando nós só damos CDK deploy ele faz a sintetização de novo então esse CDK async você não precisa executar sempre simplesmente para você validar aqui o CloudFormation gerado mas quando você der um CDK ascent, você não precisa executar sempre, simplesmente para você validar aqui o Cloud Formation gerado, mas quando você der um CDK deploy, ele automaticamente fará a sintetização, ele vai criar este template CDK, ou este template Cloud Formation, melhor dizendo, então vai criar um stack de acordo com o nome que nós definimos lá no Cloud Formation e aqui quando nós rodamos o deploy, ele cria uma pasta cdk.out, onde nós podemos inclusive observar o template criado, o tal template CloudFormation. A diferença é que aqui ele define o arquivo em JSON, mas nós temos tudo aquilo que nós vimos na output do cdk.sync. Beleza? Recomendo que você dê uma olhada aqui também, para que você entenda o que está acontecendo. Vamos verificar aqui no nosso terminal, e aqui nós podemos observar que a nossa stack já foi feita o deploy da nossa stack. Então, se nós atualizarmos aqui na nossa conta, nós temos a stack criada com os recursos, sempre que nós criamos uma stack em CDK, ele vai adicionar esse CDK a metadata, tá? Mas não precisamos nos importar com isso. E aqui nós temos o nosso bucket. Ao navegarmos até o bucket, beleza? Um bucket normal, nas propriedades aqui nós vamos ver aqui o versionamento estabilitado conforme nós definimos. E é isso. Caso a gente altere qualquer coisa aqui no nosso projeto, basta nós executarmos o deploy novamente e essa stack será atualizada, tá bom? Uma outra coisa importante é que nós podemos definir aqui várias outras stacks, tá? Então eu poderia por exemplo, utilizar essa mesma stack, essa mesma classe example stack aqui, mas criar a partir dela uma outra stack cdk teste 2, tá? Então esse projeto aqui agora tem duas stacks. Nós podemos visualizar isso, por exemplo, rodando aqui o comando CDK-LS, o CDK-List. Ele vai fazer a sintetização aqui desse projeto e ele vai listar as stacks que nós definimos e aqui ele já consegue mostrar para nós as duas stacks definidas. A FC e a ACCDK teste e a teste 2. E agora, quando nós rodarmos um CDK deploy, nós vamos precisar informar a stack. Então, nós informamos a stack utilizando aqui o parâmetro stack, informamos o nome da stack, informamos o profile e beleza. Agora ele vai gerar aqui, ele vai fazer de novo a sintetização específica para essa stack e vai fazer o deploy. inclui mais de uma nós precisamos a precisamos especificar né a deixar ele ficar aqui provavelmente não não especificar esteque corretamente vamos verificar aqui qual seria o comando certo na sdk stack ah sim erro meu aqui, viu galera não precisa especificar stack, tá basta nós passarmos diretamente o nome da stack e, beleza ele já vai fazer aqui o deploy dessa stack específica, tá, não precisa de informar o parâmetro stack já que esse é o parâmetro default e basta nós passarmos aqui diretamente o nome da stack aqui ele já identificou que não houve nenhuma outra ação por isso ele não fez nada beleza? Então dessa forma nós concluímos o nosso Hello World em CDK agora a partir da próxima aula e de uma forma mais objetiva, mais rápida, nós vamos transformar o projeto que nós criamos em Terraform, onde nós tínhamos ali o nosso módulo de network, o nosso módulo de cluster, e agora nós vamos transpor isso para a CDK. Beleza? Espero que você esteja gostando. Vejo você na nossa próxima aula.