Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

aws-cloudformation-custom-resource

udondan25kApache-2.05.0.0TypeScript support: included

Helper for managing custom AWS CloudFormation resources in a Lambda function

aws, cloudformation, lambda, resource, cloudformation-custom-resource

readme

aws-cloudformation-custom-resource

npm version npm License

Helper for managing custom AWS CloudFormation resources in a Lambda function.

Usage

You can find a complete example in the test directory.

The use of generics is optional. If no ResourceProperties is passed to the Event and CustomResource, the default type is Records<string, string>.

Basic usage:

import {
  Callback,
  Context,
  CustomResource,
  Event,
  Logger,
} from 'aws-cloudformation-custom-resource';

export interface ResourceProperties {
  name: string;
}

export const handler = function (
  event: Event<ResourceProperties>,
  context: Context,
  callback: Callback,
) {
  new CustomResource<ResourceProperties>(
    event,
    context,
    callback,
    createResource,
    updateResource,
    deleteResource,
  );
};

function createResource(
  resource: CustomResource<ResourceProperties>,
  log: Logger,
): Promise<void> {
  return new Promise(function (resolve, reject) {
    log.log('Hello from create');

    // Every custom resource requires a physical ID.
    // Either you can pass a `name` parameter to the lambda function
    // (accessed via `resource.properties.name`)
    // or you can manually set the ID:
    resource.setPhysicalResourceId('some-physical-resource-id');

    // you can return values from the Lambda function:
    resource.addResponseValue('Foo', 'bar');

    doSomethingWith(resource.properties.name.value).then(resolve).catch(reject);
  });
}

function updateResource(
  resource: CustomResource<ResourceProperties>,
  log: Logger,
): Promise<void> {
  log.log('Hello from update');
  return new Promise(function (resolve, reject) {
    resource.addResponseValue('Foo', 'bar');

    if (resource.properties.name.changed) {
      doSomethingWith(resource.properties.name.value)
        .then(resolve)
        .catch(reject);
    } else {
      resolve();
    }
  });
}

function deleteResource(
  resource: CustomResource<ResourceProperties>,
  log: Logger,
): Promise<void> {
  log.log('Hello from delete');
  return new Promise(function (resolve, reject) {
    // do stuff
    resolve();
  });
}

By default only errors are logged. You can change the log level or use another logging library:

import {
  Callback,
  Context,
  CustomResource,
  Event,
  LogLevel,
  StandardLogger,
} from 'aws-cloudformation-custom-resource';

const logger = new StandardLogger(LogLevel.debug);

const resource = new CustomResource(
  event,
  context,
  callback,
  createResource,
  updateResource,
  deleteResource,
);

resource.setLogger(logger);

changelog

Changelog

5.0.0 (2024-03-15)

⚠ BREAKING CHANGES

  • implements proxy to easily get the changed state and previous value in update requests (#41)

Features

  • implements proxy to easily get the changed state and previous value in update requests (#41) (26fdf79)

4.2.0 (2024-03-08)

Features

  • for convenience, expose event.ResourceProperties as resource.properties (#32) (006aaf6)

4.1.0 (2024-03-07)

Features

  • CustomResource now accepts a generic type describing resource properties (#30) (2461169)

4.0.0 (2024-03-06)

⚠ BREAKING CHANGES

  • complete refactor to streamline API (#23)
  • integrate ESLint with naming-convention rules (#12)

Features

  • implements noEcho feature, so secrets can be masked (#28) (f446af7)

Bug Fixes

Code Refactoring

  • complete refactor to streamline API (#23) (022592b)
  • integrate ESLint with naming-convention rules (#12) (6ece2b6)