External Secrets Add-On¶
External Secrets add-on is based on External Secrets Operator (ESO) and allows integration with third-party secret stores like AWS Secrets Manager, AWS Systems Manager Parameter Store and inject the values into the EKS cluster as Kubernetes Secrets.
Usage¶
import * as cdk from 'aws-cdk-lib';
import * as blueprints from '@aws-quickstart/eks-blueprints';
const app = new cdk.App();
const addOn = new blueprints.addons.ExternalsSecretsAddOn({});
const blueprint = blueprints.EksBlueprint.builder()
    .version("auto")
    .addOns(addOn)
    .build(app, 'my-stack-name');
Cluster Secret Store¶
Create a ClusterSecretStore which can be used by all ExternalSecrets from all namespaces.
Below example is for integration with AWS Secrets Manager:
import * as eks from 'aws-cdk-lib/aws-eks';
const cluster = blueprint.getClusterInfo().cluster;
const clusterSecretStore = new eks.KubernetesManifest(scope, "ClusterSecretStore", {
    cluster: cluster,
    manifest: [
        {
            apiVersion: "external-secrets.io/v1beta1",
            kind: "ClusterSecretStore",
            metadata: {name: "default"},
            spec: {
                provider: {
                    aws: {
                        service: "SecretsManager",
                        region: region,
                        auth: {
                            jwt: {
                                serviceAccountRef: {
                                    name: "external-secrets-sa",
                                    namespace: "external-secrets",
                                },
                            },
                        },
                    },
                },
            },
        },
    ],
});
Below example is for integration with AWS Systems Manager Parameter Store:
import * as eks from 'aws-cdk-lib/aws-eks';
const cluster = blueprint.getClusterInfo().cluster;
const clusterSecretStore = new eks.KubernetesManifest(scope, "ClusterSecretStore", {
    cluster: cluster,
    manifest: [
        {
            apiVersion: "external-secrets.io/v1beta1",
            kind: "ClusterSecretStore",
            metadata: {name: "default"},
            spec: {
                provider: {
                    aws: {
                        service: "ParameterStore",
                        region: region,
                        auth: {
                            jwt: {
                                serviceAccountRef: {
                                    name: "external-secrets-sa",
                                    namespace: "external-secrets",
                                },
                            },
                        },
                    },
                },
            },
        },
    ],
});
External Secret¶
Create an ExternalSecret which can be used to fetch, transform and inject secret data
import * as eks from 'aws-cdk-lib/aws-eks';
const cluster = blueprint.getClusterInfo().cluster;
const keyfiles = new eks.KubernetesManifest(scope, "ExternalSecret", {
    cluster: cluster,
    manifest: [
        {
            apiVersion: "external-secrets.io/v1beta1",
            kind: "ExternalSecret",
            metadata: {name: "the-external-secret-name"},
            spec: {
                secretStoreRef: {
                    name: "default",
                    kind: "ClusterSecretStore",
                },
                target: {
                    name: "the-kubernetes-secret-name",
                    creationPolicy: "Merge",
                },
                data: [
                    {
                        secretKey: "secret-key-to-be-managed",
                        remoteRef: {
                            key: "the-providers-secret-name",
                            property: "the-provider-secret-property",
                        },
                    },
                ],
            },
        },
    ],
});