|
| 1 | +import { Construct } from 'constructs'; |
| 2 | +import { EksBlueprint, utils } from '@aws-quickstart/eks-blueprints'; |
| 3 | +import * as blueprints from '@aws-quickstart/eks-blueprints'; |
| 4 | +import { GrafanaOperatorSecretAddon } from './grafanaoperatorsecretaddon'; |
| 5 | +import * as amp from 'aws-cdk-lib/aws-aps'; |
| 6 | +import * as eks from 'aws-cdk-lib/aws-eks'; |
| 7 | +import * as ec2 from 'aws-cdk-lib/aws-ec2'; |
| 8 | +import * as assert from "assert"; |
| 9 | + |
| 10 | +export default class SingleNewEksOpenSourceGravitonObservabilityConstruct { |
| 11 | + constructor(scope: Construct, id: string) { |
| 12 | + // AddOns for the cluster |
| 13 | + const stackId = `${id}-observability-accelerator`; |
| 14 | + // All Grafana Dashboard Default URLs |
| 15 | + const clusterDefaultDashUrl = "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/cluster.json"; |
| 16 | + const kubeletDefaultDashUrl = "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/kubelet.json"; |
| 17 | + const namespaceWorkloadsDefaultDashUrl = "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/namespace-workloads.json"; |
| 18 | + const nodeExporterDefaultDashUrl = "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/nodeexporter-nodes.json"; |
| 19 | + const nodesDefaultDashUrl = "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/nodes.json"; |
| 20 | + const workloadsDefaultDashUrl = "https://raw.githubusercontent.com/aws-observability/aws-observability-accelerator/main/artifacts/grafana-dashboards/eks/infrastructure/workloads.json"; |
| 21 | + |
| 22 | + const account = process.env.COA_ACCOUNT_ID! || process.env.CDK_DEFAULT_ACCOUNT!; |
| 23 | + const region = process.env.COA_AWS_REGION! || process.env.CDK_DEFAULT_REGION!; |
| 24 | + const ampWorkspaceName = process.env.COA_AMP_WORKSPACE_NAME! || 'observability-amp-Workspace'; |
| 25 | + const ampPrometheusEndpoint = (blueprints.getNamedResource(ampWorkspaceName) as unknown as amp.CfnWorkspace).attrPrometheusEndpoint; |
| 26 | + |
| 27 | + const amgEndpointUrl = process.env.COA_AMG_ENDPOINT_URL; |
| 28 | + |
| 29 | + // All Grafana Dashboard URLs from `cdk.json` if present |
| 30 | + const clusterDashUrl: string = utils.valueFromContext(scope, "cluster.dashboard.url", clusterDefaultDashUrl); |
| 31 | + const kubeletDashUrl: string = utils.valueFromContext(scope, "kubelet.dashboard.url", kubeletDefaultDashUrl); |
| 32 | + const namespaceWorkloadsDashUrl: string = utils.valueFromContext(scope, "cluster.dashboard.url", namespaceWorkloadsDefaultDashUrl); |
| 33 | + const nodeExporterDashUrl: string = utils.valueFromContext(scope, "kubelet.dashboard.url", nodeExporterDefaultDashUrl); |
| 34 | + const nodesDashUrl: string = utils.valueFromContext(scope, "cluster.dashboard.url", nodesDefaultDashUrl); |
| 35 | + const workloadsDashUrl: string = utils.valueFromContext(scope, "kubelet.dashboard.url", workloadsDefaultDashUrl); |
| 36 | + |
| 37 | + Reflect.defineMetadata("ordered", true, blueprints.addons.GrafanaOperatorAddon); |
| 38 | + const addOns: Array<blueprints.ClusterAddOn> = [ |
| 39 | + new blueprints.addons.AwsLoadBalancerControllerAddOn(), |
| 40 | + new blueprints.addons.VpcCniAddOn(), |
| 41 | + new blueprints.addons.CoreDnsAddOn(), |
| 42 | + new blueprints.addons.KubeProxyAddOn("v1.27.1-eksbuild.1"), |
| 43 | + new blueprints.addons.CertManagerAddOn(), |
| 44 | + new blueprints.addons.ExternalsSecretsAddOn(), |
| 45 | + new blueprints.addons.PrometheusNodeExporterAddOn(), |
| 46 | + new blueprints.addons.KubeStateMetricsAddOn(), |
| 47 | + new blueprints.addons.CloudWatchLogsAddon({ |
| 48 | + logGroupPrefix: `/aws/eks/${stackId}`, |
| 49 | + logRetentionDays: 30 |
| 50 | + }), |
| 51 | + new blueprints.addons.AdotCollectorAddOn(), |
| 52 | + new blueprints.addons.AmpAddOn({ |
| 53 | + ampPrometheusEndpoint: ampPrometheusEndpoint, |
| 54 | + }), |
| 55 | + new blueprints.addons.XrayAdotAddOn(), |
| 56 | + new blueprints.addons.GrafanaOperatorAddon({ |
| 57 | + version: 'v5.0.0-rc3' |
| 58 | + }), |
| 59 | + new blueprints.addons.FluxCDAddOn({ |
| 60 | + bootstrapRepo: { |
| 61 | + repoUrl: 'https://github.com/aws-observability/aws-observability-accelerator', |
| 62 | + name: "grafana-dashboards", |
| 63 | + targetRevision: "main", |
| 64 | + path: "./artifacts/grafana-operator-manifests/eks/infrastructure" |
| 65 | + }, |
| 66 | + fluxTargetNamespace: "grafana-operator", |
| 67 | + bootstrapValues: { |
| 68 | + "AMG_AWS_REGION": region, |
| 69 | + "AMP_ENDPOINT_URL": ampPrometheusEndpoint, |
| 70 | + "AMG_ENDPOINT_URL": amgEndpointUrl, |
| 71 | + "GRAFANA_CLUSTER_DASH_URL" : clusterDashUrl, |
| 72 | + "GRAFANA_KUBELET_DASH_URL" : kubeletDashUrl, |
| 73 | + "GRAFANA_NSWRKLDS_DASH_URL" : namespaceWorkloadsDashUrl, |
| 74 | + "GRAFANA_NODEEXP_DASH_URL" : nodeExporterDashUrl, |
| 75 | + "GRAFANA_NODES_DASH_URL" : nodesDashUrl, |
| 76 | + "GRAFANA_WORKLOADS_DASH_URL" : workloadsDashUrl |
| 77 | + }, |
| 78 | + }), |
| 79 | + new GrafanaOperatorSecretAddon(), |
| 80 | + ]; |
| 81 | + |
| 82 | + const mngProps: blueprints.MngClusterProviderProps = { |
| 83 | + version: eks.KubernetesVersion.of("1.27"), |
| 84 | + instanceTypes: [new ec2.InstanceType("m7g.large")], |
| 85 | + amiType: eks.NodegroupAmiType.AL2_ARM_64, |
| 86 | + } |
| 87 | + |
| 88 | + EksBlueprint.builder() |
| 89 | + .account(account) |
| 90 | + .region(region) |
| 91 | + .resourceProvider(ampWorkspaceName, new blueprints.CreateAmpProvider(ampWorkspaceName, ampWorkspaceName)) |
| 92 | + .clusterProvider(new blueprints.MngClusterProvider(mngProps)) |
| 93 | + .addOns(...addOns) |
| 94 | + .build(scope, stackId); |
| 95 | + } |
| 96 | +} |
0 commit comments