diff --git a/TrafficCapture/dockerSolution/build.gradle b/TrafficCapture/dockerSolution/build.gradle index 672ecc89c..d0885e887 100644 --- a/TrafficCapture/dockerSolution/build.gradle +++ b/TrafficCapture/dockerSolution/build.gradle @@ -68,7 +68,7 @@ dockerCompose { "${project.getProperty('otel-collector')}" : "otel-prometheus-jaeger-opensearch.yml"), "${extensionsDir}" + (project.hasProperty("multiProxy") ? "proxy-multi.yml" : "proxy-single.yml") - ] + ] } task buildDockerImages { diff --git a/deployment/cdk/opensearch-service-migration/lib/common-utilities.ts b/deployment/cdk/opensearch-service-migration/lib/common-utilities.ts index a28fa2b61..62512fcd8 100644 --- a/deployment/cdk/opensearch-service-migration/lib/common-utilities.ts +++ b/deployment/cdk/opensearch-service-migration/lib/common-utilities.ts @@ -1,6 +1,7 @@ import {Effect, PolicyStatement, Role, ServicePrincipal} from "aws-cdk-lib/aws-iam"; import {Construct} from "constructs"; import {StringParameter} from "aws-cdk-lib/aws-ssm"; +import {CpuArchitecture} from "aws-cdk-lib/aws-ecs"; export function createOpenSearchIAMAccessPolicy(region: string, accountId: string): PolicyStatement { return new PolicyStatement({ @@ -120,4 +121,22 @@ export function createDefaultECSTaskRole(scope: Construct, serviceName: string): ] })) return serviceTaskRole +} + +export function validateFargateCpuArch(cpuArch?: string): CpuArchitecture { + const desiredArch = cpuArch ? cpuArch : process.arch + const desiredArchUpper = desiredArch.toUpperCase() + + if (desiredArchUpper === "X86_64" || desiredArchUpper === "X64") { + return CpuArchitecture.X86_64 + } else if (desiredArchUpper === "ARM64") { + return CpuArchitecture.ARM64 + } else { + if (cpuArch) { + throw new Error(`Unknown Fargate cpu architecture provided: ${desiredArch}`) + } + else { + throw new Error(`Unsupported process cpu architecture detected: ${desiredArch}, CDK requires X64 or ARM64 for Docker image compatability`) + } + } } \ No newline at end of file diff --git a/deployment/cdk/opensearch-service-migration/lib/fetch-migration-stack.ts b/deployment/cdk/opensearch-service-migration/lib/fetch-migration-stack.ts index dd712543d..dff7e65fb 100644 --- a/deployment/cdk/opensearch-service-migration/lib/fetch-migration-stack.ts +++ b/deployment/cdk/opensearch-service-migration/lib/fetch-migration-stack.ts @@ -3,9 +3,9 @@ import {IVpc} from "aws-cdk-lib/aws-ec2"; import {Construct} from "constructs"; import { Cluster, - ContainerImage, + ContainerImage, CpuArchitecture, FargateTaskDefinition, - LogDrivers, + LogDrivers, OperatingSystemFamily, Secret as ECSSecret } from "aws-cdk-lib/aws-ecs"; import {Secret as SMSecret} from "aws-cdk-lib/aws-secretsmanager"; @@ -22,7 +22,8 @@ import { export interface FetchMigrationProps extends StackPropsExt { readonly vpc: IVpc, readonly dpPipelineTemplatePath: string, - readonly sourceEndpoint: string + readonly sourceEndpoint: string, + readonly fargateCpuArch: CpuArchitecture } export class FetchMigrationStack extends Stack { @@ -49,6 +50,10 @@ export class FetchMigrationStack extends Stack { ecsTaskRole.addToPolicy(openSearchServerlessPolicy) // ECS Task Definition const fetchMigrationFargateTask = new FargateTaskDefinition(this, "fetchMigrationFargateTask", { + runtimePlatform: { + operatingSystemFamily: OperatingSystemFamily.LINUX, + cpuArchitecture: props.fargateCpuArch + }, family: `migration-${props.stage}-${serviceName}`, memoryLimitMiB: 8192, cpu: 2048, diff --git a/deployment/cdk/opensearch-service-migration/lib/service-stacks/capture-proxy-es-stack.ts b/deployment/cdk/opensearch-service-migration/lib/service-stacks/capture-proxy-es-stack.ts index 38fcee01e..37204c403 100644 --- a/deployment/cdk/opensearch-service-migration/lib/service-stacks/capture-proxy-es-stack.ts +++ b/deployment/cdk/opensearch-service-migration/lib/service-stacks/capture-proxy-es-stack.ts @@ -1,6 +1,6 @@ import {StackPropsExt} from "../stack-composer"; import {IVpc, SecurityGroup} from "aws-cdk-lib/aws-ec2"; -import {PortMapping, Protocol} from "aws-cdk-lib/aws-ecs"; +import {CpuArchitecture, PortMapping, Protocol} from "aws-cdk-lib/aws-ecs"; import {Construct} from "constructs"; import {join} from "path"; import {MigrationServiceCore} from "./migration-service-core"; @@ -14,6 +14,7 @@ export interface CaptureProxyESProps extends StackPropsExt { readonly vpc: IVpc, readonly streamingSourceType: StreamingSourceType, readonly analyticsServiceEnabled: boolean, + readonly fargateCpuArch: CpuArchitecture, readonly extraArgs?: string, } @@ -75,6 +76,7 @@ export class CaptureProxyESStack extends MigrationServiceCore { serviceConnectServices: [serviceConnectService, esServiceConnectService], serviceDiscoveryEnabled: true, serviceDiscoveryPort: 19200, + cpuArchitecture: props.fargateCpuArch, taskCpuUnits: 1024, taskMemoryLimitMiB: 4096, ...props diff --git a/deployment/cdk/opensearch-service-migration/lib/service-stacks/capture-proxy-stack.ts b/deployment/cdk/opensearch-service-migration/lib/service-stacks/capture-proxy-stack.ts index 91f40e44b..66842ca84 100644 --- a/deployment/cdk/opensearch-service-migration/lib/service-stacks/capture-proxy-stack.ts +++ b/deployment/cdk/opensearch-service-migration/lib/service-stacks/capture-proxy-stack.ts @@ -1,6 +1,6 @@ import {StackPropsExt} from "../stack-composer"; import {IVpc, SecurityGroup} from "aws-cdk-lib/aws-ec2"; -import {PortMapping, Protocol} from "aws-cdk-lib/aws-ecs"; +import {CpuArchitecture, PortMapping, Protocol} from "aws-cdk-lib/aws-ecs"; import {Construct} from "constructs"; import {join} from "path"; import {MigrationServiceCore} from "./migration-service-core"; @@ -13,6 +13,7 @@ import {createMSKProducerIAMPolicies} from "../common-utilities"; export interface CaptureProxyProps extends StackPropsExt { readonly vpc: IVpc, readonly streamingSourceType: StreamingSourceType, + readonly fargateCpuArch: CpuArchitecture, readonly customSourceClusterEndpoint?: string, readonly analyticsServiceEnabled?: boolean, readonly extraArgs?: string, @@ -60,6 +61,7 @@ export class CaptureProxyStack extends MigrationServiceCore { taskRolePolicies: servicePolicies, portMappings: [servicePort], serviceConnectServices: [serviceConnectService], + cpuArchitecture: props.fargateCpuArch, taskCpuUnits: 512, taskMemoryLimitMiB: 2048, ...props diff --git a/deployment/cdk/opensearch-service-migration/lib/service-stacks/elasticsearch-stack.ts b/deployment/cdk/opensearch-service-migration/lib/service-stacks/elasticsearch-stack.ts index ca1bbca88..a14513c64 100644 --- a/deployment/cdk/opensearch-service-migration/lib/service-stacks/elasticsearch-stack.ts +++ b/deployment/cdk/opensearch-service-migration/lib/service-stacks/elasticsearch-stack.ts @@ -1,6 +1,6 @@ import {StackPropsExt} from "../stack-composer"; import {IVpc, SecurityGroup} from "aws-cdk-lib/aws-ec2"; -import {PortMapping, Protocol} from "aws-cdk-lib/aws-ecs"; +import {CpuArchitecture, PortMapping, Protocol} from "aws-cdk-lib/aws-ecs"; import {Construct} from "constructs"; import {join} from "path"; import {MigrationServiceCore} from "./migration-service-core"; @@ -10,6 +10,7 @@ import {StringParameter} from "aws-cdk-lib/aws-ssm"; export interface ElasticsearchProps extends StackPropsExt { readonly vpc: IVpc, + readonly fargateCpuArch: CpuArchitecture } /** @@ -45,6 +46,7 @@ export class ElasticsearchStack extends MigrationServiceCore { serviceConnectServices: [serviceConnectService], serviceDiscoveryEnabled: true, serviceDiscoveryPort: 9200, + cpuArchitecture: props.fargateCpuArch, taskCpuUnits: 512, taskMemoryLimitMiB: 2048, ...props diff --git a/deployment/cdk/opensearch-service-migration/lib/service-stacks/kafka-broker-stack.ts b/deployment/cdk/opensearch-service-migration/lib/service-stacks/kafka-broker-stack.ts index 7276d41ac..d8bf72b95 100644 --- a/deployment/cdk/opensearch-service-migration/lib/service-stacks/kafka-broker-stack.ts +++ b/deployment/cdk/opensearch-service-migration/lib/service-stacks/kafka-broker-stack.ts @@ -1,6 +1,7 @@ import {StackPropsExt} from "../stack-composer"; import {IVpc, SecurityGroup} from "aws-cdk-lib/aws-ec2"; import { + CpuArchitecture, PortMapping, Protocol } from "aws-cdk-lib/aws-ecs"; import {Construct} from "constructs"; @@ -9,7 +10,8 @@ import {StringParameter} from "aws-cdk-lib/aws-ssm"; import {ServiceConnectService} from "aws-cdk-lib/aws-ecs/lib/base/base-service"; export interface KafkaBrokerProps extends StackPropsExt { - readonly vpc: IVpc + readonly vpc: IVpc, + readonly fargateCpuArch: CpuArchitecture } /** @@ -62,6 +64,7 @@ export class KafkaBrokerStack extends MigrationServiceCore { }, portMappings: [servicePort], serviceConnectServices: [serviceConnectService], + cpuArchitecture: props.fargateCpuArch, taskCpuUnits: 256, taskMemoryLimitMiB: 2048, ...props diff --git a/deployment/cdk/opensearch-service-migration/lib/service-stacks/kafka-zookeeper-stack.ts b/deployment/cdk/opensearch-service-migration/lib/service-stacks/kafka-zookeeper-stack.ts index e204b226e..405af42eb 100644 --- a/deployment/cdk/opensearch-service-migration/lib/service-stacks/kafka-zookeeper-stack.ts +++ b/deployment/cdk/opensearch-service-migration/lib/service-stacks/kafka-zookeeper-stack.ts @@ -1,6 +1,7 @@ import {StackPropsExt} from "../stack-composer"; import {IVpc, SecurityGroup} from "aws-cdk-lib/aws-ec2"; import { + CpuArchitecture, PortMapping, Protocol, } from "aws-cdk-lib/aws-ecs"; import {Construct} from "constructs"; @@ -9,7 +10,8 @@ import {StringParameter} from "aws-cdk-lib/aws-ssm"; import {ServiceConnectService} from "aws-cdk-lib/aws-ecs/lib/base/base-service"; export interface KafkaZookeeperProps extends StackPropsExt { - readonly vpc: IVpc + readonly vpc: IVpc, + readonly fargateCpuArch: CpuArchitecture } /** @@ -46,6 +48,7 @@ export class KafkaZookeeperStack extends MigrationServiceCore { }, portMappings: [servicePort], serviceConnectServices: [serviceConnectService], + cpuArchitecture: props.fargateCpuArch, taskCpuUnits: 256, taskMemoryLimitMiB: 512, ...props diff --git a/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-analytics-stack.ts b/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-analytics-stack.ts index ca5cd62b0..22075a0ca 100644 --- a/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-analytics-stack.ts +++ b/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-analytics-stack.ts @@ -6,7 +6,7 @@ import { SecurityGroup, IVpc, } from "aws-cdk-lib/aws-ec2"; -import {PortMapping, Protocol, ServiceConnectService} from "aws-cdk-lib/aws-ecs"; +import {CpuArchitecture, PortMapping, Protocol, ServiceConnectService} from "aws-cdk-lib/aws-ecs"; import {Construct} from "constructs"; import {join} from "path"; import {MigrationServiceCore} from "./migration-service-core"; @@ -15,6 +15,7 @@ import {createAwsDistroForOtelPushInstrumentationPolicy} from "../common-utiliti export interface MigrationAnalyticsProps extends StackPropsExt { readonly vpc: IVpc, + readonly fargateCpuArch: CpuArchitecture, readonly bastionHostEnabled?: boolean } @@ -82,6 +83,7 @@ export class MigrationAnalyticsStack extends MigrationServiceCore { dockerDirectoryPath: join(__dirname, "../../../../../", "TrafficCapture/dockerSolution/src/main/docker/otelCollector"), dockerImageCommand: ["--config=/etc/otel-config-aws.yaml"], securityGroups: securityGroups, + cpuArchitecture: props.fargateCpuArch, taskCpuUnits: 1024, taskMemoryLimitMiB: 4096, portMappings: [otelCollectorPort, otelHealthCheckPort], diff --git a/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-console-stack.ts b/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-console-stack.ts index 16013cb40..e1d931e0a 100644 --- a/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-console-stack.ts +++ b/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-console-stack.ts @@ -1,6 +1,6 @@ import {StackPropsExt} from "../stack-composer"; import {IVpc, SecurityGroup} from "aws-cdk-lib/aws-ec2"; -import {MountPoint, Volume} from "aws-cdk-lib/aws-ecs"; +import {CpuArchitecture, MountPoint, Volume} from "aws-cdk-lib/aws-ecs"; import {Construct} from "constructs"; import {join} from "path"; import {MigrationServiceCore} from "./migration-service-core"; @@ -17,6 +17,7 @@ export interface MigrationConsoleProps extends StackPropsExt { readonly vpc: IVpc, readonly streamingSourceType: StreamingSourceType, readonly fetchMigrationEnabled: boolean, + readonly fargateCpuArch: CpuArchitecture, readonly migrationAnalyticsEnabled: boolean } @@ -154,6 +155,7 @@ export class MigrationConsoleStack extends MigrationServiceCore { mountPoints: [replayerOutputMountPoint], environment: environment, taskRolePolicies: servicePolicies, + cpuArchitecture: props.fargateCpuArch, taskCpuUnits: 512, taskMemoryLimitMiB: 1024, ...props diff --git a/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-service-core.ts b/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-service-core.ts index c419609dc..d030179e2 100644 --- a/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-service-core.ts +++ b/deployment/cdk/opensearch-service-migration/lib/service-stacks/migration-service-core.ts @@ -3,11 +3,11 @@ import {ISecurityGroup, IVpc, SubnetType} from "aws-cdk-lib/aws-ec2"; import { CfnService as FargateCfnService, Cluster, - ContainerImage, + ContainerImage, CpuArchitecture, FargateService, FargateTaskDefinition, LogDrivers, - MountPoint, + MountPoint, OperatingSystemFamily, PortMapping, Ulimit, Volume } from "aws-cdk-lib/aws-ecs"; @@ -25,6 +25,7 @@ export interface MigrationServiceCoreProps extends StackPropsExt { readonly serviceName: string, readonly vpc: IVpc, readonly securityGroups: ISecurityGroup[], + readonly cpuArchitecture: CpuArchitecture, readonly dockerFilePath?: string, readonly dockerDirectoryPath?: string, readonly dockerImageRegistryName?: string, @@ -87,6 +88,10 @@ export class MigrationServiceCore extends Stack { const serviceTaskDef = new FargateTaskDefinition(this, "ServiceTaskDef", { ephemeralStorageGiB: 75, + runtimePlatform: { + operatingSystemFamily: OperatingSystemFamily.LINUX, + cpuArchitecture: props.cpuArchitecture + }, family: `migration-${props.stage}-${props.serviceName}`, memoryLimitMiB: props.taskMemoryLimitMiB ? props.taskMemoryLimitMiB : 1024, cpu: props.taskCpuUnits ? props.taskCpuUnits : 256, diff --git a/deployment/cdk/opensearch-service-migration/lib/service-stacks/opensearch-container-stack.ts b/deployment/cdk/opensearch-service-migration/lib/service-stacks/opensearch-container-stack.ts index 4bfc13b2b..420f94bbe 100644 --- a/deployment/cdk/opensearch-service-migration/lib/service-stacks/opensearch-container-stack.ts +++ b/deployment/cdk/opensearch-service-migration/lib/service-stacks/opensearch-container-stack.ts @@ -1,13 +1,14 @@ import {StackPropsExt} from "../stack-composer"; import {IVpc, SecurityGroup} from "aws-cdk-lib/aws-ec2"; -import {PortMapping, Protocol, Ulimit, UlimitName} from "aws-cdk-lib/aws-ecs"; +import {CpuArchitecture, PortMapping, Protocol, Ulimit, UlimitName} from "aws-cdk-lib/aws-ecs"; import {Construct} from "constructs"; import {MigrationServiceCore} from "./migration-service-core"; import {StringParameter} from "aws-cdk-lib/aws-ssm"; import {ServiceConnectService} from "aws-cdk-lib/aws-ecs/lib/base/base-service"; export interface OpenSearchContainerProps extends StackPropsExt { - readonly vpc: IVpc + readonly vpc: IVpc, + readonly fargateCpuArch: CpuArchitecture } /** @@ -61,6 +62,7 @@ export class OpenSearchContainerStack extends MigrationServiceCore { serviceConnectServices: [serviceConnectService], taskCpuUnits: 1024, taskMemoryLimitMiB: 4096, + cpuArchitecture: props.fargateCpuArch, ulimits: ulimits, ...props }); diff --git a/deployment/cdk/opensearch-service-migration/lib/service-stacks/traffic-replayer-stack.ts b/deployment/cdk/opensearch-service-migration/lib/service-stacks/traffic-replayer-stack.ts index a290b86c7..b6a183367 100644 --- a/deployment/cdk/opensearch-service-migration/lib/service-stacks/traffic-replayer-stack.ts +++ b/deployment/cdk/opensearch-service-migration/lib/service-stacks/traffic-replayer-stack.ts @@ -1,6 +1,6 @@ import {StackPropsExt} from "../stack-composer"; import {IVpc, SecurityGroup} from "aws-cdk-lib/aws-ec2"; -import {MountPoint, Volume} from "aws-cdk-lib/aws-ecs"; +import {CpuArchitecture, MountPoint, Volume} from "aws-cdk-lib/aws-ecs"; import {Construct} from "constructs"; import {join} from "path"; import {MigrationServiceCore} from "./migration-service-core"; @@ -18,6 +18,7 @@ export interface TrafficReplayerProps extends StackPropsExt { readonly vpc: IVpc, readonly enableClusterFGACAuth: boolean, readonly streamingSourceType: StreamingSourceType, + readonly fargateCpuArch: CpuArchitecture, readonly addOnMigrationId?: string, readonly customKafkaGroupId?: string, readonly userAgentSuffix?: string, @@ -102,6 +103,7 @@ export class TrafficReplayerStack extends MigrationServiceCore { environment: { "TUPLE_DIR_PATH": `/shared-replayer-output/traffic-replayer-${deployId}` }, + cpuArchitecture: props.fargateCpuArch, taskCpuUnits: 1024, taskMemoryLimitMiB: 4096, ...props diff --git a/deployment/cdk/opensearch-service-migration/lib/stack-composer.ts b/deployment/cdk/opensearch-service-migration/lib/stack-composer.ts index 87d432714..9147caab4 100644 --- a/deployment/cdk/opensearch-service-migration/lib/stack-composer.ts +++ b/deployment/cdk/opensearch-service-migration/lib/stack-composer.ts @@ -18,6 +18,7 @@ import {KafkaZookeeperStack} from "./service-stacks/kafka-zookeeper-stack"; import {Application} from "@aws-cdk/aws-servicecatalogappregistry-alpha"; import {OpenSearchContainerStack} from "./service-stacks/opensearch-container-stack"; import {determineStreamingSourceType, StreamingSourceType} from "./streaming-source-type"; +import {validateFargateCpuArch} from "./common-utilities"; export interface StackPropsExt extends StackProps { readonly stage: string, @@ -159,6 +160,7 @@ export class StackComposer { const mskBrokerNodeCount = this.getContextForType('mskBrokerNodeCount', 'number', defaultValues, contextJSON) const mskSubnetIds = this.getContextForType('mskSubnetIds', 'object', defaultValues, contextJSON) const addOnMigrationDeployId = this.getContextForType('addOnMigrationDeployId', 'string', defaultValues, contextJSON) + const defaultFargateCpuArch = this.getContextForType('defaultFargateCpuArch', 'string', defaultValues, contextJSON) const captureProxyESServiceEnabled = this.getContextForType('captureProxyESServiceEnabled', 'boolean', defaultValues, contextJSON) const captureProxyESExtraArgs = this.getContextForType('captureProxyESExtraArgs', 'string', defaultValues, contextJSON) const migrationConsoleServiceEnabled = this.getContextForType('migrationConsoleServiceEnabled', 'boolean', defaultValues, contextJSON) @@ -211,6 +213,8 @@ export class StackComposer { } else if (targetClusterEndpoint || osContainerServiceEnabled) { targetEndpoint = targetClusterEndpoint ? targetClusterEndpoint : "https://opensearch:9200" } + + const fargateCpuArch = validateFargateCpuArch(defaultFargateCpuArch) const streamingSourceType = determineStreamingSourceType(kafkaBrokerServiceEnabled) const engineVersion = this.getContextForType('engineVersion', 'string', defaultValues, contextJSON) @@ -384,6 +388,7 @@ export class StackComposer { migrationAnalyticsStack = new MigrationAnalyticsStack(scope, "migration-analytics", { stackName: `OSMigrations-${stage}-${region}-MigrationAnalytics`, description: "This stack contains the OpenTelemetry Collector and Bastion Host", + fargateCpuArch: fargateCpuArch, bastionHostEnabled: migrationAnalyticsBastionHostEnabled, vpc:networkStack.vpc, stage: stage, @@ -403,6 +408,7 @@ export class StackComposer { description: "This stack contains resources for the OpenSearch Container ECS service", stage: stage, defaultDeployId: defaultDeployId, + fargateCpuArch: fargateCpuArch, ...props, }) this.addDependentStacks(osContainerStack, [migrationStack]) @@ -417,6 +423,7 @@ export class StackComposer { description: "This stack contains resources for the Kafka Zookeeper ECS service", stage: stage, defaultDeployId: defaultDeployId, + fargateCpuArch: fargateCpuArch, ...props, }) this.addDependentStacks(kafkaZookeeperStack, [migrationStack]) @@ -431,6 +438,7 @@ export class StackComposer { description: "This stack contains resources for the Kafka Broker ECS service", stage: stage, defaultDeployId: defaultDeployId, + fargateCpuArch: fargateCpuArch, ...props, }) this.addDependentStacks(kafkaBrokerStack, [migrationStack, kafkaZookeeperStack]) @@ -448,6 +456,7 @@ export class StackComposer { description: "This stack contains resources to assist migrating historical data to an OpenSearch Service domain", stage: stage, defaultDeployId: defaultDeployId, + fargateCpuArch: fargateCpuArch, ...props, }) this.addDependentStacks(fetchMigrationStack, [migrationStack, openSearchStack, osContainerStack]) @@ -465,6 +474,7 @@ export class StackComposer { description: "This stack contains resources for the Capture Proxy/Elasticsearch ECS service", stage: stage, defaultDeployId: defaultDeployId, + fargateCpuArch: fargateCpuArch, ...props, }) // The analytics stack dependency is necessary to ensure the otel collector is available (and can be found via service connect) @@ -487,6 +497,7 @@ export class StackComposer { description: "This stack contains resources for the Traffic Replayer ECS service", stage: stage, defaultDeployId: defaultDeployId, + fargateCpuArch: fargateCpuArch, ...props, }) // The analytics stack dependency is necessary to ensure the otel collector is available (and can be found via service connect) @@ -503,6 +514,7 @@ export class StackComposer { description: "This stack contains resources for a testing mock Elasticsearch single node cluster ECS service", stage: stage, defaultDeployId: defaultDeployId, + fargateCpuArch: fargateCpuArch, ...props, }) this.addDependentStacks(elasticsearchStack, [migrationStack]) @@ -521,6 +533,7 @@ export class StackComposer { description: "This stack contains resources for the Capture Proxy ECS service", stage: stage, defaultDeployId: defaultDeployId, + fargateCpuArch: fargateCpuArch, ...props, }) // The analytics stack dependency is necessary to ensure the otel collector is available (and can be found via service connect) @@ -540,6 +553,7 @@ export class StackComposer { description: "This stack contains resources for the Migration Console ECS service", stage: stage, defaultDeployId: defaultDeployId, + fargateCpuArch: fargateCpuArch, ...props, }) // To enable the Migration Console to make requests to other service endpoints with Service Connect, diff --git a/deployment/cdk/opensearch-service-migration/options.md b/deployment/cdk/opensearch-service-migration/options.md index 68005b7ba..68a8c847d 100644 --- a/deployment/cdk/opensearch-service-migration/options.md +++ b/deployment/cdk/opensearch-service-migration/options.md @@ -7,6 +7,7 @@ These tables list all CDK context configuration values a user can specify for th |--------------------------------------|---------|------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | migrationAssistanceEnabled | boolean | true | Flag which controls deploying common Migration Service resources such as MSK, EFS, and an ECS cluster. **Note**: This option must be enabled to use any Migration service | | addOnMigrationDeployId | string | "cit2-replay" | Specify an ID string to use for an additional replay [scenario](./README.md#how-to-run-multiple-traffic-replayer-scenarios). **Note**: This option should not be used for initial deployments | +| defaultFargateCpuArch | string | "X86_64", "ARM64" | Provide a default CPU architecture that should be used for all containers. Defaults to using `process.arch` to determine the proper architecture to use | | captureProxyESServiceEnabled | boolean | true | Enable deploying the given service, via a new CloudFormation stack | | captureProxyESExtraArgs | string | `"--suppressCaptureForHeaderMatch user-agent .*elastic-java/7.17.0.*"` | Extra arguments to provide to the Capture Proxy command. This includes available arguments specified by the [Capture Proxy](../../../TrafficCapture/trafficCaptureProxyServer/src/main/java/org/opensearch/migrations/trafficcapture/proxyserver/CaptureProxy.java). | | migrationConsoleServiceEnabled | boolean | true | Enable deploying the given service, via a new CloudFormation stack | diff --git a/deployment/cdk/opensearch-service-migration/test/common-utilities.test.ts b/deployment/cdk/opensearch-service-migration/test/common-utilities.test.ts new file mode 100644 index 000000000..cfbf2a8be --- /dev/null +++ b/deployment/cdk/opensearch-service-migration/test/common-utilities.test.ts @@ -0,0 +1,35 @@ +import {CpuArchitecture} from "aws-cdk-lib/aws-ecs"; +import {validateFargateCpuArch} from "../lib/common-utilities"; + +test('Test valid fargate cpu arch strings can be parsed', () => { + const cpuArch1 = "arm64" + const detectedArch1 = validateFargateCpuArch(cpuArch1) + expect(detectedArch1).toEqual(CpuArchitecture.ARM64) + + const cpuArch2 = "ARM64" + const detectedArch2 = validateFargateCpuArch(cpuArch2) + expect(detectedArch2).toEqual(CpuArchitecture.ARM64) + + const cpuArch3 = "x86_64" + const detectedArch3 = validateFargateCpuArch(cpuArch3) + expect(detectedArch3).toEqual(CpuArchitecture.X86_64) + + const cpuArch4 = "X86_64" + const detectedArch4 = validateFargateCpuArch(cpuArch4) + expect(detectedArch4).toEqual(CpuArchitecture.X86_64) +}) + +test('Test invalid fargate cpu arch strings throws error', () => { + const cpuArch = "arm32" + const getArchFunction = () => validateFargateCpuArch(cpuArch) + expect(getArchFunction).toThrowError() +}) + +test('Test detected fargate cpu arch is valid', () => { + const detectedArch = process.arch + const detectedArchUpper = detectedArch.toUpperCase() + + const expectedCpuArch = detectedArchUpper === "X64" ? CpuArchitecture.X86_64 : CpuArchitecture.ARM64 + const cpuArch = validateFargateCpuArch() + expect(cpuArch).toEqual(expectedCpuArch) +}) \ No newline at end of file diff --git a/deployment/cdk/opensearch-service-migration/test/default-values-test.json b/deployment/cdk/opensearch-service-migration/test/default-values-test.json index d3ddac369..53c4c8ec9 100644 --- a/deployment/cdk/opensearch-service-migration/test/default-values-test.json +++ b/deployment/cdk/opensearch-service-migration/test/default-values-test.json @@ -1,5 +1,6 @@ { "engineVersion": "OS_1.0", "domainName": "sample-cdk-unit-test-domain", - "dpPipelineTemplatePath": "./dp_pipeline_template.yaml" + "dpPipelineTemplatePath": "./dp_pipeline_template.yaml", + "defaultFargateCpuArch": "X86_64" } \ No newline at end of file diff --git a/deployment/cdk/opensearch-service-migration/test/fetch-migration-stack.test.ts b/deployment/cdk/opensearch-service-migration/test/fetch-migration-stack.test.ts index aa2bba94e..911f420ff 100644 --- a/deployment/cdk/opensearch-service-migration/test/fetch-migration-stack.test.ts +++ b/deployment/cdk/opensearch-service-migration/test/fetch-migration-stack.test.ts @@ -2,6 +2,7 @@ import {App} from 'aws-cdk-lib'; import {FetchMigrationStack} from "../lib/fetch-migration-stack"; import {Template} from "aws-cdk-lib/assertions"; import {NetworkStack} from "../lib/network-stack"; +import {CpuArchitecture} from "aws-cdk-lib/aws-ecs"; test('Test default fetch migration stack creates required resources', () => { const app = new App(); @@ -16,7 +17,8 @@ test('Test default fetch migration stack creates required resources', () => { dpPipelineTemplatePath: "./dp_pipeline_template.yaml", sourceEndpoint: "https://test-cluster", defaultDeployId: "default", - stage: "unit-test" + stage: "unit-test", + fargateCpuArch: CpuArchitecture.X86_64, })