Criação e implantação de ativos de imagem de contêiner em aplicações do CDK - Kit de desenvolvimento em nuvem da AWS (CDK da AWS) v2

Este é o Guia do desenvolvedor do AWS CDK v2. O CDK v1 antigo entrou em manutenção em 1º de junho de 2022 e encerrou o suporte em 1º de junho de 2023.

Criação e implantação de ativos de imagem de contêiner em aplicações do CDK

Quando você cria ativos de imagem de contêiner com o kit de desenvolvimento em nuvem da AWS (CDK da AWS), o Docker é utilizado por padrão para realizar essas ações. Se você desejar usar uma ferramenta diferente de gerenciamento de contêineres, poderá substituir o Docker por meio da variável de ambiente CDK_DOCKER.

Exemplo: criação e publicação de um ativo de imagem de contêiner com o AWS CDK

Veja a seguir um exemplo simples de uma aplicação do AWS CDK que cria e publica um ativo de contêiner no Amazon Elastic Container Registry (Amazon ECR) usando o Docker por padrão:

Estrutura do projeto
my-cdk-app/ ├── lib/ │ ├── my-stack.ts │ └── docker/ │ ├── Dockerfile │ └── app/ │ └── index.js ├── bin/ │ └── my-cdk-app.ts ├── package.json ├── tsconfig.json └── cdk.json
Dockerfile
FROM public.ecr.aws/lambda/nodejs:16 # Copy application code COPY app/ /var/task/ # (Optional) Install dependencies # RUN npm install # The Lambda Node.js base image looks for index.handler by default
Código da aplicação

Em lib/docker/app/index.js:

console.log("Hello from inside the container!");
Pilha do CDK
import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as ecr_assets from 'aws-cdk-lib/aws-ecr-assets'; export class MyStack extends cdk.Stack { constructor(scope: Construct, id: string) { super(scope, id); // Define a Docker image asset const dockerImageAsset = new ecr_assets.DockerImageAsset(this, 'MyDockerImage', { directory: 'lib/docker', // Path to the directory containing the Dockerfile }); // Output the ECR URI new cdk.CfnOutput(this, 'ECRImageUri', { value: dockerImageAsset.imageUri, }); } }
Aplicação do CDK
#!/usr/bin/env node import * as cdk from 'aws-cdk-lib'; import { MyStack } from '../lib/my-stack'; const app = new cdk.App(); new MyStack(app, 'MyStack');

Quando executamos cdk deploy, a interface de linha de comandos (CLI) do kit de desenvolvimento em nuvem da AWS (CDK da AWS) faz o seguinte:

  1. Cria a imagem do Docker: executa docker build localmente com base no Dockerfile no diretório especificado (lib/docker).

  2. Marca a imagem: executa docker tag para marcar a imagem criada com um hash exclusivo, com base no conteúdo da imagem.

  3. Publica no Amazon ECR: executa docker push para publicar a imagem do contêiner em um repositório do Amazon ECR. O repositório já deve existir. Ele é criado durante o processo de bootstrapping padrão.

  4. Exibe o URI da imagem: depois de uma implantação com êxito, o URI do Amazon ECR da imagem do contêiner publicada é exibido em seu prompt de comando. Esse é o URI da nossa imagem do Docker no Amazon ECR.

Como substituir o Docker por outra ferramenta de gerenciamento de contêineres

Use a variável de ambiente CDK_DOCKER para especificar o caminho para o binário da sua ferramenta de gerenciamento de contêineres substituta. Veja a seguir um exemplo de substituição do Docker pelo Finch:

$ which finch /usr/local/bin/finch # Locate the path to the binary $ export CDK_DOCKER='/usr/local/bin/finch' # Set the environment variable $ cdk deploy # Deploy using the replacement

Não há suporte para aliases ou vinculação. Para substituir o Docker, é necessário usar a variável de ambiente CDK_DOCKER.

Mecanismos de substituição direta do Docker com suporte

Há suporte para o Finch, embora alguns recursos do Docker possam estar indisponíveis ou funcionar de forma diferente à medida que a ferramenta evolui. Para obter mais informações sobre o Finch, consulte Pronto para decolar: anúncio do Finch 1.0 GA! no blog AWS Open Source.

Outras ferramentas de gerenciamento de contêineres podem funcionar. O CDK não verifica qual substituto do Docker você está usando para determinar se há suporte. Se a ferramenta tiver comandos equivalentes do Docker e se comportar de forma semelhante, deverá funcionar.