Este é o Guia do Desenvolvedor 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.
As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Os ativos são arquivos, diretórios ou imagens do Docker locais que podem ser agrupados em AWS CDK bibliotecas e aplicativos. Por exemplo, um ativo pode ser um diretório que contém o código do manipulador de uma AWS Lambda função. Os ativos podem representar qualquer artefato de que a aplicação precise para operar.
O vídeo tutorial a seguir fornece uma visão geral abrangente dos ativos do CDK e explica como você pode usá-los em sua infraestrutura como código (IaC).
Você adiciona ativos por meio dos APIs quais são expostos por AWS construções específicas. Por exemplo, quando você define um constructo lambda.Function, a propriedade code permite que você passe um ativo (diretório). Function
usa ativos para agrupar o conteúdo do diretório e usá-lo para o código da função. Da mesma forma, ecs. ContainerImage.fromAsset usa uma imagem do Docker criada a partir de um diretório local ao definir uma definição de tarefa do Amazon ECS.
Ativos em detalhes
Quando você se refere a um ativo em seu aplicativo, o conjunto de nuvem que é sintetizado a partir do seu aplicativo inclui informações de metadados com instruções para a CLI. AWS CDK As instruções incluem onde encontrar o ativo no disco local e que tipo de empacotamento executar com base no tipo de ativo, como um diretório para compactar (zip) ou uma imagem do Docker para compilar.
Isso AWS CDK gera um hash de origem para ativos. Isso pode ser usado no momento da construção para determinar se o conteúdo de um ativo foi alterado.
Por padrão, o AWS CDK cria uma cópia do ativo no diretório de montagem da nuvem, cujo padrão écdk.out
, sob o hash de origem. Dessa forma, o conjunto de nuvem é independente, portanto, se for transferido para um host diferente para implantação, ele ainda poderá ser implantado. Para mais detalhes, consulte Conjuntos de nuvem.
Quando AWS CDK implanta um aplicativo que faz referência a ativos (diretamente pelo código do aplicativo ou por meio de uma biblioteca), a AWS CDK CLI primeiro prepara e publica os ativos em um bucket do Amazon S3 ou repositório do Amazon ECR. (O bucket do S3 ou o repositório é criado durante o bootstrapping.) Só então os recursos definidos na pilha são implantados.
Esta seção descreve o baixo nível APIs disponível na estrutura.
Tipos de ativo
O AWS CDK suporta os seguintes tipos de ativos:
- Ativos do Amazon S3
-
Esses são arquivos e diretórios locais que são AWS CDK carregados para o Amazon S3.
- Imagem de docker
-
Essas são imagens do Docker que são AWS CDK enviadas para o Amazon ECR.
Esses tipos de ativos são explicados nas seguintes seções.
Ativos do Amazon S3
O exemplo a seguir define um ativo de diretório local e um ativo de arquivo.
import { Asset } from 'aws-cdk-lib/aws-s3-assets';
// Archived and uploaded to Amazon S3 as a .zip file
const directoryAsset = new Asset(this, "SampleZippedDirAsset", {
path: path.join(__dirname, "sample-asset-directory")
});
// Uploaded to Amazon S3 as-is
const fileAsset = new Asset(this, 'SampleSingleFileAsset', {
path: path.join(__dirname, 'file-asset.txt')
});
Na maioria dos casos, você não precisa usar diretamente o APIs no aws-s3-assets
módulo. Módulos que oferecem suporte a ativos, como aws-lambda
, têm métodos convenientes para que você possa usar ativos. Para funções do Lambda, o método estático fromAsset() permite que você especifique um diretório ou um arquivo .zip no sistema de arquivos local.
Exemplo de função do Lambda
Um caso de uso comum é criar funções do Lambda com o código do manipulador como um ativo do Amazon S3.
O exemplo a seguir usa um ativo do Amazon S3 para definir um manipulador do Python no handler
do diretório local. Ele também cria uma função do Lambda com o ativo do diretório local como propriedade code
. A seguir está o código do Python para o manipulador.
def lambda_handler(event, context):
message = 'Hello World!'
return {
'message': message
}
O código do AWS CDK aplicativo principal deve ter a seguinte aparência.
import * as cdk from 'aws-cdk-lib';
import { Constructs } from 'constructs';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as path from 'path';
export class HelloAssetStack extends cdk.Stack {
constructor(scope: Construct, id: string, props?: cdk.StackProps) {
super(scope, id, props);
new lambda.Function(this, 'myLambdaFunction', {
code: lambda.Code.fromAsset(path.join(__dirname, 'handler')),
runtime: lambda.Runtime.PYTHON_3_6,
handler: 'index.lambda_handler'
});
}
}
O método Function
usa ativos para empacotar o conteúdo do diretório e usá-lo para o código da função.
dica
Os arquivos .jar
do Java são arquivos ZIP com uma extensão diferente. Eles são carregados no estado em que se encontram no Amazon S3, mas quando implantados como uma função do Lambda, os arquivos que eles contêm são extraídos, o que pode ser indesejado. Para evitar isso, coloque o arquivo .jar
em um diretório e especifique esse diretório como o ativo.
Exemplo de atributos de tempo de implantação
Os tipos de ativos do Amazon S3 também expõem atributos de tempo de implantação que podem ser referenciados em bibliotecas e aplicativos. AWS CDK O comando AWS CDK CLI cdk synth exibe as propriedades do ativo como AWS CloudFormation parâmetros.
O exemplo a seguir usa atributos de tempo de implantação para passar a localização de um ativo de imagem para uma função do Lambda como variáveis de ambiente. (O tipo de arquivo não importa; a imagem PNG usada aqui é apenas um exemplo.)
import { Asset } from 'aws-cdk-lib/aws-s3-assets';
import * as path from 'path';
const imageAsset = new Asset(this, "SampleAsset", {
path: path.join(__dirname, "images/my-image.png")
});
new lambda.Function(this, "myLambdaFunction", {
code: lambda.Code.asset(path.join(__dirname, "handler")),
runtime: lambda.Runtime.PYTHON_3_6,
handler: "index.lambda_handler",
environment: {
'S3_BUCKET_NAME': imageAsset.s3BucketName,
'S3_OBJECT_KEY': imageAsset.s3ObjectKey,
'S3_OBJECT_URL': imageAsset.s3ObjectUrl
}
});
Permissões
Se você usa ativos do Amazon S3 diretamente por meio do módulo aws-s3-assets, perfis, usuários ou grupos do IAM e precisa ler ativos em runtime, conceda a esses ativos permissões do IAM por meio do método asset.grantRead.
O exemplo a seguir concede a um grupo do IAM permissões de leitura em um ativo de arquivo.
import { Asset } from 'aws-cdk-lib/aws-s3-assets';
import * as path from 'path';
const asset = new Asset(this, 'MyFile', {
path: path.join(__dirname, 'my-image.png')
});
const group = new iam.Group(this, 'MyUserGroup');
asset.grantRead(group);
Ativos de imagem do Docker
O AWS CDK suporta o agrupamento de imagens locais do Docker como ativos por meio do aws-ecr-assetsmódulo.
O exemplo a seguir define uma imagem do Docker, que é criada localmente e enviada para o Amazon ECR. As imagens são criadas a partir de um diretório de contexto local do Docker (com um Dockerfile) e enviadas para o Amazon ECR pela AWS CDK CLI ou pelo pipeline de CI/CD do seu aplicativo. As imagens podem ser referenciadas naturalmente em seu AWS CDK aplicativo.
import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';
const asset = new DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image')
});
O diretório my-image
deve incluir um Dockerfile. A AWS CDK CLI cria uma imagem do Dockermy-image
, a envia para um repositório Amazon ECR e especifica o nome do repositório como um parâmetro para sua pilha. AWS CloudFormation
Os tipos de ativos de imagem do Docker expõem atributos de tempo de implantação que podem ser referenciados em AWS CDK bibliotecas e aplicativos. O comando AWS CDK CLI cdk
synth exibe as propriedades do ativo como AWS CloudFormation parâmetros.
Exemplo de definição de tarefa do Amazon ECS
Um caso de uso comum é criar um Amazon ECS TaskDefinitionpara executar contêineres Docker. O exemplo a seguir especifica a localização de um ativo de imagem do Docker que ele AWS CDK cria localmente e envia para o Amazon ECR.
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as ecr_assets from 'aws-cdk-lib/aws-ecr-assets';
import * as path from 'path';
const taskDefinition = new ecs.FargateTaskDefinition(this, "TaskDef", {
memoryLimitMiB: 1024,
cpu: 512
});
const asset = new ecr_assets.DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image')
});
taskDefinition.addContainer("my-other-container", {
image: ecs.ContainerImage.fromDockerImageAsset(asset)
});
Exemplo de atributos de tempo de implantação
O exemplo a seguir mostra como usar os atributos de tempo de implantação repository
e imageUri
criar uma definição de tarefa do Amazon ECS com o tipo de AWS Fargate execução. Observe que a pesquisa do repositório do Amazon ECR exige a tag da imagem, não seu URI, então nós a recortamos do final do URI do ativo.
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as path from 'path';
import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';
const asset = new DockerImageAsset(this, 'my-image', {
directory: path.join(__dirname, "..", "demo-image")
});
const taskDefinition = new ecs.FargateTaskDefinition(this, "TaskDef", {
memoryLimitMiB: 1024,
cpu: 512
});
taskDefinition.addContainer("my-other-container", {
image: ecs.ContainerImage.fromEcrRepository(asset.repository, asset.imageUri.split(":").pop())
});
Exemplo de argumentos de compilação
Você pode fornecer argumentos de construção personalizados para a etapa de construção do Docker por meio da opção de propriedade buildArgs
(Pythonbuild_args
:) quando a AWS CDK CLI cria a imagem durante a implantação.
const asset = new DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image'),
buildArgs: {
HTTP_PROXY: 'http://10.20.30.2:1234'
}
});
Permissões
Se você usa um módulo que oferece suporte a ativos de imagem do Docker, como aws-ecs, AWS CDK ele gerencia as permissões para você quando você usa ativos diretamente ou por meio dele. ContainerImage fromEcrRepository (Python:from_ecr_repository
). Se você usa ativos de imagem do Docker diretamente, verifique se a entidade principal de consumo tem permissão para extrair a imagem.
Na maioria dos casos, você deve usar o método Asset.repository.grantPull (Python:. grant_pull
Isso modifica a política do IAM do principal para permitir que ele extraia imagens desse repositório. Se o diretor que está extraindo a imagem não estiver na mesma conta ou se for um AWS serviço que não assume uma função na sua conta (como AWS CodeBuild), você deve conceder permissões de extração na política de recursos e não na política do diretor. Use o asset.repository. addToResourceMétodo de política (Python:add_to_resource_policy
) para conceder as permissões principais apropriadas.
AWS CloudFormation metadados de recursos
nota
Esta seção é relevante somente para autores de constructos. Em determinadas situações, as ferramentas precisam saber que um determinado recurso do CFN está usando um ativo local. Por exemplo, você pode usar a AWS SAM CLI para invocar funções do Lambda localmente para fins de depuração. Para mais detalhes, consulte AWS SAM integração.
Para habilitar esses casos de uso, ferramentas externas consultam um conjunto de entradas de metadados sobre AWS CloudFormation recursos:
-
aws:asset:path
: aponta para o caminho local do ativo. -
aws:asset:property
: o nome da propriedade do recurso em que o ativo é usado.
Usando essas duas entradas de metadados, as ferramentas podem identificar que os ativos são usados por um determinado recurso e permitir experiências locais avançadas.
Para adicionar essas entradas de metadados a um recurso, use o método asset.addResourceMetadata
(Python :add_resource_metadata
).