Si usas CDK en varios proyectos, vas a llegar a un punto donde copias y pegas los mismos 50 líneas para crear un bucket S3 con tu configuración estándar. Ahí es donde los custom constructs empiezan a valer la pena.
Qué es un construct
En CDK, un construct es una abstracción de uno o más recursos. Hay tres niveles:
-
L1: recursos crudos de CloudFormation (
CfnBucket). -
L2: abstracciones amigables (
Bucket). -
L3 (patterns): composiciones de varios recursos (
ApplicationLoadBalancedFargateService).
Tus custom constructs suelen ser L3.
Ejemplo: un bucket "seguro por defecto"
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as cdk from 'aws-cdk-lib';
export interface SecureBucketProps {
bucketName?: string;
lifecycleDays?: number;
}
export class SecureBucket extends Construct {
public readonly bucket: s3.Bucket;
constructor(scope: Construct, id: string, props: SecureBucketProps = {}) {
super(scope, id);
this.bucket = new s3.Bucket(this, 'Bucket', {
bucketName: props.bucketName,
encryption: s3.BucketEncryption.S3_MANAGED,
blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,
enforceSSL: true,
versioned: true,
lifecycleRules: [
{
expiration: cdk.Duration.days(props.lifecycleDays ?? 365),
},
],
});
}
}
Ahora en cualquier stack:
new SecureBucket(this, 'Assets', { lifecycleDays: 180 });
Tres líneas en vez de treinta.
Empaquetando tus constructs
Cuando tienes varios, los empacas en un paquete npm privado:
npm init
npm install aws-cdk-lib constructs
Lo publicas en tu registro privado (CodeArtifact, Verdaccio, o el que uses) y lo instalas en todos los proyectos:
npm install @mi-org/cdk-constructs
Testear constructs
CDK tiene utilidades para testing que son excelentes:
import { Template } from 'aws-cdk-lib/assertions';
test('bucket has encryption enabled', () => {
const stack = new cdk.Stack();
new SecureBucket(stack, 'TestBucket');
const template = Template.fromStack(stack);
template.hasResourceProperties('AWS::S3::Bucket', {
BucketEncryption: {
ServerSideEncryptionConfiguration: [{
ServerSideEncryptionByDefault: { SSEAlgorithm: 'AES256' },
}],
},
});
});
Lo que aprendí
- No abstraigas antes de tiempo. Espera a que el patrón se repita al menos tres veces antes de convertirlo en construct.
- Documenta las props. Los custom constructs que no entiende tu equipo terminan abandonados.
- Versiona con semver. Cuando cambies un default, es una breaking change aunque parezca menor.
Cierre
Los custom constructs son tu biblioteca de patrones. Bien hechos, aceleran cualquier proyecto nuevo. Mal hechos, son una capa de complejidad que nadie quiere tocar.
Top comments (0)