Esta es la guía para AWS CDK desarrolladores de la versión 2. La primera versión del CDK pasó a la etapa de mantenimiento el 1.° de junio de 2022 y no cuenta con soporte desde el 1.° de junio de 2023.
Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Los activos son archivos locales, directorios o imágenes de Docker que se pueden agrupar en AWS CDK bibliotecas y aplicaciones. Por ejemplo, un activo puede ser un directorio que contiene el código del controlador de una función. AWS Lambda Los activos pueden representar cualquier artefacto que la aplicación necesite para funcionar.
El siguiente video tutorial proporciona una descripción general completa de los activos CDK, y explica cómo puede utilizarlos en su infraestructura como código (IaC).
A través de él se añaden activos APIs que están expuestos por AWS estructuras específicas. Por ejemplo, cuando se define un constructo de lambda.Function, la propiedad código permite pasar un activo (directorio). Function
utiliza activos para agrupar el contenido del directorio y usarlo para el código de la función. Del mismo modo, ecs. ContainerImage.fromAsset utiliza una imagen de Docker creada a partir de un directorio local al definir una definición de tarea de Amazon ECS.
Activos en detalle
Cuando hace referencia a un activo de su aplicación, el ensamblaje de la nube que se sintetiza a partir de su aplicación incluye información de metadatos con instrucciones para la AWS CDK CLI. Las instrucciones incluyen dónde encontrar el activo en el disco local y qué tipo de agrupación se debe realizar en función del tipo de activo, como comprimir un directorio (zip) o crear una imagen de Docker.
AWS CDK Genera un hash de origen para los activos. Esto se puede utilizar en el momento de la construcción para determinar si el contenido de un activo cambió.
De forma predeterminada, AWS CDK crea una copia del activo en el directorio de ensamblaje de la nube, que de forma predeterminada escdk.out
, bajo el hash de origen. De esta forma, el ensamblaje de la nube es independiente, por lo que si se trasladó a un host diferente para su implementación, aún se puede implementar. Para obtener más información, consulte Montajes en la nube.
Cuando AWS CDK implementa una aplicación que hace referencia a activos (ya sea directamente mediante el código de la aplicación o a través de una biblioteca), la AWS CDK CLI primero prepara y publica los activos en un bucket de Amazon S3 o en un repositorio de Amazon ECR. (El bucket o repositorio de S3 se crea durante el arranque). Solo entonces se implementarán los recursos definidos en la pila.
En esta sección se describe el nivel bajo APIs disponible en el marco.
Tipos de activos
AWS CDK Admite los siguientes tipos de activos:
- Activos de Amazon S3
-
Se trata de archivos y directorios locales que AWS CDK carga en Amazon S3.
- Imagen de Docker
-
Estas son imágenes de Docker que luego se AWS CDK cargan en Amazon ECR.
Estos tipos de activos se explican en las siguientes secciones.
Activos de Amazon S3
Puede definir los archivos y directorios locales como activos y los AWS CDK paquetes y cargarlos en Amazon S3 a través del módulo aws-s3-assets.
El siguiente ejemplo define un activo de directorio local y a un activo de archivo.
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')
});
En la mayoría de los casos, no es necesario que los utilice directamente en el módulo. APIs aws-s3-assets
Los módulos que admiten activos, como aws-lambda
, tienen métodos prácticos para que pueda usarlos. Para las funciones de Lambda, el método estático fromAsset() permite especificar un directorio o un archivo .zip en el sistema de archivos local.
Ejemplos de funciones de Lambda
Un caso de uso común es la creación de funciones de Lambda con el código del controlador como un activo de Amazon S3.
El siguiente ejemplo usa un activo de Amazon S3 para definir un controlador de Python en el directorio handler
local. También, crea una función de Lambda con el activo del directorio local como propiedad code
. A continuación, se presenta el código Python para el controlador.
def lambda_handler(event, context):
message = 'Hello World!'
return {
'message': message
}
El código de la AWS CDK aplicación principal debería tener el siguiente aspecto.
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'
});
}
}
El método Function
utiliza activos para agrupar los contenidos del directorio y usarlos para el código de la función.
sugerencia
Los archivos .jar
de Java son archivos ZIP con una extensión diferente. Se cargan tal cual en Amazon S3, pero cuando se implementan como una función de Lambda, los archivos que contiene se extraen, lo que podría no convenirle. Para evitarlo, coloque el archivo .jar
en un directorio y especifíquelo como activo.
Ejemplo de atributos en tiempo de implementación
Los tipos de activos de Amazon S3 también exponen atributos de tiempo de implementación a los que se puede hacer referencia en AWS CDK bibliotecas y aplicaciones. El comando AWS CDK CLI cdk synth muestra las propiedades de los activos como AWS CloudFormation parámetros.
En el siguiente ejemplo, se utilizan atributos de tiempo de implementación para pasar la ubicación de un activo de imagen a una función de Lambda como variables de entorno. (El tipo de archivo no importa; la imagen PNG que se usa aquí es solo un ejemplo).
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
}
});
Permisos
Si utiliza los activos de Amazon S3 directamente a través del móduloaws-s3-assets, los roles, los usuarios o los grupos de IAM, y necesita leer los activos en tiempo de ejecución, conceda los permisos de IAM a esos activos mediante el método asset.grantRead.
El siguiente ejemplo otorga a un grupo de IAM los permisos de lectura sobre un activo de archivo.
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);
Activos de imagen de Docker
AWS CDK Admite la agrupación de imágenes de Docker locales como activos a través del aws-ecr-assetsmódulo.
El siguiente ejemplo define una imagen de Docker que se compilará de forma local y se enviará a Amazon ECR. Las imágenes se crean a partir de un directorio contextual de Docker local (con un Dockerfile) y la AWS CDK CLI o la canalización de CI/CD de la aplicación las cargan en Amazon ECR. Se puede hacer referencia a las imágenes de forma natural en su aplicación. AWS CDK
import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';
const asset = new DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image')
});
El directorio my-image
debe tener un Dockerfile. La AWS CDK CLI crea una imagen de Docker a partir de ellamy-image
, la envía a un repositorio de Amazon ECR y especifica el nombre del repositorio como AWS CloudFormation
parámetro de la pila. Los tipos de activos de imagen de Docker muestran los atributos de tiempo de implementación a los que se puede hacer referencia en bibliotecas y aplicaciones. AWS CDK El comando AWS CDK CLI cdk
synth muestra las propiedades de los activos como AWS CloudFormation parámetros.
Ejemplo de definición de tarea de Amazon ECS
Un caso de uso común es crear un Amazon ECS TaskDefinitionpara ejecutar contenedores de Docker. El siguiente ejemplo especifica la ubicación de un activo de imagen de Docker que AWS CDK se compila localmente y se envía a 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)
});
Ejemplo de atributos en tiempo de implementación
El siguiente ejemplo muestra cómo utilizar los atributos de tiempo de implementación repository
y cómo imageUri
crear una definición de tarea de Amazon ECS con el tipo de AWS Fargate lanzamiento. Tenga en cuenta que la búsqueda en el repositorio de Amazon ECR requiere la etiqueta de la imagen, no su URI, por lo que la recortamos del final de la URI del activo.
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())
});
Ejemplo de argumento de compilación
Puede proporcionar argumentos de compilación personalizados para el paso de compilación de Docker mediante la opción de propiedad buildArgs
(Python:build_args
) cuando la AWS CDK CLI compila la imagen durante la implementación.
const asset = new DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image'),
buildArgs: {
HTTP_PROXY: 'http://10.20.30.2:1234'
}
});
Permisos
Si utilizas un módulo compatible con los activos de imagen de Docker, como aws-ecs, te AWS CDK gestionará los permisos cuando utilices los activos directamente o a través de ellos. ContainerImage fromEcrRepository (Python:from_ecr_repository
). Si utiliza los activos de imagen de Docker directamente, asegúrese de que la entidad principal tenga los permisos necesarios para extraer la imagen.
En la mayoría de los casos, debe utilizar el método asset.repository.GrantPull (Python:. grant_pull
Esto modifica la política de IAM del director para permitirle extraer imágenes de este repositorio. Si el principal que está extrayendo la imagen no está en la misma cuenta, o si se trata de un AWS servicio que no asume ninguna función en tu cuenta (por ejemplo AWS CodeBuild), debes conceder permisos de extracción a la política de recursos y no a la política del principal. Usa el asset.repository. addToResourceMétodo de política (Python:add_to_resource_policy
) para conceder los permisos principales adecuados.
AWS CloudFormation metadatos de recursos
nota
Esta sección es relevante solo para los autores de constructos. En determinadas situaciones, las herramientas necesitan saber que un determinado recurso de CFN está utilizando un activo local. Por ejemplo, puede usar la AWS SAM CLI para invocar funciones de Lambda localmente con fines de depuración. Para obtener más información, consulte AWS SAM integración.
Para habilitar estos casos de uso, las herramientas externas consultan un conjunto de entradas de metadatos en los recursos: AWS CloudFormation
-
aws:asset:path
: señala la ruta local del activo. -
aws:asset:property
: es el nombre de la propiedad del recurso en la que se utiliza el activo.
Al utilizar estas dos entradas de metadatos, las herramientas pueden identificar qué activos utiliza un determinado recurso y permiten experiencias locales avanzadas.
Para agregar estas entradas de metadatos a un recurso, utilice el método asset.addResourceMetadata
(Python: add_resource_metadata
).