Skip to content
Collection of tools to enable use of AWS Lambda with CloudFormation
Branch: master
Clone or download
benkehoe Merge pull request #7 from vrtdev/feature/no-stringify-outputs
Add option to not stringify the outputs
Latest commit d467dba Apr 12, 2019


cfn_custom_resource provides an abstract base class to make it easier to implement AWS CloudFormation custom resources. It was developed from Gene Wood's cfnlambda, which provides lower-level functions and decorators for the same purpose.

At its simplest, you subclass the CloudFormationCustomResource and implement three methods: create, update, and delete, for each of the respective CloudFormation actions. Indicate failure by raising an exception. If you want attributes available on the resource within CloudFormation, return them as a dictionary. Your subclass has a class method get_handler, which will return a Lambda handler function. Logging to CloudWatch is provided by the logger field.

from cfn_custom_resource import CloudFormationCustomResource

# For resources of type Custom::MyCustomResource
class MyCustomResource(CloudFormationCustomResource):
    def create(self):
        # Implement
        # For AWS SDKs, use:
        #   self.get_boto3_client(service_name)
        #   self.get_boto3_resource(service_name)
        # Set the name of what you are creating to the value in
        #   self.physical_resource_id
        # This id is autogenerated for you, but you can set it if you want or need
        # This id is what CloudFormation uses for Ref
        # The resource properties defined in the template are in
        #   self.resource_properties
        # Attributes can be set by returning a dictionary

    def update(self):
        # Implement
        # The name of what you previously created is
        #   self.physical_resource_id
        # The updated properties are in
        #   self.resource_properties
        # To check what's changed, compare with
        #   self.old_resource_properties
        # If you set attributes in create(), you need to set them here too  

    def delete(self):
        # implement

handler = MyCustomResource.get_handler()

See more details in the wiki

How to contribute

Feel free to open issues or fork and submit PRs.

You can’t perform that action at this time.