DEV Community

Gustavo Ramirez
Gustavo Ramirez

Posted on

Construyendo Custom Constructs en CDK el patron que me ahorra horas por proyecto

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),
        },
      ],
    });
  }
}
Enter fullscreen mode Exit fullscreen mode

Ahora en cualquier stack:

new SecureBucket(this, 'Assets', { lifecycleDays: 180 });
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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' },
      }],
    },
  });
});
Enter fullscreen mode Exit fullscreen mode

Lo que aprendí

  1. No abstraigas antes de tiempo. Espera a que el patrón se repita al menos tres veces antes de convertirlo en construct.
  2. Documenta las props. Los custom constructs que no entiende tu equipo terminan abandonados.
  3. 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)