AWS CDK Construct Library to manage Lets Encrypt certificate renewals with Certbot
Project description
cdk-library-certbot
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
Built Distribution
File details
Details for the file renovosolutions_aws_cdk_certbot-2.8.0.tar.gz
.
File metadata
- Download URL: renovosolutions_aws_cdk_certbot-2.8.0.tar.gz
- Upload date:
- Size: 4.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 883e0f3f3f4386cc3dc936899f54e39b2895b2c4d001c62961ff401e2b4e5b79 |
|
MD5 | 4ccf71b0047d9687971c77770ff028a4 |
|
BLAKE2b-256 | 19d916f19f5c50e07b521a76338935689e756b043ee6745b79f1d5420706b29d |
File details
Details for the file renovosolutions.aws_cdk_certbot-2.8.0-py3-none-any.whl
.
File metadata
- Download URL: renovosolutions.aws_cdk_certbot-2.8.0-py3-none-any.whl
- Upload date:
- Size: 4.2 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.10.12
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 98620454846a8aaa1b3d998dfce167080e32a4edec9b5e63727c7c743753ef3e |
|
MD5 | 56636ef26edc04cfb5f31e3b078f4b7b |
|
BLAKE2b-256 | 60ea1e0cc81d974f939de5d944312b54660ef22fd690d7684b8c3d7abef32a6a |