diff --git a/packages/charts/crisiscleanup/test/__snapshots__/main.spec.ts.snap b/packages/charts/crisiscleanup/test/__snapshots__/main.spec.ts.snap index 9be8338..c871a5a 100644 --- a/packages/charts/crisiscleanup/test/__snapshots__/main.spec.ts.snap +++ b/packages/charts/crisiscleanup/test/__snapshots__/main.spec.ts.snap @@ -491,11 +491,10 @@ exports[`CrisisCleanupChart: 'defaults' > api matches snapshot > defaults-api 1` }, "resources": { "limits": { - "cpu": "3", - "memory": "3072Mi", + "memory": "1024Mi", }, "requests": { - "cpu": "200m", + "cpu": "100m", "memory": "1024Mi", }, }, @@ -517,6 +516,53 @@ exports[`CrisisCleanupChart: 'defaults' > api matches snapshot > defaults-api 1` "periodSeconds": 15, }, }, + { + "command": [ + "./serve.sh", + "channelsworker", + "rag-document", + ], + "envFrom": [ + { + "configMapRef": { + "name": "crisiscleanup-config-api-config", + }, + }, + ], + "image": "test-api:test", + "imagePullPolicy": "Always", + "name": "rag-channels", + "resources": { + "limits": { + "cpu": "3", + "memory": "4096Mi", + }, + "requests": { + "cpu": "200m", + "memory": "1024Mi", + }, + }, + "securityContext": { + "allowPrivilegeEscalation": false, + "privileged": false, + "readOnlyRootFilesystem": false, + "runAsGroup": 1000, + "runAsNonRoot": true, + "runAsUser": 1000, + }, + "volumeMounts": [ + { + "mountPath": "/ccu/nltk_data", + "name": "nltk-data", + "readOnly": false, + }, + { + "mountPath": "/ccu/.cache/huggingface", + "name": "hf-data", + "readOnly": false, + }, + ], + }, ], "dnsPolicy": "ClusterFirst", "hostNetwork": false, @@ -527,6 +573,22 @@ exports[`CrisisCleanupChart: 'defaults' > api matches snapshot > defaults-api 1` }, "setHostnameAsFQDN": false, "terminationGracePeriodSeconds": 30, + "volumes": [ + { + "hostPath": { + "path": "/ccu/nltk_data", + "type": "DirectoryOrCreate", + }, + "name": "nltk-data", + }, + { + "hostPath": { + "path": "/ccu/.cache/huggingface", + "type": "DirectoryOrCreate", + }, + "name": "hf-data", + }, + ], }, }, }, @@ -1694,11 +1756,10 @@ exports[`CrisisCleanupChart: 'with spread' > api matches snapshot > with spread- }, "resources": { "limits": { - "cpu": "3", - "memory": "3072Mi", + "memory": "1024Mi", }, "requests": { - "cpu": "200m", + "cpu": "100m", "memory": "1024Mi", }, }, @@ -1720,6 +1781,53 @@ exports[`CrisisCleanupChart: 'with spread' > api matches snapshot > with spread- "periodSeconds": 15, }, }, + { + "command": [ + "./serve.sh", + "channelsworker", + "rag-document", + ], + "envFrom": [ + { + "configMapRef": { + "name": "crisiscleanup-config-api-config", + }, + }, + ], + "image": "test-api:test", + "imagePullPolicy": "Always", + "name": "rag-channels", + "resources": { + "limits": { + "cpu": "3", + "memory": "4096Mi", + }, + "requests": { + "cpu": "200m", + "memory": "1024Mi", + }, + }, + "securityContext": { + "allowPrivilegeEscalation": false, + "privileged": false, + "readOnlyRootFilesystem": false, + "runAsGroup": 1000, + "runAsNonRoot": true, + "runAsUser": 1000, + }, + "volumeMounts": [ + { + "mountPath": "/ccu/nltk_data", + "name": "nltk-data", + "readOnly": false, + }, + { + "mountPath": "/ccu/.cache/huggingface", + "name": "hf-data", + "readOnly": false, + }, + ], + }, ], "dnsPolicy": "ClusterFirst", "hostNetwork": false, @@ -1742,6 +1850,22 @@ exports[`CrisisCleanupChart: 'with spread' > api matches snapshot > with spread- "whenUnsatisfiable": "ScheduleAnyway", }, ], + "volumes": [ + { + "hostPath": { + "path": "/ccu/nltk_data", + "type": "DirectoryOrCreate", + }, + "name": "nltk-data", + }, + { + "hostPath": { + "path": "/ccu/.cache/huggingface", + "type": "DirectoryOrCreate", + }, + "name": "hf-data", + }, + ], }, }, }, @@ -2895,11 +3019,10 @@ exports[`CrisisCleanupChart: 'with sync' > api matches snapshot > with sync-api }, "resources": { "limits": { - "cpu": "3", - "memory": "3072Mi", + "memory": "1024Mi", }, "requests": { - "cpu": "200m", + "cpu": "100m", "memory": "1024Mi", }, }, @@ -2921,6 +3044,53 @@ exports[`CrisisCleanupChart: 'with sync' > api matches snapshot > with sync-api "periodSeconds": 15, }, }, + { + "command": [ + "./serve.sh", + "channelsworker", + "rag-document", + ], + "envFrom": [ + { + "configMapRef": { + "name": "crisiscleanup-config-api-config", + }, + }, + ], + "image": "test-api:test", + "imagePullPolicy": "Always", + "name": "rag-channels", + "resources": { + "limits": { + "cpu": "3", + "memory": "4096Mi", + }, + "requests": { + "cpu": "200m", + "memory": "1024Mi", + }, + }, + "securityContext": { + "allowPrivilegeEscalation": false, + "privileged": false, + "readOnlyRootFilesystem": false, + "runAsGroup": 1000, + "runAsNonRoot": true, + "runAsUser": 1000, + }, + "volumeMounts": [ + { + "mountPath": "/ccu/nltk_data", + "name": "nltk-data", + "readOnly": false, + }, + { + "mountPath": "/ccu/.cache/huggingface", + "name": "hf-data", + "readOnly": false, + }, + ], + }, ], "dnsPolicy": "ClusterFirst", "hostNetwork": false, @@ -2931,6 +3101,22 @@ exports[`CrisisCleanupChart: 'with sync' > api matches snapshot > with sync-api }, "setHostnameAsFQDN": false, "terminationGracePeriodSeconds": 30, + "volumes": [ + { + "hostPath": { + "path": "/ccu/nltk_data", + "type": "DirectoryOrCreate", + }, + "name": "nltk-data", + }, + { + "hostPath": { + "path": "/ccu/.cache/huggingface", + "type": "DirectoryOrCreate", + }, + "name": "hf-data", + }, + ], }, }, }, diff --git a/packages/k8s/construct/api/src/api.ts b/packages/k8s/construct/api/src/api.ts index fd76fd9..e4908b1 100644 --- a/packages/k8s/construct/api/src/api.ts +++ b/packages/k8s/construct/api/src/api.ts @@ -297,6 +297,31 @@ export class ApiASGI constructor(scope: Construct, id: string, props: ApiASGIProps) { super(scope, id, props) + + // NLP processing tokenizers / related + // (share via host for now, may move to csi provided volume) + const nltkDataVol = kplus.Volume.fromHostPath( + this, + id + '-nltk-volume', + 'nltk-data', + { + type: kplus.HostPathVolumeType.DIRECTORY_OR_CREATE, + path: '/ccu/nltk_data', + }, + ) + + // Huggingface sourced models + // (share via host for now, may move to csi provided volume) + const hfDataVol = kplus.Volume.fromHostPath( + this, + id + '-hf-volume', + 'hf-data', + { + type: kplus.HostPathVolumeType.DIRECTORY_OR_CREATE, + path: '/ccu/.cache/huggingface', + }, + ) + this.addContainer({ name: 'hypercorn', command: ['/serve.sh', 'asgi', `--workers=${props.workers ?? 2}`], @@ -309,17 +334,34 @@ export class ApiASGI user: 1000, group: 1000, }, + }) + + // rag channels worker sidecar + // TODO: probably move to a separate deployment + // (need to figure scaling triggers/metrics) + const ragSidecar = this.addContainer({ + name: 'rag-channels', + command: ['./serve.sh', 'channelsworker', 'rag-document'], + envFrom: this.config.env.sources, + envVariables: this.config.env.variables, + securityContext: { + readOnlyRootFilesystem: false, + user: 1000, + group: 1000, + }, resources: { cpu: { limit: kplus.Cpu.units(3), request: kplus.Cpu.millis(200), }, memory: { - limit: Size.gibibytes(3), + limit: Size.gibibytes(4), request: Size.gibibytes(1), }, }, }) + ragSidecar.mount('/ccu/nltk_data', nltkDataVol, { readOnly: false }) + ragSidecar.mount('/ccu/.cache/huggingface', hfDataVol, { readOnly: false }) } } diff --git a/packages/stacks/api/test/__snapshots__/main.spec.ts.snap b/packages/stacks/api/test/__snapshots__/main.spec.ts.snap index a454b2b..19d6312 100644 --- a/packages/stacks/api/test/__snapshots__/main.spec.ts.snap +++ b/packages/stacks/api/test/__snapshots__/main.spec.ts.snap @@ -1283,7 +1283,7 @@ exports[`Snapshot 1`] = ` "ClusterName": { "Ref": "teststackF0A1F222", }, - "Manifest": "[{\\"apiVersion\\":\\"apps/v1\\",\\"kind\\":\\"Deployment\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/name\\":\\"wsgi\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-wsgi\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"minReadySeconds\\":0,\\"progressDeadlineSeconds\\":600,\\"selector\\":{\\"matchLabels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-wsgi-c83e828d\\"}},\\"strategy\\":{\\"rollingUpdate\\":{\\"maxSurge\\":\\"25%\\",\\"maxUnavailable\\":\\"25%\\"},\\"type\\":\\"RollingUpdate\\"},\\"template\\":{\\"metadata\\":{\\"labels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-wsgi-c83e828d\\"}},\\"spec\\":{\\"automountServiceAccountToken\\":false,\\"containers\\":[{\\"command\\":[\\"/serve.sh\\",\\"wsgi\\",\\"--workers=2\\",\\"--threads=4\\",\\"--worker-class=gthread\\",\\"--worker-tmp-dir=/worker-tmp\\",\\"--timeout=90\\"],\\"env\\":[{\\"name\\":\\"POSTGRES_USER\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_USER\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_PASSWORD\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_PASSWORD\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_HOST\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_HOST\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}}],\\"envFrom\\":[{\\"configMapRef\\":{\\"name\\":\\"crisiscleanup-config-api-config\\"}}],\\"image\\":\\"crisiscleanup-api:latest\\",\\"imagePullPolicy\\":\\"IfNotPresent\\",\\"livenessProbe\\":{\\"failureThreshold\\":6,\\"httpGet\\":{\\"path\\":\\"/health\\",\\"port\\":5000,\\"scheme\\":\\"HTTP\\"},\\"initialDelaySeconds\\":20,\\"periodSeconds\\":10,\\"timeoutSeconds\\":6},\\"name\\":\\"gunicorn\\",\\"ports\\":[{\\"containerPort\\":5000}],\\"readinessProbe\\":{\\"failureThreshold\\":6,\\"httpGet\\":{\\"path\\":\\"/health\\",\\"port\\":5000,\\"scheme\\":\\"HTTP\\"},\\"initialDelaySeconds\\":20,\\"periodSeconds\\":10,\\"timeoutSeconds\\":6},\\"resources\\":{\\"limits\\":{\\"memory\\":\\"1200Mi\\"},\\"requests\\":{\\"cpu\\":\\"100m\\",\\"memory\\":\\"1200Mi\\"}},\\"securityContext\\":{\\"allowPrivilegeEscalation\\":false,\\"privileged\\":false,\\"readOnlyRootFilesystem\\":false,\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"startupProbe\\":{\\"failureThreshold\\":30,\\"httpGet\\":{\\"path\\":\\"/health\\",\\"port\\":5000,\\"scheme\\":\\"HTTP\\"},\\"periodSeconds\\":15},\\"volumeMounts\\":[{\\"mountPath\\":\\"/app/staticfiles\\",\\"name\\":\\"staticfiles\\"},{\\"mountPath\\":\\"/worker-tmp\\",\\"name\\":\\"worker-tmp\\"},{\\"mountPath\\":\\"/mnt/secrets-store\\",\\"name\\":\\"secrets-store-inline\\",\\"readOnly\\":true}]}],\\"dnsPolicy\\":\\"ClusterFirst\\",\\"hostNetwork\\":false,\\"restartPolicy\\":\\"Always\\",\\"securityContext\\":{\\"fsGroupChangePolicy\\":\\"Always\\",\\"runAsNonRoot\\":true},\\"serviceAccountName\\":\\"crisiscleanup-api\\",\\"setHostnameAsFQDN\\":false,\\"terminationGracePeriodSeconds\\":30,\\"volumes\\":[{\\"emptyDir\\":{},\\"name\\":\\"staticfiles\\"},{\\"emptyDir\\":{\\"medium\\":\\"Memory\\"},\\"name\\":\\"worker-tmp\\"},{\\"csi\\":{\\"driver\\":\\"secrets-store.csi.k8s.io\\",\\"readOnly\\":true,\\"volumeAttributes\\":{\\"secretProviderClass\\":\\"crisiscleanup-api\\"}},\\"name\\":\\"secrets-store-inline\\"}]}}}},{\\"apiVersion\\":\\"batch/v1\\",\\"kind\\":\\"Job\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-wsgi-migrate\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"activeDeadlineSeconds\\":1800,\\"template\\":{\\"metadata\\":{\\"labels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-wsgi-migrate-c8890c80\\",\\"component\\":\\"api-migrate\\"}},\\"spec\\":{\\"automountServiceAccountToken\\":false,\\"containers\\":[{\\"command\\":[\\"python\\",\\"manage.py\\",\\"migrate\\",\\"--noinput\\",\\"--verbosity=1\\"],\\"env\\":[{\\"name\\":\\"POSTGRES_USER\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_USER\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_PASSWORD\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_PASSWORD\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_HOST\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_HOST\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}}],\\"envFrom\\":[{\\"configMapRef\\":{\\"name\\":\\"crisiscleanup-config-api-config\\"}}],\\"image\\":\\"crisiscleanup-api:latest\\",\\"imagePullPolicy\\":\\"IfNotPresent\\",\\"name\\":\\"migrate\\",\\"resources\\":{\\"limits\\":{\\"memory\\":\\"3072Mi\\"},\\"requests\\":{\\"cpu\\":\\"100m\\",\\"memory\\":\\"1024Mi\\"}},\\"securityContext\\":{\\"allowPrivilegeEscalation\\":false,\\"privileged\\":false,\\"readOnlyRootFilesystem\\":false,\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"volumeMounts\\":[{\\"mountPath\\":\\"/mnt/secrets-store\\",\\"name\\":\\"secrets-store-inline\\",\\"readOnly\\":true}]}],\\"dnsPolicy\\":\\"ClusterFirst\\",\\"hostNetwork\\":false,\\"restartPolicy\\":\\"Never\\",\\"securityContext\\":{\\"fsGroupChangePolicy\\":\\"Always\\",\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"serviceAccountName\\":\\"crisiscleanup-api\\",\\"setHostnameAsFQDN\\":false,\\"terminationGracePeriodSeconds\\":300,\\"volumes\\":[{\\"csi\\":{\\"driver\\":\\"secrets-store.csi.k8s.io\\",\\"readOnly\\":true,\\"volumeAttributes\\":{\\"secretProviderClass\\":\\"crisiscleanup-api\\"}},\\"name\\":\\"secrets-store-inline\\"}]}},\\"ttlSecondsAfterFinished\\":120}},{\\"apiVersion\\":\\"batch/v1\\",\\"kind\\":\\"Job\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-wsgi-collectstatic\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"activeDeadlineSeconds\\":1800,\\"template\\":{\\"metadata\\":{\\"labels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-wsgi-collectstatic-c871685d\\",\\"component\\":\\"api-static\\"}},\\"spec\\":{\\"automountServiceAccountToken\\":false,\\"containers\\":[{\\"command\\":[\\"python\\",\\"manage.py\\",\\"collectstatic\\",\\"--no-post-process\\",\\"--noinput\\",\\"--verbosity=2\\"],\\"env\\":[{\\"name\\":\\"POSTGRES_USER\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_USER\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_PASSWORD\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_PASSWORD\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_HOST\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_HOST\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}}],\\"envFrom\\":[{\\"configMapRef\\":{\\"name\\":\\"crisiscleanup-config-api-config\\"}}],\\"image\\":\\"crisiscleanup-api:latest\\",\\"imagePullPolicy\\":\\"IfNotPresent\\",\\"name\\":\\"collectstatic\\",\\"resources\\":{\\"limits\\":{\\"memory\\":\\"3072Mi\\"},\\"requests\\":{\\"cpu\\":\\"100m\\",\\"memory\\":\\"1024Mi\\"}},\\"securityContext\\":{\\"allowPrivilegeEscalation\\":false,\\"privileged\\":false,\\"readOnlyRootFilesystem\\":false,\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"volumeMounts\\":[{\\"mountPath\\":\\"/app/staticfiles\\",\\"name\\":\\"staticfiles\\"},{\\"mountPath\\":\\"/mnt/secrets-store\\",\\"name\\":\\"secrets-store-inline\\",\\"readOnly\\":true}]}],\\"dnsPolicy\\":\\"ClusterFirst\\",\\"hostNetwork\\":false,\\"restartPolicy\\":\\"Never\\",\\"securityContext\\":{\\"fsGroupChangePolicy\\":\\"Always\\",\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"serviceAccountName\\":\\"crisiscleanup-api\\",\\"setHostnameAsFQDN\\":false,\\"terminationGracePeriodSeconds\\":300,\\"volumes\\":[{\\"emptyDir\\":{},\\"name\\":\\"staticfiles\\"},{\\"csi\\":{\\"driver\\":\\"secrets-store.csi.k8s.io\\",\\"readOnly\\":true,\\"volumeAttributes\\":{\\"secretProviderClass\\":\\"crisiscleanup-api\\"}},\\"name\\":\\"secrets-store-inline\\"}]}},\\"ttlSecondsAfterFinished\\":120}},{\\"apiVersion\\":\\"v1\\",\\"kind\\":\\"Service\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-wsgi-service\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"externalIPs\\":[],\\"ports\\":[{\\"port\\":5000,\\"targetPort\\":5000}],\\"selector\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-wsgi-c83e828d\\"},\\"type\\":\\"ClusterIP\\"}},{\\"apiVersion\\":\\"autoscaling/v2\\",\\"kind\\":\\"HorizontalPodAutoscaler\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-wsgi-hpa\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"behavior\\":{\\"scaleDown\\":{\\"policies\\":[{\\"periodSeconds\\":300,\\"type\\":\\"Pods\\",\\"value\\":1}],\\"selectPolicy\\":\\"Max\\",\\"stabilizationWindowSeconds\\":300},\\"scaleUp\\":{\\"policies\\":[{\\"periodSeconds\\":60,\\"type\\":\\"Pods\\",\\"value\\":4},{\\"periodSeconds\\":60,\\"type\\":\\"Percent\\",\\"value\\":200}],\\"selectPolicy\\":\\"Max\\",\\"stabilizationWindowSeconds\\":0}},\\"maxReplicas\\":3,\\"metrics\\":[{\\"resource\\":{\\"name\\":\\"cpu\\",\\"target\\":{\\"averageUtilization\\":70,\\"type\\":\\"Utilization\\"}},\\"type\\":\\"Resource\\"},{\\"resource\\":{\\"name\\":\\"memory\\",\\"target\\":{\\"averageUtilization\\":85,\\"type\\":\\"Utilization\\"}},\\"type\\":\\"Resource\\"}],\\"minReplicas\\":1,\\"scaleTargetRef\\":{\\"apiVersion\\":\\"apps/v1\\",\\"kind\\":\\"Deployment\\",\\"name\\":\\"crisiscleanup-api-wsgi\\"}}},{\\"apiVersion\\":\\"apps/v1\\",\\"kind\\":\\"Deployment\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/name\\":\\"asgi\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-asgi\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"minReadySeconds\\":0,\\"progressDeadlineSeconds\\":600,\\"selector\\":{\\"matchLabels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-asgi-c818ff7e\\"}},\\"strategy\\":{\\"rollingUpdate\\":{\\"maxSurge\\":\\"25%\\",\\"maxUnavailable\\":\\"25%\\"},\\"type\\":\\"RollingUpdate\\"},\\"template\\":{\\"metadata\\":{\\"labels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-asgi-c818ff7e\\"}},\\"spec\\":{\\"automountServiceAccountToken\\":false,\\"containers\\":[{\\"command\\":[\\"/serve.sh\\",\\"asgi\\",\\"--workers=2\\"],\\"env\\":[{\\"name\\":\\"POSTGRES_USER\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_USER\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_PASSWORD\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_PASSWORD\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_HOST\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_HOST\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}}],\\"envFrom\\":[{\\"configMapRef\\":{\\"name\\":\\"crisiscleanup-config-api-config\\"}}],\\"image\\":\\"crisiscleanup-api:latest\\",\\"imagePullPolicy\\":\\"IfNotPresent\\",\\"livenessProbe\\":{\\"failureThreshold\\":6,\\"httpGet\\":{\\"path\\":\\"/ws/health\\",\\"port\\":5000,\\"scheme\\":\\"HTTP\\"},\\"initialDelaySeconds\\":20,\\"periodSeconds\\":10,\\"timeoutSeconds\\":6},\\"name\\":\\"hypercorn\\",\\"ports\\":[{\\"containerPort\\":5000}],\\"readinessProbe\\":{\\"failureThreshold\\":6,\\"httpGet\\":{\\"path\\":\\"/ws/health\\",\\"port\\":5000,\\"scheme\\":\\"HTTP\\"},\\"initialDelaySeconds\\":20,\\"periodSeconds\\":10,\\"timeoutSeconds\\":6},\\"resources\\":{\\"limits\\":{\\"cpu\\":\\"3\\",\\"memory\\":\\"3072Mi\\"},\\"requests\\":{\\"cpu\\":\\"200m\\",\\"memory\\":\\"1024Mi\\"}},\\"securityContext\\":{\\"allowPrivilegeEscalation\\":false,\\"privileged\\":false,\\"readOnlyRootFilesystem\\":false,\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"startupProbe\\":{\\"failureThreshold\\":30,\\"httpGet\\":{\\"path\\":\\"/ws/health\\",\\"port\\":5000,\\"scheme\\":\\"HTTP\\"},\\"periodSeconds\\":15},\\"volumeMounts\\":[{\\"mountPath\\":\\"/mnt/secrets-store\\",\\"name\\":\\"secrets-store-inline\\",\\"readOnly\\":true}]}],\\"dnsPolicy\\":\\"ClusterFirst\\",\\"hostNetwork\\":false,\\"restartPolicy\\":\\"Always\\",\\"securityContext\\":{\\"fsGroupChangePolicy\\":\\"Always\\",\\"runAsNonRoot\\":true},\\"serviceAccountName\\":\\"crisiscleanup-api\\",\\"setHostnameAsFQDN\\":false,\\"terminationGracePeriodSeconds\\":30,\\"volumes\\":[{\\"csi\\":{\\"driver\\":\\"secrets-store.csi.k8s.io\\",\\"readOnly\\":true,\\"volumeAttributes\\":{\\"secretProviderClass\\":\\"crisiscleanup-api\\"}},\\"name\\":\\"secrets-store-inline\\"}]}}}},{\\"apiVersion\\":\\"v1\\",\\"kind\\":\\"Service\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-asgi-service\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"externalIPs\\":[],\\"ports\\":[{\\"port\\":5000,\\"targetPort\\":5000}],\\"selector\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-asgi-c818ff7e\\"},\\"type\\":\\"ClusterIP\\"}},{\\"apiVersion\\":\\"autoscaling/v2\\",\\"kind\\":\\"HorizontalPodAutoscaler\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-asgi-hpa\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"behavior\\":{\\"scaleDown\\":{\\"policies\\":[{\\"periodSeconds\\":300,\\"type\\":\\"Pods\\",\\"value\\":1}],\\"selectPolicy\\":\\"Max\\",\\"stabilizationWindowSeconds\\":300},\\"scaleUp\\":{\\"policies\\":[{\\"periodSeconds\\":60,\\"type\\":\\"Pods\\",\\"value\\":4},{\\"periodSeconds\\":60,\\"type\\":\\"Percent\\",\\"value\\":200}],\\"selectPolicy\\":\\"Max\\",\\"stabilizationWindowSeconds\\":0}},\\"maxReplicas\\":2,\\"metrics\\":[{\\"resource\\":{\\"name\\":\\"cpu\\",\\"target\\":{\\"averageUtilization\\":70,\\"type\\":\\"Utilization\\"}},\\"type\\":\\"Resource\\"},{\\"resource\\":{\\"name\\":\\"memory\\",\\"target\\":{\\"averageUtilization\\":85,\\"type\\":\\"Utilization\\"}},\\"type\\":\\"Resource\\"}],\\"minReplicas\\":1,\\"scaleTargetRef\\":{\\"apiVersion\\":\\"apps/v1\\",\\"kind\\":\\"Deployment\\",\\"name\\":\\"crisiscleanup-api-asgi\\"}}},{\\"apiVersion\\":\\"apps/v1\\",\\"kind\\":\\"Deployment\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/name\\":\\"adminwebsocket\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-admin-websocket\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"minReadySeconds\\":0,\\"progressDeadlineSeconds\\":600,\\"replicas\\":1,\\"selector\\":{\\"matchLabels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-admin-websocket-c879d9e4\\"}},\\"strategy\\":{\\"rollingUpdate\\":{\\"maxSurge\\":\\"25%\\",\\"maxUnavailable\\":\\"25%\\"},\\"type\\":\\"RollingUpdate\\"},\\"template\\":{\\"metadata\\":{\\"labels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-admin-websocket-c879d9e4\\"}},\\"spec\\":{\\"automountServiceAccountToken\\":false,\\"containers\\":[{\\"command\\":[\\"/serve.sh\\",\\"adminwebsocket\\"],\\"env\\":[{\\"name\\":\\"POSTGRES_USER\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_USER\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_PASSWORD\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_PASSWORD\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_HOST\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_HOST\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}}],\\"envFrom\\":[{\\"configMapRef\\":{\\"name\\":\\"crisiscleanup-config-api-config\\"}}],\\"image\\":\\"crisiscleanup-api:latest\\",\\"imagePullPolicy\\":\\"IfNotPresent\\",\\"name\\":\\"adminwebsocket\\",\\"resources\\":{\\"limits\\":{\\"memory\\":\\"250Mi\\"},\\"requests\\":{\\"cpu\\":\\"3m\\",\\"memory\\":\\"250Mi\\"}},\\"securityContext\\":{\\"allowPrivilegeEscalation\\":false,\\"privileged\\":false,\\"readOnlyRootFilesystem\\":false,\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"volumeMounts\\":[{\\"mountPath\\":\\"/mnt/secrets-store\\",\\"name\\":\\"secrets-store-inline\\",\\"readOnly\\":true}]}],\\"dnsPolicy\\":\\"ClusterFirst\\",\\"hostNetwork\\":false,\\"restartPolicy\\":\\"Always\\",\\"securityContext\\":{\\"fsGroupChangePolicy\\":\\"Always\\",\\"runAsNonRoot\\":true},\\"serviceAccountName\\":\\"crisiscleanup-api\\",\\"setHostnameAsFQDN\\":false,\\"terminationGracePeriodSeconds\\":30,\\"volumes\\":[{\\"csi\\":{\\"driver\\":\\"secrets-store.csi.k8s.io\\",\\"readOnly\\":true,\\"volumeAttributes\\":{\\"secretProviderClass\\":\\"crisiscleanup-api\\"}},\\"name\\":\\"secrets-store-inline\\"}]}}}}]", + "Manifest": "[{\\"apiVersion\\":\\"apps/v1\\",\\"kind\\":\\"Deployment\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/name\\":\\"wsgi\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-wsgi\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"minReadySeconds\\":0,\\"progressDeadlineSeconds\\":600,\\"selector\\":{\\"matchLabels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-wsgi-c83e828d\\"}},\\"strategy\\":{\\"rollingUpdate\\":{\\"maxSurge\\":\\"25%\\",\\"maxUnavailable\\":\\"25%\\"},\\"type\\":\\"RollingUpdate\\"},\\"template\\":{\\"metadata\\":{\\"labels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-wsgi-c83e828d\\"}},\\"spec\\":{\\"automountServiceAccountToken\\":false,\\"containers\\":[{\\"command\\":[\\"/serve.sh\\",\\"wsgi\\",\\"--workers=2\\",\\"--threads=4\\",\\"--worker-class=gthread\\",\\"--worker-tmp-dir=/worker-tmp\\",\\"--timeout=90\\"],\\"env\\":[{\\"name\\":\\"POSTGRES_USER\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_USER\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_PASSWORD\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_PASSWORD\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_HOST\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_HOST\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}}],\\"envFrom\\":[{\\"configMapRef\\":{\\"name\\":\\"crisiscleanup-config-api-config\\"}}],\\"image\\":\\"crisiscleanup-api:latest\\",\\"imagePullPolicy\\":\\"IfNotPresent\\",\\"livenessProbe\\":{\\"failureThreshold\\":6,\\"httpGet\\":{\\"path\\":\\"/health\\",\\"port\\":5000,\\"scheme\\":\\"HTTP\\"},\\"initialDelaySeconds\\":20,\\"periodSeconds\\":10,\\"timeoutSeconds\\":6},\\"name\\":\\"gunicorn\\",\\"ports\\":[{\\"containerPort\\":5000}],\\"readinessProbe\\":{\\"failureThreshold\\":6,\\"httpGet\\":{\\"path\\":\\"/health\\",\\"port\\":5000,\\"scheme\\":\\"HTTP\\"},\\"initialDelaySeconds\\":20,\\"periodSeconds\\":10,\\"timeoutSeconds\\":6},\\"resources\\":{\\"limits\\":{\\"memory\\":\\"1200Mi\\"},\\"requests\\":{\\"cpu\\":\\"100m\\",\\"memory\\":\\"1200Mi\\"}},\\"securityContext\\":{\\"allowPrivilegeEscalation\\":false,\\"privileged\\":false,\\"readOnlyRootFilesystem\\":false,\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"startupProbe\\":{\\"failureThreshold\\":30,\\"httpGet\\":{\\"path\\":\\"/health\\",\\"port\\":5000,\\"scheme\\":\\"HTTP\\"},\\"periodSeconds\\":15},\\"volumeMounts\\":[{\\"mountPath\\":\\"/app/staticfiles\\",\\"name\\":\\"staticfiles\\"},{\\"mountPath\\":\\"/worker-tmp\\",\\"name\\":\\"worker-tmp\\"},{\\"mountPath\\":\\"/mnt/secrets-store\\",\\"name\\":\\"secrets-store-inline\\",\\"readOnly\\":true}]}],\\"dnsPolicy\\":\\"ClusterFirst\\",\\"hostNetwork\\":false,\\"restartPolicy\\":\\"Always\\",\\"securityContext\\":{\\"fsGroupChangePolicy\\":\\"Always\\",\\"runAsNonRoot\\":true},\\"serviceAccountName\\":\\"crisiscleanup-api\\",\\"setHostnameAsFQDN\\":false,\\"terminationGracePeriodSeconds\\":30,\\"volumes\\":[{\\"emptyDir\\":{},\\"name\\":\\"staticfiles\\"},{\\"emptyDir\\":{\\"medium\\":\\"Memory\\"},\\"name\\":\\"worker-tmp\\"},{\\"csi\\":{\\"driver\\":\\"secrets-store.csi.k8s.io\\",\\"readOnly\\":true,\\"volumeAttributes\\":{\\"secretProviderClass\\":\\"crisiscleanup-api\\"}},\\"name\\":\\"secrets-store-inline\\"}]}}}},{\\"apiVersion\\":\\"batch/v1\\",\\"kind\\":\\"Job\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-wsgi-migrate\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"activeDeadlineSeconds\\":1800,\\"template\\":{\\"metadata\\":{\\"labels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-wsgi-migrate-c8890c80\\",\\"component\\":\\"api-migrate\\"}},\\"spec\\":{\\"automountServiceAccountToken\\":false,\\"containers\\":[{\\"command\\":[\\"python\\",\\"manage.py\\",\\"migrate\\",\\"--noinput\\",\\"--verbosity=1\\"],\\"env\\":[{\\"name\\":\\"POSTGRES_USER\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_USER\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_PASSWORD\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_PASSWORD\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_HOST\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_HOST\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}}],\\"envFrom\\":[{\\"configMapRef\\":{\\"name\\":\\"crisiscleanup-config-api-config\\"}}],\\"image\\":\\"crisiscleanup-api:latest\\",\\"imagePullPolicy\\":\\"IfNotPresent\\",\\"name\\":\\"migrate\\",\\"resources\\":{\\"limits\\":{\\"memory\\":\\"3072Mi\\"},\\"requests\\":{\\"cpu\\":\\"100m\\",\\"memory\\":\\"1024Mi\\"}},\\"securityContext\\":{\\"allowPrivilegeEscalation\\":false,\\"privileged\\":false,\\"readOnlyRootFilesystem\\":false,\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"volumeMounts\\":[{\\"mountPath\\":\\"/mnt/secrets-store\\",\\"name\\":\\"secrets-store-inline\\",\\"readOnly\\":true}]}],\\"dnsPolicy\\":\\"ClusterFirst\\",\\"hostNetwork\\":false,\\"restartPolicy\\":\\"Never\\",\\"securityContext\\":{\\"fsGroupChangePolicy\\":\\"Always\\",\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"serviceAccountName\\":\\"crisiscleanup-api\\",\\"setHostnameAsFQDN\\":false,\\"terminationGracePeriodSeconds\\":300,\\"volumes\\":[{\\"csi\\":{\\"driver\\":\\"secrets-store.csi.k8s.io\\",\\"readOnly\\":true,\\"volumeAttributes\\":{\\"secretProviderClass\\":\\"crisiscleanup-api\\"}},\\"name\\":\\"secrets-store-inline\\"}]}},\\"ttlSecondsAfterFinished\\":120}},{\\"apiVersion\\":\\"batch/v1\\",\\"kind\\":\\"Job\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-wsgi-collectstatic\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"activeDeadlineSeconds\\":1800,\\"template\\":{\\"metadata\\":{\\"labels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-wsgi-collectstatic-c871685d\\",\\"component\\":\\"api-static\\"}},\\"spec\\":{\\"automountServiceAccountToken\\":false,\\"containers\\":[{\\"command\\":[\\"python\\",\\"manage.py\\",\\"collectstatic\\",\\"--no-post-process\\",\\"--noinput\\",\\"--verbosity=2\\"],\\"env\\":[{\\"name\\":\\"POSTGRES_USER\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_USER\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_PASSWORD\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_PASSWORD\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_HOST\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_HOST\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}}],\\"envFrom\\":[{\\"configMapRef\\":{\\"name\\":\\"crisiscleanup-config-api-config\\"}}],\\"image\\":\\"crisiscleanup-api:latest\\",\\"imagePullPolicy\\":\\"IfNotPresent\\",\\"name\\":\\"collectstatic\\",\\"resources\\":{\\"limits\\":{\\"memory\\":\\"3072Mi\\"},\\"requests\\":{\\"cpu\\":\\"100m\\",\\"memory\\":\\"1024Mi\\"}},\\"securityContext\\":{\\"allowPrivilegeEscalation\\":false,\\"privileged\\":false,\\"readOnlyRootFilesystem\\":false,\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"volumeMounts\\":[{\\"mountPath\\":\\"/app/staticfiles\\",\\"name\\":\\"staticfiles\\"},{\\"mountPath\\":\\"/mnt/secrets-store\\",\\"name\\":\\"secrets-store-inline\\",\\"readOnly\\":true}]}],\\"dnsPolicy\\":\\"ClusterFirst\\",\\"hostNetwork\\":false,\\"restartPolicy\\":\\"Never\\",\\"securityContext\\":{\\"fsGroupChangePolicy\\":\\"Always\\",\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"serviceAccountName\\":\\"crisiscleanup-api\\",\\"setHostnameAsFQDN\\":false,\\"terminationGracePeriodSeconds\\":300,\\"volumes\\":[{\\"emptyDir\\":{},\\"name\\":\\"staticfiles\\"},{\\"csi\\":{\\"driver\\":\\"secrets-store.csi.k8s.io\\",\\"readOnly\\":true,\\"volumeAttributes\\":{\\"secretProviderClass\\":\\"crisiscleanup-api\\"}},\\"name\\":\\"secrets-store-inline\\"}]}},\\"ttlSecondsAfterFinished\\":120}},{\\"apiVersion\\":\\"v1\\",\\"kind\\":\\"Service\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-wsgi-service\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"externalIPs\\":[],\\"ports\\":[{\\"port\\":5000,\\"targetPort\\":5000}],\\"selector\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-wsgi-c83e828d\\"},\\"type\\":\\"ClusterIP\\"}},{\\"apiVersion\\":\\"autoscaling/v2\\",\\"kind\\":\\"HorizontalPodAutoscaler\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-wsgi-hpa\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"behavior\\":{\\"scaleDown\\":{\\"policies\\":[{\\"periodSeconds\\":300,\\"type\\":\\"Pods\\",\\"value\\":1}],\\"selectPolicy\\":\\"Max\\",\\"stabilizationWindowSeconds\\":300},\\"scaleUp\\":{\\"policies\\":[{\\"periodSeconds\\":60,\\"type\\":\\"Pods\\",\\"value\\":4},{\\"periodSeconds\\":60,\\"type\\":\\"Percent\\",\\"value\\":200}],\\"selectPolicy\\":\\"Max\\",\\"stabilizationWindowSeconds\\":0}},\\"maxReplicas\\":3,\\"metrics\\":[{\\"resource\\":{\\"name\\":\\"cpu\\",\\"target\\":{\\"averageUtilization\\":70,\\"type\\":\\"Utilization\\"}},\\"type\\":\\"Resource\\"},{\\"resource\\":{\\"name\\":\\"memory\\",\\"target\\":{\\"averageUtilization\\":85,\\"type\\":\\"Utilization\\"}},\\"type\\":\\"Resource\\"}],\\"minReplicas\\":1,\\"scaleTargetRef\\":{\\"apiVersion\\":\\"apps/v1\\",\\"kind\\":\\"Deployment\\",\\"name\\":\\"crisiscleanup-api-wsgi\\"}}},{\\"apiVersion\\":\\"apps/v1\\",\\"kind\\":\\"Deployment\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/name\\":\\"asgi\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-asgi\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"minReadySeconds\\":0,\\"progressDeadlineSeconds\\":600,\\"selector\\":{\\"matchLabels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-asgi-c818ff7e\\"}},\\"strategy\\":{\\"rollingUpdate\\":{\\"maxSurge\\":\\"25%\\",\\"maxUnavailable\\":\\"25%\\"},\\"type\\":\\"RollingUpdate\\"},\\"template\\":{\\"metadata\\":{\\"labels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-asgi-c818ff7e\\"}},\\"spec\\":{\\"automountServiceAccountToken\\":false,\\"containers\\":[{\\"command\\":[\\"/serve.sh\\",\\"asgi\\",\\"--workers=2\\"],\\"env\\":[{\\"name\\":\\"POSTGRES_USER\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_USER\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_PASSWORD\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_PASSWORD\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_HOST\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_HOST\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}}],\\"envFrom\\":[{\\"configMapRef\\":{\\"name\\":\\"crisiscleanup-config-api-config\\"}}],\\"image\\":\\"crisiscleanup-api:latest\\",\\"imagePullPolicy\\":\\"IfNotPresent\\",\\"livenessProbe\\":{\\"failureThreshold\\":6,\\"httpGet\\":{\\"path\\":\\"/ws/health\\",\\"port\\":5000,\\"scheme\\":\\"HTTP\\"},\\"initialDelaySeconds\\":20,\\"periodSeconds\\":10,\\"timeoutSeconds\\":6},\\"name\\":\\"hypercorn\\",\\"ports\\":[{\\"containerPort\\":5000}],\\"readinessProbe\\":{\\"failureThreshold\\":6,\\"httpGet\\":{\\"path\\":\\"/ws/health\\",\\"port\\":5000,\\"scheme\\":\\"HTTP\\"},\\"initialDelaySeconds\\":20,\\"periodSeconds\\":10,\\"timeoutSeconds\\":6},\\"resources\\":{\\"limits\\":{\\"memory\\":\\"1024Mi\\"},\\"requests\\":{\\"cpu\\":\\"100m\\",\\"memory\\":\\"1024Mi\\"}},\\"securityContext\\":{\\"allowPrivilegeEscalation\\":false,\\"privileged\\":false,\\"readOnlyRootFilesystem\\":false,\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"startupProbe\\":{\\"failureThreshold\\":30,\\"httpGet\\":{\\"path\\":\\"/ws/health\\",\\"port\\":5000,\\"scheme\\":\\"HTTP\\"},\\"periodSeconds\\":15},\\"volumeMounts\\":[{\\"mountPath\\":\\"/mnt/secrets-store\\",\\"name\\":\\"secrets-store-inline\\",\\"readOnly\\":true}]},{\\"command\\":[\\"./serve.sh\\",\\"channelsworker\\",\\"rag-document\\"],\\"env\\":[{\\"name\\":\\"POSTGRES_USER\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_USER\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_PASSWORD\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_PASSWORD\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_HOST\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_HOST\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}}],\\"envFrom\\":[{\\"configMapRef\\":{\\"name\\":\\"crisiscleanup-config-api-config\\"}}],\\"image\\":\\"crisiscleanup-api:latest\\",\\"imagePullPolicy\\":\\"IfNotPresent\\",\\"name\\":\\"rag-channels\\",\\"resources\\":{\\"limits\\":{\\"cpu\\":\\"3\\",\\"memory\\":\\"4096Mi\\"},\\"requests\\":{\\"cpu\\":\\"200m\\",\\"memory\\":\\"1024Mi\\"}},\\"securityContext\\":{\\"allowPrivilegeEscalation\\":false,\\"privileged\\":false,\\"readOnlyRootFilesystem\\":false,\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"volumeMounts\\":[{\\"mountPath\\":\\"/ccu/nltk_data\\",\\"name\\":\\"nltk-data\\",\\"readOnly\\":false},{\\"mountPath\\":\\"/ccu/.cache/huggingface\\",\\"name\\":\\"hf-data\\",\\"readOnly\\":false},{\\"mountPath\\":\\"/mnt/secrets-store\\",\\"name\\":\\"secrets-store-inline\\",\\"readOnly\\":true}]}],\\"dnsPolicy\\":\\"ClusterFirst\\",\\"hostNetwork\\":false,\\"restartPolicy\\":\\"Always\\",\\"securityContext\\":{\\"fsGroupChangePolicy\\":\\"Always\\",\\"runAsNonRoot\\":true},\\"serviceAccountName\\":\\"crisiscleanup-api\\",\\"setHostnameAsFQDN\\":false,\\"terminationGracePeriodSeconds\\":30,\\"volumes\\":[{\\"csi\\":{\\"driver\\":\\"secrets-store.csi.k8s.io\\",\\"readOnly\\":true,\\"volumeAttributes\\":{\\"secretProviderClass\\":\\"crisiscleanup-api\\"}},\\"name\\":\\"secrets-store-inline\\"},{\\"hostPath\\":{\\"path\\":\\"/ccu/nltk_data\\",\\"type\\":\\"DirectoryOrCreate\\"},\\"name\\":\\"nltk-data\\"},{\\"hostPath\\":{\\"path\\":\\"/ccu/.cache/huggingface\\",\\"type\\":\\"DirectoryOrCreate\\"},\\"name\\":\\"hf-data\\"}]}}}},{\\"apiVersion\\":\\"v1\\",\\"kind\\":\\"Service\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-asgi-service\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"externalIPs\\":[],\\"ports\\":[{\\"port\\":5000,\\"targetPort\\":5000}],\\"selector\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-asgi-c818ff7e\\"},\\"type\\":\\"ClusterIP\\"}},{\\"apiVersion\\":\\"autoscaling/v2\\",\\"kind\\":\\"HorizontalPodAutoscaler\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-asgi-hpa\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"behavior\\":{\\"scaleDown\\":{\\"policies\\":[{\\"periodSeconds\\":300,\\"type\\":\\"Pods\\",\\"value\\":1}],\\"selectPolicy\\":\\"Max\\",\\"stabilizationWindowSeconds\\":300},\\"scaleUp\\":{\\"policies\\":[{\\"periodSeconds\\":60,\\"type\\":\\"Pods\\",\\"value\\":4},{\\"periodSeconds\\":60,\\"type\\":\\"Percent\\",\\"value\\":200}],\\"selectPolicy\\":\\"Max\\",\\"stabilizationWindowSeconds\\":0}},\\"maxReplicas\\":2,\\"metrics\\":[{\\"resource\\":{\\"name\\":\\"cpu\\",\\"target\\":{\\"averageUtilization\\":70,\\"type\\":\\"Utilization\\"}},\\"type\\":\\"Resource\\"},{\\"resource\\":{\\"name\\":\\"memory\\",\\"target\\":{\\"averageUtilization\\":85,\\"type\\":\\"Utilization\\"}},\\"type\\":\\"Resource\\"}],\\"minReplicas\\":1,\\"scaleTargetRef\\":{\\"apiVersion\\":\\"apps/v1\\",\\"kind\\":\\"Deployment\\",\\"name\\":\\"crisiscleanup-api-asgi\\"}}},{\\"apiVersion\\":\\"apps/v1\\",\\"kind\\":\\"Deployment\\",\\"metadata\\":{\\"labels\\":{\\"aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b\\":\\"\\",\\"app.kubernetes.io/component\\":\\"api\\",\\"app.kubernetes.io/name\\":\\"adminwebsocket\\",\\"app.kubernetes.io/part-of\\":\\"crisiscleanup\\"},\\"name\\":\\"crisiscleanup-api-admin-websocket\\",\\"namespace\\":\\"local\\"},\\"spec\\":{\\"minReadySeconds\\":0,\\"progressDeadlineSeconds\\":600,\\"replicas\\":1,\\"selector\\":{\\"matchLabels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-admin-websocket-c879d9e4\\"}},\\"strategy\\":{\\"rollingUpdate\\":{\\"maxSurge\\":\\"25%\\",\\"maxUnavailable\\":\\"25%\\"},\\"type\\":\\"RollingUpdate\\"},\\"template\\":{\\"metadata\\":{\\"labels\\":{\\"cdk8s.io/metadata.addr\\":\\"crisiscleanup-api-admin-websocket-c879d9e4\\"}},\\"spec\\":{\\"automountServiceAccountToken\\":false,\\"containers\\":[{\\"command\\":[\\"/serve.sh\\",\\"adminwebsocket\\"],\\"env\\":[{\\"name\\":\\"POSTGRES_USER\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_USER\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_PASSWORD\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_PASSWORD\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}},{\\"name\\":\\"POSTGRES_HOST\\",\\"valueFrom\\":{\\"secretKeyRef\\":{\\"key\\":\\"POSTGRES_HOST\\",\\"name\\":\\"crisiscleanup-db-secrets\\"}}}],\\"envFrom\\":[{\\"configMapRef\\":{\\"name\\":\\"crisiscleanup-config-api-config\\"}}],\\"image\\":\\"crisiscleanup-api:latest\\",\\"imagePullPolicy\\":\\"IfNotPresent\\",\\"name\\":\\"adminwebsocket\\",\\"resources\\":{\\"limits\\":{\\"memory\\":\\"250Mi\\"},\\"requests\\":{\\"cpu\\":\\"3m\\",\\"memory\\":\\"250Mi\\"}},\\"securityContext\\":{\\"allowPrivilegeEscalation\\":false,\\"privileged\\":false,\\"readOnlyRootFilesystem\\":false,\\"runAsGroup\\":1000,\\"runAsNonRoot\\":true,\\"runAsUser\\":1000},\\"volumeMounts\\":[{\\"mountPath\\":\\"/mnt/secrets-store\\",\\"name\\":\\"secrets-store-inline\\",\\"readOnly\\":true}]}],\\"dnsPolicy\\":\\"ClusterFirst\\",\\"hostNetwork\\":false,\\"restartPolicy\\":\\"Always\\",\\"securityContext\\":{\\"fsGroupChangePolicy\\":\\"Always\\",\\"runAsNonRoot\\":true},\\"serviceAccountName\\":\\"crisiscleanup-api\\",\\"setHostnameAsFQDN\\":false,\\"terminationGracePeriodSeconds\\":30,\\"volumes\\":[{\\"csi\\":{\\"driver\\":\\"secrets-store.csi.k8s.io\\",\\"readOnly\\":true,\\"volumeAttributes\\":{\\"secretProviderClass\\":\\"crisiscleanup-api\\"}},\\"name\\":\\"secrets-store-inline\\"}]}}}}]", "PruneLabel": "aws.cdk.eks/prune-c82f78fa5f1261be46ff61475603c88ab5fa680f3b", "RoleArn": { "Fn::GetAtt": [