Skip to main content

AWS CDK Construct Library to manage Lets Encrypt certificate renewals with Certbot

Project description

cdk-library-certbot

build

A CDK Construct Library to automate the creation and renewal of Let's Encrypt certificates.

Features

  • Creates a lambda function that utilizes Certbot to request a certificate from Let's Encrypt
  • Uploads the resulting certificate data to S3 for later retrieval
  • Imports the certificate to AWS Certificate Manager for tracking expiration
  • Creates a trigger to re-run and re-new if the cert will expire in the next 30 days (customizable)

API Doc

See API

References

Original [gist](# Modified from original gist https://gist.github.com/arkadiyt/5d764c32baa43fc486ca16cb8488169a) that was modified for the Lambda code

Examples

This construct utilizes a Route 53 hosted zone lookup so it will require that your stack has [environment variables set for account and region](See https://docs.aws.amazon.com/cdk/latest/guide/environments.html for more details.).

Typescript

Typescript with Default Setup

import * as cdk from '@aws-cdk/core';
import { Certbot } from '@renovosolutions/cdk-library-certbot';
import { Architecture } from '@aws-cdk/aws-lambda';

export class CdkExampleCertsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    let domains = [
      'example.com',
      'www.example.com'
    ]

    new Certbot(this, 'cert', {
      letsencryptDomains: domains.join(','),
      letsencryptEmail: 'webmaster+letsencrypt@example.com',
      hostedZoneNames: [
        'example.com'
      ]
    })
  }
}

Typescript with alternate storage location (Secrets Manager)

import * as cdk from '@aws-cdk/core';
import { Certbot, CertificateStorageType } from '@renovosolutions/cdk-library-certbot';
import { Architecture } from '@aws-cdk/aws-lambda';

export class CdkExampleCertsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    let domains = [
      'example.com',
      'www.example.com'
    ]

    new Certbot(this, 'cert', {
      letsencryptDomains: domains.join(','),
      letsencryptEmail: 'webmaster+letsencrypt@example.com',
      hostedZoneNames: [
        'example.com'
      ]
      certificateStorage: CertificateStorageType.SECRETS_MANAGER
      // Optional path
      secretsManagerPath: '/path/to/secret/'
    })
  }
}

Typescript with alternate storage location (Parameter Store)

import * as cdk from '@aws-cdk/core';
import { Certbot, CertificateStorageType } from '@renovosolutions/cdk-library-certbot';
import { Architecture } from '@aws-cdk/aws-lambda';

export class CdkExampleCertsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    let domains = [
      'example.com',
      'www.example.com'
    ]

    new Certbot(this, 'cert', {
      letsencryptDomains: domains.join(','),
      letsencryptEmail: 'webmaster+letsencrypt@example.com',
      hostedZoneNames: [
        'example.com'
      ]
      certificateStorage: CertificateStorageType.SSM_SECURE
      // Optional path
      ssmSecurePath: '/path/to/secret/'
    })
  }
}

Typescript with zone creation in the same stack

import * as cdk from '@aws-cdk/core';
import * as route53 from '@aws-cdk/aws_route53';
import { Certbot } from '@renovosolutions/cdk-library-certbot';
import { Architecture } from '@aws-cdk/aws-lambda';

export class CdkExampleCertsStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const hostedZone = new r53.HostedZone(this, 'authZone', {
      zoneName: 'auth.example.com',
    });

    let domains = [
      'example.com',
      'www.example.com',
      'auth.example.com'
    ]

    new Certbot(this, 'cert', {
      letsencryptDomains: domains.join(','),
      letsencryptEmail: 'webmaster+letsencrypt@example.com',
      hostedZoneNames: [
        'example.com'
      ],
      hostedZones: [
        hostedZone,
      ]
    })
  }
}

Python

from aws_cdk import (
    core as cdk
)
from certbot import Certbot

class CdkExampleCertsStack(cdk.Stack):

    def __init__(self, scope: cdk.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        Certbot(self, "certbot",
            letsencrypt_email="webmaster+letsencrypt@example.com",
            letsencrypt_domains="example.com",
            hosted_zone_names=["example.com"]
        )

Testing the handler in this project

  • Set up a python virtual env with python3.10 -m venv .venv
  • Use the virtual env with source .venv/bin/activate
  • Install dependencies with pip install -r function/tests/requirements.txt
  • Run pytest -v

The testing using moto to mock AWS services and verify the function does what is expected for each given storage type.

Project details


Release history Release notifications | RSS feed

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

renovosolutions_aws_cdk_certbot-2.9.2.tar.gz (52.7 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

renovosolutions_aws_cdk_certbot-2.9.2-py3-none-any.whl (52.7 MB view details)

Uploaded Python 3

File details

Details for the file renovosolutions_aws_cdk_certbot-2.9.2.tar.gz.

File metadata

File hashes

Hashes for renovosolutions_aws_cdk_certbot-2.9.2.tar.gz
Algorithm Hash digest
SHA256 95d83bb9b79b3bbbab68ddb4a39e07edaad32e3dde1e20483cf03a437edf7b97
MD5 521895931e68e27be98184d34c36b669
BLAKE2b-256 0f3014ded1db54c9e76ac89c3b21c39d69aadf50755b20feecea9ec84ab85fde

See more details on using hashes here.

File details

Details for the file renovosolutions_aws_cdk_certbot-2.9.2-py3-none-any.whl.

File metadata

File hashes

Hashes for renovosolutions_aws_cdk_certbot-2.9.2-py3-none-any.whl
Algorithm Hash digest
SHA256 10952190e4a600b2e6092f312bef19e7513143a52e3669ad2ae497ef40ea1e0f
MD5 51515ba41500e9cb3425c738b79206a2
BLAKE2b-256 d712d1dfe471260abf8d3224f1f6f06c9e366285145a76ff4550a2c923d5d355

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page