@glicogh/healthcare-cdk 0.1.89 → 0.1.90

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/.env.example CHANGED
@@ -5,6 +5,8 @@ COMPANY_NAME=glico
5
5
  AWS_REGION=eu-west-2
6
6
  AWS_ACCOUNT_ID=825765383017
7
7
 
8
+ # Optional local overrides go in .env.local (gitignored), e.g. MIGRATION_REPO_PATH=/path/to/migration
9
+
8
10
  EC2_REDIS_INSTANCE_TYPE=t4g.nano
9
11
  EC2_REDIS_INSTANCE_STORAGE_SIZE=
10
12
  EC2_REDIS_INSTANCE_STORAGE_TYPE=gp3
package/README.md CHANGED
@@ -116,7 +116,13 @@ Only the selected stack is synthesized, so unrelated stacks (and their code asse
116
116
 
117
117
  `MicroserviceMigration` bundles the migration producer/consumer Lambdas (from the sibling `migration/lambdas` directory), the `migration-queue.fifo` queue, a `migration-verifier` Lambda, an S3 artifacts bucket, a one-shot ECS Fargate scripts runner, and the `migration-orchestrator` Step Function (`cdk/constructs/migration-state-machine.ts`). Invoking the state machine runs the migration runbook end-to-end:
118
118
 
119
- - **Scripts (runbook Steps 1–4)** run as one-shot ECS Fargate tasks from the migration repo's `Dockerfile` (entrypoint dispatches `restore` / `migrations` / `diseases` / `claim-batches` / `reset`). The restore task syncs the legacy dump from S3 first; no 15-minute Lambda cap.
119
+ The stack also provisions the `legacy-s3-backups` EventBridge bus (`cdk/constructs/legacy-s3-backups-bus.ts`) for legacy S3 backup events forwarded from the main account (`169555392631`, see `legacyS3BackupsMainAccountId`). The bus allows `events:PutEvents` from that account, has CloudWatch logging enabled at TRACE/FULL detail delivered through vended logs to `/aws/vendedlogs/events/event-bus/legacy-s3-backups`, and a rule that logs every event payload to the `legacy-s3-backups` log group. The bus ARN is exported as the `legacy-s3-backups-arn` output.
120
+
121
+ The bus also auto-starts the migration orchestrator from source archives landing in `s3://glicogh-pether-backup` (`legacyBackupBucketName`, read cross-account by the ECS scripts task role). Triggers are declared once in CDK as `MIGRATION_TRIGGERS` (`{ name, prefix, options, once }`) and passed to the `migration-runner` Lambda; the `legacy-s3-backups-migration-runner` rule forwards every event on the bus to it, and the runner applies the trigger policy itself. Today: `daily_backups/*.tar.gz` starts a delta run (`restoreMode: 'delta', affected: true, precomputeMode: 'incremental'`), and the first `weekly_backups/*.tar.gz` ever starts a fresh full run (`resetTracking: true, precomputeMode: 'full'`, `once: true`) — later weekly events are skipped until the SSM marker `/<env>/microservices/migration/triggers/weekly` is deleted. Every trigger also skips while an orchestrator execution is already RUNNING, and derives the execution name from the object key for dedupe.
122
+
123
+ Daily runs are **deltas**: the payload adds `restoreMode: 'delta', affected: true`, so `s1-restore-delta` inserts the changed rows into the persistent legacy tables (no DROP/CREATE, duplicate key updates the row) and skips `s2-migrations`; `s4b-resolve-affected` then maps the changed rows (`migration_affected_source`) to resource ids (`migration_affected`, including claim `batch_key`s via `claim_batches.sibling_claim_ids`), and each resource step runs a targeted pass with `skipMigrated: false` so the target APIs receive updates, followed by `migration-clear-affected` for that resource. Weekly runs keep the full restore → schema → `skipMigrated` top-up path. Daily precompute is incremental (`precomputeMode: 'incremental'`): `s3-disease-lookups` and `s4-claim-batches` update only the batches/disease mappings touched by `migration_affected_source`, instead of truncating and rescanning; weekly/full runs use `precomputeMode: 'full'`. The restore ECS task downloads the archive, extracts it (top-level CSV folder or flat), and runs `restore-legacy-backup`.
124
+
125
+ - **Scripts (runbook Steps 1–4)** run as one-shot ECS Fargate tasks from the migration repo's `Dockerfile` (entrypoint dispatches `restore` / `migrations` / `diseases` / `claim-batches` / `reset`). The restore task syncs the legacy dump from S3 first; no 15-minute Lambda cap. The precompute steps (`diseases`, `claim-batches`) always run when a restore runs; without one they only run when selected via `runPrecompute`. Their mode comes from `precomputeMode` (`incremental` updates only the delta's changed rows; `full` truncates and rebuilds).
120
126
  - **Migratables (Steps 5–16)** loop the producer Lambda until the response reports `endReached: true`, then wait for the SQS queue to drain (`ApproximateNumberOfMessages` + `NotVisible` = 0) before the next dependency step. Tier 0 (users, providers, insured, tpa, plans) runs as a `Parallel`.
121
127
  - **Every resource gets a retry pass** (`fromStart: true, skipMigrated: true`) after the first pass + drain, recovering records dropped by transient service failures.
122
128
  - **Verification** invokes the verifier Lambda, which writes `runs/<execution-name>/summary.json` (migrated counts, source counts, API totals) to the artifacts bucket.
@@ -127,17 +133,30 @@ Only the selected stack is synthesized, so unrelated stacks (and their code asse
127
133
  aws s3 sync data/legacy-backup s3://glicogh-healthcare-migration-uat-825765383017/backups/<runId>/
128
134
  ```
129
135
 
130
- **Start an execution** (all input fields are required; `fromStep` uses the step ids below, `""` = full run):
136
+ **Start an execution** (all input fields are optional; defaults shown):
131
137
 
132
138
  ```json
133
139
  {
134
140
  "backupS3Uri": "s3://glicogh-healthcare-migration-uat-825765383017/backups/<runId>/",
135
- "fresh": false,
136
- "skipPhotos": false,
141
+ "resetTracking": false,
142
+ "restore": true,
143
+ "runPrecompute": [],
144
+ "skipMigrated": true,
145
+ "refresh": false,
146
+ "ignoreProgress": false,
137
147
  "fromStep": ""
138
148
  }
139
149
  ```
140
150
 
151
+ - `backupS3Uri` is required only when the restore step runs (omit it with `restore: false` or a `fromStep` past restore).
152
+ - `resetTracking: true` truncates `migrated`/`disease_lookup`/`claim_batches` and clears the Redis cursors before restoring; it cannot be combined with `restore: false`.
153
+ - `restore: false` runs against the existing legacy DB (skips the reset/restore steps).
154
+ - `runPrecompute` selects which precompute steps (`"diseases"`, `"claim-batches"`) run when `restore` is false; `true` means all, `[]`/`false` means none (default `[]`). A restore always runs both precomputes. `precomputeMode` (`"full"` default, or `"incremental"`) selects their mode independently of `restoreMode`.
155
+ - `skipMigrated: true` (default) publishes only records without a `migrated` row — a completed step ends immediately and advances its cursor; `skipMigrated: false` publishes from the cursor onward (existing records are PUT-updated).
156
+ - `refresh: true` (requires `skipMigrated: false`) republishes every record from the start, so migrated records are PUT-updated; combine with `fromStep` to scope it to one step.
157
+ - `ignoreProgress: true` clears the recorded progress marker and re-evaluates the start point (`resetTracking`/`restore`).
158
+ - `fromStep` jumps to a step and records the step before it as the progress baseline.
159
+
141
160
  ```
142
161
  aws stepfunctions start-execution \
143
162
  --state-machine-arn <state-machine-arn> \
@@ -147,11 +166,11 @@ aws stepfunctions start-execution \
147
166
 
148
167
  Step ids for `fromStep`: `fresh-reset`, `restore`, `migrations`, `diseases`, `claim-batches`, `product-sources`, `product-categories`, `products`, `categories`, `coverage-groups`, `tier0`, `product-pricing`, `policies`, `benefits`, `plans-rewire`, `beneficiaries-principals`, `beneficiaries-dependants`, `beneficiary-photos`, `claims`.
149
168
 
150
- **Pause/resume**: every step is idempotent and cursor-backed — stop the execution and re-invoke later (optionally with `fromStep`). Completed resources no-op on the first producer invocation (`endReached` immediately). Guards fail the execution instead of looping forever: 2,000 producer invocations per pass, 600 drain checks (5-minute interval). Execution timeout 7 days.
169
+ **Pause/resume**: the state machine records the last completed step in the SSM parameter `/<env>/microservices/migration/orchestrator/progress` (imported by name, not managed by CloudFormation; holds the last completed step id, or `none` when cleared). Stop the execution and re-invoke with the same input — it resumes at the step after the recorded one (skipped precompute steps are recorded too, so a resume continues past them). `ignoreProgress: true` clears the marker and re-evaluates the start point; `fromStep` jumps explicitly and writes the preceding step as the baseline. Every step is idempotent and cursor-backed; with the default `skipMigrated: true` a fully-migrated step returns immediately (`endReached`, cursor advanced). Guards fail the execution instead of looping forever: 2,000 producer invocations per pass, 4,000 drain checks (30-second interval). Execution timeout 7 days.
151
170
 
152
171
  **Monitoring**: Step Functions execution history; state-machine logs at `/aws/vendedlogs/states/migration-orchestrator`; ECS task logs under `/aws/ecs/migration-scripts`; the verifier summary in S3.
153
172
 
154
- **Notes**: the consumer's reserved concurrency is set to `max(50, MIGRATION_QUEUE_SHARDS)` so claims FIFO shards run in parallel. `fresh: true` truncates `migrated`/`disease_lookup`/`claim_batches` and clears the `glico_healthcare_migration:*` Redis cursors before restoring; the restore task re-imports all tables per run (container-local tracking). Secure envs (`DB_PASSWORD`, `MIGRATION_API_KEY`) are injected into the ECS task from SSM.
173
+ **Notes**: the consumer's reserved concurrency is set to `max(50, MIGRATION_QUEUE_SHARDS)` so claims FIFO shards run in parallel. `resetTracking: true` truncates `migrated`/`disease_lookup`/`claim_batches` and clears the `glico_healthcare_migration:*` Redis cursors before restoring; the restore task re-imports all tables per run (container-local tracking). Secure envs (`DB_PASSWORD`, `MIGRATION_API_KEY`) are injected into the ECS task from SSM.
155
174
 
156
175
  ### Pipeline-based stack
157
176
 
@@ -0,0 +1,23 @@
1
+ import * as events from 'aws-cdk-lib/aws-events';
2
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
3
+ import * as logs from 'aws-cdk-lib/aws-logs';
4
+ import { Construct } from 'constructs';
5
+ export interface LegacyS3BackupsBusProps {
6
+ readonly busName: string;
7
+ readonly allowedAccountIds: string[];
8
+ }
9
+ export interface MigrationTrigger {
10
+ readonly name: string;
11
+ readonly prefix: string;
12
+ readonly options: Record<string, unknown>;
13
+ readonly once?: boolean;
14
+ }
15
+ export declare class LegacyS3BackupsBus extends Construct {
16
+ readonly bus: events.EventBus;
17
+ readonly ruleLogGroup: logs.LogGroup;
18
+ readonly vendedLogGroup: logs.LogGroup;
19
+ private readonly busName;
20
+ constructor(scope: Construct, id: string, props: LegacyS3BackupsBusProps);
21
+ addMigrationRunner(target: lambda.IFunction): void;
22
+ private configureVendedLogDelivery;
23
+ }
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LegacyS3BackupsBus = void 0;
4
+ const cdk = require("aws-cdk-lib");
5
+ const events = require("aws-cdk-lib/aws-events");
6
+ const eventsTargets = require("aws-cdk-lib/aws-events-targets");
7
+ const iam = require("aws-cdk-lib/aws-iam");
8
+ const logs = require("aws-cdk-lib/aws-logs");
9
+ const constructs_1 = require("constructs");
10
+ class LegacyS3BackupsBus extends constructs_1.Construct {
11
+ constructor(scope, id, props) {
12
+ super(scope, id);
13
+ this.busName = props.busName;
14
+ this.ruleLogGroup = new logs.LogGroup(this, 'RuleLogGroup', {
15
+ logGroupName: props.busName,
16
+ retention: logs.RetentionDays.THREE_MONTHS,
17
+ removalPolicy: cdk.RemovalPolicy.DESTROY,
18
+ });
19
+ this.vendedLogGroup = new logs.LogGroup(this, 'VendedLogGroup', {
20
+ logGroupName: `/aws/vendedlogs/events/event-bus/${props.busName}`,
21
+ retention: logs.RetentionDays.THREE_MONTHS,
22
+ removalPolicy: cdk.RemovalPolicy.DESTROY,
23
+ });
24
+ this.bus = new events.EventBus(this, 'EventBus', {
25
+ eventBusName: props.busName,
26
+ logConfig: {
27
+ level: events.Level.TRACE,
28
+ includeDetail: events.IncludeDetail.FULL,
29
+ },
30
+ });
31
+ this.bus.addToResourcePolicy(new iam.PolicyStatement({
32
+ sid: 'AllowMainAccountPutEvents',
33
+ effect: iam.Effect.ALLOW,
34
+ principals: props.allowedAccountIds.map((accountId) => new iam.AccountPrincipal(accountId)),
35
+ actions: ['events:PutEvents'],
36
+ resources: [this.bus.eventBusArn],
37
+ }));
38
+ new events.Rule(this, 'LogAllEventsRule', {
39
+ ruleName: `${props.busName}-log-all-events`,
40
+ description: `Logs every event published to the ${props.busName} event bus to the ${props.busName} CloudWatch log group`,
41
+ eventBus: this.bus,
42
+ eventPattern: { source: events.Match.exists() },
43
+ targets: [new eventsTargets.CloudWatchLogGroup(this.ruleLogGroup)],
44
+ });
45
+ this.configureVendedLogDelivery(props.busName);
46
+ }
47
+ // Catch-all: the bus policy already restricts senders to the allowed
48
+ // accounts, and the migration runner applies the MIGRATION_TRIGGERS policy
49
+ // (bucket, archive suffix, size, prefix, once) to every forwarded event.
50
+ addMigrationRunner(target) {
51
+ new events.Rule(this, 'MigrationRunnerRule', {
52
+ ruleName: `${this.busName}-migration-runner`,
53
+ description: 'Starts the migration orchestrator from source-archive events forwarded to the bus',
54
+ eventBus: this.bus,
55
+ eventPattern: { source: events.Match.exists() },
56
+ targets: [new eventsTargets.LambdaFunction(target)],
57
+ });
58
+ }
59
+ configureVendedLogDelivery(busName) {
60
+ const stack = cdk.Stack.of(this);
61
+ const { account, region, partition } = stack;
62
+ const deliveryPolicy = new logs.CfnResourcePolicy(this, 'LogDeliveryResourcePolicy', {
63
+ policyName: `${busName}-log-delivery`,
64
+ policyDocument: stack.toJsonString({
65
+ Version: '2012-10-17',
66
+ Statement: [
67
+ {
68
+ Sid: 'AWSLogDeliveryWrite',
69
+ Effect: 'Allow',
70
+ Principal: { Service: 'delivery.logs.amazonaws.com' },
71
+ Action: ['logs:CreateLogStream', 'logs:PutLogEvents'],
72
+ Resource: `${this.vendedLogGroup.logGroupArn}:log-stream:*`,
73
+ Condition: {
74
+ StringEquals: { 'aws:SourceAccount': account },
75
+ ArnLike: { 'aws:SourceArn': `arn:${partition}:logs:${region}:${account}:delivery-source:*` },
76
+ },
77
+ },
78
+ ],
79
+ }),
80
+ });
81
+ const destination = new logs.CfnDeliveryDestination(this, 'LogDeliveryDestination', {
82
+ name: `${busName}-logs`,
83
+ destinationResourceArn: this.vendedLogGroup.logGroupArn,
84
+ });
85
+ const logTypes = [
86
+ { logType: 'INFO_LOGS', id: 'Info', suffix: 'info' },
87
+ { logType: 'ERROR_LOGS', id: 'Error', suffix: 'error' },
88
+ { logType: 'TRACE_LOGS', id: 'Trace', suffix: 'trace' },
89
+ ];
90
+ let previousDelivery;
91
+ for (const { logType, id, suffix } of logTypes) {
92
+ const source = new logs.CfnDeliverySource(this, `DeliverySource${id}`, {
93
+ name: `${busName}-${suffix}`,
94
+ logType,
95
+ resourceArn: this.bus.eventBusArn,
96
+ });
97
+ const delivery = new logs.CfnDelivery(this, `Delivery${id}`, {
98
+ deliverySourceName: source.name,
99
+ deliveryDestinationArn: destination.attrArn,
100
+ });
101
+ delivery.addDependency(deliveryPolicy);
102
+ delivery.addDependency(source);
103
+ if (previousDelivery) {
104
+ delivery.addDependency(previousDelivery);
105
+ }
106
+ previousDelivery = delivery;
107
+ }
108
+ }
109
+ }
110
+ exports.LegacyS3BackupsBus = LegacyS3BackupsBus;
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVnYWN5LXMzLWJhY2t1cHMtYnVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY29uc3RydWN0cy9sZWdhY3ktczMtYmFja3Vwcy1idXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBQ25DLGlEQUFpRDtBQUNqRCxnRUFBZ0U7QUFDaEUsMkNBQTJDO0FBRTNDLDZDQUE2QztBQUM3QywyQ0FBdUM7QUFpQnZDLE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7SUFPL0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE4QjtRQUN0RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUU3QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQzFELFlBQVksRUFBRSxLQUFLLENBQUMsT0FBTztZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZO1lBQzFDLGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU87U0FDekMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzlELFlBQVksRUFBRSxvQ0FBb0MsS0FBSyxDQUFDLE9BQU8sRUFBRTtZQUNqRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZO1lBQzFDLGFBQWEsRUFBRSxHQUFHLENBQUMsYUFBYSxDQUFDLE9BQU87U0FDekMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUMvQyxZQUFZLEVBQUUsS0FBSyxDQUFDLE9BQU87WUFDM0IsU0FB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QWtCLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQy9CLHNCQUFzQixFQUFFLFdBQVcsQ0FBQyxPQUFPO2FBQzVDLENBQUMsQ0FBQztZQUVILFFBQVEsQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDdkMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMvQixJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3JCLFFBQVEsQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUMzQyxDQUFDO1lBQ0QsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0NBQ0Y7QUEzSEQsZ0RBMkhDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGV2ZW50cyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzJztcbmltcG9ydCAqIGFzIGV2ZW50c1RhcmdldHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCAqIGFzIGlhbSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGVnYWN5UzNCYWNrdXBzQnVzUHJvcHMge1xuICByZWFkb25seSBidXNOYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGFsbG93ZWRBY2NvdW50SWRzOiBzdHJpbmdbXTtcbn1cblxuLy8gT25lIG1pZ3JhdGlvbiB0cmlnZ2VyOiBhIHNvdXJjZS1hcmNoaXZlIHByZWZpeCBwbHVzIHRoZSBvcmNoZXN0cmF0b3IgaW5wdXRcbi8vIG9wdGlvbnMgaXQgbWFwcyB0by4gVGhlIG1pZ3JhdGlvbiBydW5uZXIgYXBwbGllcyB0aGlzIGxpc3QgdG8gZXZlcnkgZXZlbnRcbi8vIHRoZSBidXMgZm9yd2FyZHMuXG5leHBvcnQgaW50ZXJmYWNlIE1pZ3JhdGlvblRyaWdnZXIge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByZWZpeDogc3RyaW5nO1xuICByZWFkb25seSBvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgb25jZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBMZWdhY3lTM0JhY2t1cHNCdXMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwdWJsaWMgcmVhZG9ubHkgYnVzOiBldmVudHMuRXZlbnRCdXM7XG4gIHB1YmxpYyByZWFkb25seSBydWxlTG9nR3JvdXA6IGxvZ3MuTG9nR3JvdXA7XG4gIHB1YmxpYyByZWFkb25seSB2ZW5kZWRMb2dHcm91cDogbG9ncy5Mb2dHcm91cDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGJ1c05hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTGVnYWN5UzNCYWNrdXBzQnVzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5idXNOYW1lID0gcHJvcHMuYnVzTmFtZTtcblxuICAgIHRoaXMucnVsZUxvZ0dyb3VwID0gbmV3IGxvZ3MuTG9nR3JvdXAodGhpcywgJ1J1bGVMb2dHcm91cCcsIHtcbiAgICAgIGxvZ0dyb3VwTmFtZTogcHJvcHMuYnVzTmFtZSxcbiAgICAgIHJldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLlRIUkVFX01PTlRIUyxcbiAgICAgIHJlbW92YWxQb2xpY3k6IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1ksXG4gICAgfSk7XG5cbiAgICB0aGlzLnZlbmRlZExvZ0dyb3VwID0gbmV3IGxvZ3MuTG9nR3JvdXAodGhpcywgJ1ZlbmRlZExvZ0dyb3VwJywge1xuICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy92ZW5kZWRsb2dzL2V2ZW50cy9ldmVudC1idXMvJHtwcm9wcy5idXNOYW1lfWAsXG4gICAgICByZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5USFJFRV9NT05USFMsXG4gICAgICByZW1vdmFsUG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeS5ERVNUUk9ZLFxuICAgIH0pO1xuXG4gICAgdGhpcy5idXMgPSBuZXcgZXZlbnRzLkV2ZW50QnVzKHRoaXMsICdFdmVudEJ1cycsIHtcbiAgICAgIGV2ZW50QnVzTmFtZTogcHJvcHMuYnVzTmFtZSxcbiAgICAgIGxvZ0NvbmZpZzoge1xuICAgICAgICBsZXZlbDogZXZlbnRzLkxldmVsLlRSQUNFLFxuICAgICAgICBpbmNsdWRlRGV0YWlsOiBldmVudHMuSW5jbHVkZURldGFpbC5GVUxMLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHRoaXMuYnVzLmFkZFRvUmVzb3VyY2VQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIHNpZDogJ0FsbG93TWFpbkFjY291bnRQdXRFdmVudHMnLFxuICAgICAgICBlZmZlY3Q6IGlhbS5FZmZlY3QuQUxMT1csXG4gICAgICAgIHByaW5jaXBhbHM6IHByb3BzLmFsbG93ZWRBY2NvdW50SWRzLm1hcCgoYWNjb3VudElkKSA9PiBuZXcgaWFtLkFjY291bnRQcmluY2lwYWwoYWNjb3VudElkKSksXG4gICAgICAgIGFjdGlvbnM6IFsnZXZlbnRzOlB1dEV2ZW50cyddLFxuICAgICAgICByZXNvdXJjZXM6IFt0aGlzLmJ1cy5ldmVudEJ1c0Fybl0sXG4gICAgICB9KVxuICAgICk7XG5cbiAgICBuZXcgZXZlbnRzLlJ1bGUodGhpcywgJ0xvZ0FsbEV2ZW50c1J1bGUnLCB7XG4gICAgICBydWxlTmFtZTogYCR7cHJvcHMuYnVzTmFtZX0tbG9nLWFsbC1ldmVudHNgLFxuICAgICAgZGVzY3JpcHRpb246IGBMb2dzIGV2ZXJ5IGV2ZW50IHB1Ymxpc2hlZCB0byB0aGUgJHtwcm9wcy5idXNOYW1lfSBldmVudCBidXMgdG8gdGhlICR7cHJvcHMuYnVzTmFtZX0gQ2xvdWRXYXRjaCBsb2cgZ3JvdXBgLFxuICAgICAgZXZlbnRCdXM6IHRoaXMuYnVzLFxuICAgICAgZXZlbnRQYXR0ZXJuOiB7IHNvdXJjZTogZXZlbnRzLk1hdGNoLmV4aXN0cygpIH0sXG4gICAgICB0YXJnZXRzOiBbbmV3IGV2ZW50c1RhcmdldHMuQ2xvdWRXYXRjaExvZ0dyb3VwKHRoaXMucnVsZUxvZ0dyb3VwKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbmZpZ3VyZVZlbmRlZExvZ0RlbGl2ZXJ5KHByb3BzLmJ1c05hbWUpO1xuICB9XG5cbiAgLy8gQ2F0Y2gtYWxsOiB0aGUgYnVzIHBvbGljeSBhbHJlYWR5IHJlc3RyaWN0cyBzZW5kZXJzIHRvIHRoZSBhbGxvd2VkXG4gIC8vIGFjY291bnRzLCBhbmQgdGhlIG1pZ3JhdGlvbiBydW5uZXIgYXBwbGllcyB0aGUgTUlHUkFUSU9OX1RSSUdHRVJTIHBvbGljeVxuICAvLyAoYnVja2V0LCBhcmNoaXZlIHN1ZmZpeCwgc2l6ZSwgcHJlZml4LCBvbmNlKSB0byBldmVyeSBmb3J3YXJkZWQgZXZlbnQuXG4gIHB1YmxpYyBhZGRNaWdyYXRpb25SdW5uZXIodGFyZ2V0OiBsYW1iZGEuSUZ1bmN0aW9uKTogdm9pZCB7XG4gICAgbmV3IGV2ZW50cy5SdWxlKHRoaXMsICdNaWdyYXRpb25SdW5uZXJSdWxlJywge1xuICAgICAgcnVsZU5hbWU6IGAke3RoaXMuYnVzTmFtZX0tbWlncmF0aW9uLXJ1bm5lcmAsXG4gICAgICBkZXNjcmlwdGlvbjogJ1N0YXJ0cyB0aGUgbWlncmF0aW9uIG9yY2hlc3RyYXRvciBmcm9tIHNvdXJjZS1hcmNoaXZlIGV2ZW50cyBmb3J3YXJkZWQgdG8gdGhlIGJ1cycsXG4gICAgICBldmVudEJ1czogdGhpcy5idXMsXG4gICAgICBldmVudFBhdHRlcm46IHsgc291cmNlOiBldmVudHMuTWF0Y2guZXhpc3RzKCkgfSxcbiAgICAgIHRhcmdldHM6IFtuZXcgZXZlbnRzVGFyZ2V0cy5MYW1iZGFGdW5jdGlvbih0YXJnZXQpXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlVmVuZGVkTG9nRGVsaXZlcnkoYnVzTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgc3RhY2sgPSBjZGsuU3RhY2sub2YodGhpcyk7XG4gICAgY29uc3QgeyBhY2NvdW50LCByZWdpb24sIHBhcnRpdGlvbiB9ID0gc3RhY2s7XG5cbiAgICBjb25zdCBkZWxpdmVyeVBvbGljeSA9IG5ldyBsb2dzLkNmblJlc291cmNlUG9saWN5KHRoaXMsICdMb2dEZWxpdmVyeVJlc291cmNlUG9saWN5Jywge1xuICAgICAgcG9saWN5TmFtZTogYCR7YnVzTmFtZX0tbG9nLWRlbGl2ZXJ5YCxcbiAgICAgIHBvbGljeURvY3VtZW50OiBzdGFjay50b0pzb25TdHJpbmcoe1xuICAgICAgICBWZXJzaW9uOiAnMjAxMi0xMC0xNycsXG4gICAgICAgIFN0YXRlbWVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFNpZDogJ0FXU0xvZ0RlbGl2ZXJ5V3JpdGUnLFxuICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgUHJpbmNpcGFsOiB7IFNlcnZpY2U6ICdkZWxpdmVyeS5sb2dzLmFtYXpvbmF3cy5jb20nIH0sXG4gICAgICAgICAgICBBY3Rpb246IFsnbG9nczpDcmVhdGVMb2dTdHJlYW0nLCAnbG9nczpQdXRMb2dFdmVudHMnXSxcbiAgICAgICAgICAgIFJlc291cmNlOiBgJHt0aGlzLnZlbmRlZExvZ0dyb3VwLmxvZ0dyb3VwQXJufTpsb2ctc3RyZWFtOipgLFxuICAgICAgICAgICAgQ29uZGl0aW9uOiB7XG4gICAgICAgICAgICAgIFN0cmluZ0VxdWFsczogeyAnYXdzOlNvdXJjZUFjY291bnQnOiBhY2NvdW50IH0sXG4gICAgICAgICAgICAgIEFybkxpa2U6IHsgJ2F3czpTb3VyY2VBcm4nOiBgYXJuOiR7cGFydGl0aW9ufTpsb2dzOiR7cmVnaW9ufToke2FjY291bnR9OmRlbGl2ZXJ5LXNvdXJjZToqYCB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBjb25zdCBkZXN0aW5hdGlvbiA9IG5ldyBsb2dzLkNmbkRlbGl2ZXJ5RGVzdGluYXRpb24odGhpcywgJ0xvZ0RlbGl2ZXJ5RGVzdGluYXRpb24nLCB7XG4gICAgICBuYW1lOiBgJHtidXNOYW1lfS1sb2dzYCxcbiAgICAgIGRlc3RpbmF0aW9uUmVzb3VyY2VBcm46IHRoaXMudmVuZGVkTG9nR3JvdXAubG9nR3JvdXBBcm4sXG4gICAgfSk7XG5cbiAgICBjb25zdCBsb2dUeXBlcyA9IFtcbiAgICAgIHsgbG9nVHlwZTogJ0lORk9fTE9HUycsIGlkOiAnSW5mbycsIHN1ZmZpeDogJ2luZm8nIH0sXG4gICAgICB7IGxvZ1R5cGU6ICdFUlJPUl9MT0dTJywgaWQ6ICdFcnJvcicsIHN1ZmZpeDogJ2Vycm9yJyB9LFxuICAgICAgeyBsb2dUeXBlOiAnVFJBQ0VfTE9HUycsIGlkOiAnVHJhY2UnLCBzdWZmaXg6ICd0cmFjZScgfSxcbiAgICBdO1xuXG4gICAgbGV0IHByZXZpb3VzRGVsaXZlcnk6IGxvZ3MuQ2ZuRGVsaXZlcnkgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGNvbnN0IHsgbG9nVHlwZSwgaWQsIHN1ZmZpeCB9IG9mIGxvZ1R5cGVzKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBuZXcgbG9ncy5DZm5EZWxpdmVyeVNvdXJjZSh0aGlzLCBgRGVsaXZlcnlTb3VyY2Uke2lkfWAsIHtcbiAgICAgICAgbmFtZTogYCR7YnVzTmFtZX0tJHtzdWZmaXh9YCxcbiAgICAgICAgbG9nVHlwZSxcbiAgICAgICAgcmVzb3VyY2VBcm46IHRoaXMuYnVzLmV2ZW50QnVzQXJuLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGRlbGl2ZXJ5ID0gbmV3IGxvZ3MuQ2ZuRGVsaXZlcnkodGhpcywgYERlbGl2ZXJ5JHtpZH1gLCB7XG4gICAgICAgIGRlbGl2ZXJ5U291cmNlTmFtZTogc291cmNlLm5hbWUsXG4gICAgICAgIGRlbGl2ZXJ5RGVzdGluYXRpb25Bcm46IGRlc3RpbmF0aW9uLmF0dHJBcm4sXG4gICAgICB9KTtcblxuICAgICAgZGVsaXZlcnkuYWRkRGVwZW5kZW5jeShkZWxpdmVyeVBvbGljeSk7XG4gICAgICBkZWxpdmVyeS5hZGREZXBlbmRlbmN5KHNvdXJjZSk7XG4gICAgICBpZiAocHJldmlvdXNEZWxpdmVyeSkge1xuICAgICAgICBkZWxpdmVyeS5hZGREZXBlbmRlbmN5KHByZXZpb3VzRGVsaXZlcnkpO1xuICAgICAgfVxuICAgICAgcHJldmlvdXNEZWxpdmVyeSA9IGRlbGl2ZXJ5O1xuICAgIH1cbiAgfVxufVxuIl19
@@ -5,6 +5,7 @@ import { Construct } from 'constructs';
5
5
  export interface MigrationScriptsRunnerProps {
6
6
  vpc: ec2.IVpc;
7
7
  artifactsBucket: s3.IBucket;
8
+ migrationRepoPath?: string;
8
9
  backupPrefix?: string;
9
10
  cpu?: number;
10
11
  memoryLimitMiB?: number;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MigrationScriptsRunner = void 0;
4
4
  const cdk = require("aws-cdk-lib");
5
5
  const ec2 = require("aws-cdk-lib/aws-ec2");
6
+ const ecrAssets = require("aws-cdk-lib/aws-ecr-assets");
6
7
  const ecs = require("aws-cdk-lib/aws-ecs");
7
8
  const logs = require("aws-cdk-lib/aws-logs");
8
9
  const path = require("path");
@@ -37,7 +38,13 @@ class MigrationScriptsRunner extends constructs_1.Construct {
37
38
  const { environment, secrets } = (0, migration_1.getEcsEnvs)(cdk.Stack.of(this));
38
39
  this.container = this.taskDefinition.addContainer('scripts', {
39
40
  containerName: 'scripts',
40
- image: ecs.ContainerImage.fromAsset(path.resolve('../../migration'), { file: 'Dockerfile' }),
41
+ // The task definition runs X86_64 Fargate; pin the image platform so a
42
+ // build from an arm64 host (e.g. a Mac) does not produce a mismatched
43
+ // image (exec format error on the entrypoint).
44
+ image: ecs.ContainerImage.fromAsset(props.migrationRepoPath ?? path.resolve('../../migration'), {
45
+ file: 'Dockerfile',
46
+ platform: ecrAssets.Platform.LINUX_AMD64,
47
+ }),
41
48
  environment,
42
49
  secrets,
43
50
  logging: ecs.LogDrivers.awsLogs({
@@ -49,4 +56,4 @@ class MigrationScriptsRunner extends constructs_1.Construct {
49
56
  }
50
57
  }
51
58
  exports.MigrationScriptsRunner = MigrationScriptsRunner;
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLXNjcmlwdHMtcnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY29uc3RydWN0cy9taWdyYXRpb24tc2NyaXB0cy1ydW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBQ25DLDJDQUEyQztBQUMzQywyQ0FBMkM7QUFDM0MsNkNBQTZDO0FBRTdDLDZCQUE2QjtBQUM3QiwyQ0FBdUM7QUFDdkMsaURBQStDO0FBVy9DLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0Usb0RBQW9EO0FBQ3BELE1BQWEsc0JBQXVCLFNBQVEsc0JBQVM7SUFNbkQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUFrQztRQUMxRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUU7WUFDOUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO1lBQ2QsV0FBVyxFQUFFLG1CQUFtQjtTQUNqQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFO1lBQ2hFLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLGlCQUFpQixFQUFFLHNCQUFzQjtZQUN6QyxXQUFXLEVBQUUsNkJBQTZCO1lBQzFDLGdCQUFnQixFQUFFLElBQUk7U0FDdkIsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDMUUsTUFBTSxFQUFFLG1CQUFtQjtZQUMzQixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJO1lBQ3RCLGNBQWMsRUFBRSxLQUFLLENBQUMsY0FBYyxJQUFJLElBQUk7WUFDNUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLG1CQUFtQixJQUFJLEVBQUU7WUFDcEQsZUFBZSxFQUFFO2dCQUNmLGVBQWUsRUFBRSxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU07Z0JBQzNDLHFCQUFxQixFQUFFLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLO2FBQ3ZEO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFBLHNCQUFVLEVBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVoRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRTtZQUMzRCxhQUFhLEVBQUUsU0FBUztZQUN4QixLQUFLLEVBQUUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxDQUFDO1lBQzVGLFdBQVc7WUFDWCxPQUFPO1lBQ1AsT0FBTyxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO2dCQUM5QixZQUFZLEVBQUUsbUJBQW1CO2dCQUNqQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTO2FBQzNDLENBQUM7U0FDSCxDQUFDLENBQUM7UUFFSCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksU0FBUyxJQUFJLENBQUMsQ0FBQztJQUN4RyxDQUFDO0NBQ0Y7QUEvQ0Qsd0RBK0NDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCAqIGFzIGVjcyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWNzJztcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0ICogYXMgczMgZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7IGdldEVjc0VudnMgfSBmcm9tICcuLi91dGlsL21pZ3JhdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWlncmF0aW9uU2NyaXB0c1J1bm5lclByb3BzIHtcbiAgdnBjOiBlYzIuSVZwYztcbiAgYXJ0aWZhY3RzQnVja2V0OiBzMy5JQnVja2V0O1xuICBiYWNrdXBQcmVmaXg/OiBzdHJpbmc7XG4gIGNwdT86IG51bWJlcjtcbiAgbWVtb3J5TGltaXRNaUI/OiBudW1iZXI7XG4gIGVwaGVtZXJhbFN0b3JhZ2VHaUI/OiBudW1iZXI7XG59XG5cbi8vIE9uZS1zaG90IEZhcmdhdGUgdGFza3MgdGhhdCBydW4gdGhlIG1pZ3JhdGlvbiBzY3JpcHRzIChyZXN0b3JlLCBtaWdyYXRpb25zLFxuLy8gcHJlY29tcHV0ZS1kaXNlYXNlcywgcHJlY29tcHV0ZS1jbGFpbS1iYXRjaGVzLCByZXNldCkgdW5jaGFuZ2VkLiBUaGUgc3RhdGVcbi8vIG1hY2hpbmUgb3ZlcnJpZGVzIHRoZSBjb250YWluZXIgY29tbWFuZCBwZXIgc3RlcC5cbmV4cG9ydCBjbGFzcyBNaWdyYXRpb25TY3JpcHRzUnVubmVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGNsdXN0ZXI6IGVjcy5DbHVzdGVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjdXJpdHlHcm91cDogZWMyLlNlY3VyaXR5R3JvdXA7XG4gIHB1YmxpYyByZWFkb25seSB0YXNrRGVmaW5pdGlvbjogZWNzLkZhcmdhdGVUYXNrRGVmaW5pdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lcjogZWNzLkNvbnRhaW5lckRlZmluaXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE1pZ3JhdGlvblNjcmlwdHNSdW5uZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmNsdXN0ZXIgPSBuZXcgZWNzLkNsdXN0ZXIodGhpcywgJ0NsdXN0ZXInLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGNsdXN0ZXJOYW1lOiAnbWlncmF0aW9uLXNjcmlwdHMnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsICdTZWN1cml0eUdyb3VwJywge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBzZWN1cml0eUdyb3VwTmFtZTogJ01pZ3JhdGlvbi1TY3JpcHRzLVNHJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTWlncmF0aW9uIHNjcmlwdHMgRUNTIHRhc2tzJyxcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhc2tEZWZpbml0aW9uID0gbmV3IGVjcy5GYXJnYXRlVGFza0RlZmluaXRpb24odGhpcywgJ1Rhc2tEZWZpbml0aW9uJywge1xuICAgICAgZmFtaWx5OiAnbWlncmF0aW9uLXNjcmlwdHMnLFxuICAgICAgY3B1OiBwcm9wcy5jcHUgPz8gNDA5NixcbiAgICAgIG1lbW9yeUxpbWl0TWlCOiBwcm9wcy5tZW1vcnlMaW1pdE1pQiA/PyA4MTkyLFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZUdpQjogcHJvcHMuZXBoZW1lcmFsU3RvcmFnZUdpQiA/PyAyMSxcbiAgICAgIHJ1bnRpbWVQbGF0Zm9ybToge1xuICAgICAgICBjcHVBcmNoaXRlY3R1cmU6IGVjcy5DcHVBcmNoaXRlY3R1cmUuWDg2XzY0LFxuICAgICAgICBvcGVyYXRpbmdTeXN0ZW1GYW1pbHk6IGVjcy5PcGVyYXRpbmdTeXN0ZW1GYW1pbHkuTElOVVgsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBlbnZpcm9ubWVudCwgc2VjcmV0cyB9ID0gZ2V0RWNzRW52cyhjZGsuU3RhY2sub2YodGhpcykpO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnRhc2tEZWZpbml0aW9uLmFkZENvbnRhaW5lcignc2NyaXB0cycsIHtcbiAgICAgIGNvbnRhaW5lck5hbWU6ICdzY3JpcHRzJyxcbiAgICAgIGltYWdlOiBlY3MuQ29udGFpbmVySW1hZ2UuZnJvbUFzc2V0KHBhdGgucmVzb2x2ZSgnLi4vLi4vbWlncmF0aW9uJyksIHsgZmlsZTogJ0RvY2tlcmZpbGUnIH0pLFxuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBzZWNyZXRzLFxuICAgICAgbG9nZ2luZzogZWNzLkxvZ0RyaXZlcnMuYXdzTG9ncyh7XG4gICAgICAgIHN0cmVhbVByZWZpeDogJ21pZ3JhdGlvbi1zY3JpcHRzJyxcbiAgICAgICAgbG9nUmV0ZW50aW9uOiBsb2dzLlJldGVudGlvbkRheXMuT05FX01PTlRILFxuICAgICAgfSksXG4gICAgfSk7XG5cbiAgICBwcm9wcy5hcnRpZmFjdHNCdWNrZXQuZ3JhbnRSZWFkKHRoaXMudGFza0RlZmluaXRpb24udGFza1JvbGUsIGAke3Byb3BzLmJhY2t1cFByZWZpeCA/PyAnYmFja3Vwcyd9LypgKTtcbiAgfVxufVxuIl19
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0aW9uLXNjcmlwdHMtcnVubmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vY29uc3RydWN0cy9taWdyYXRpb24tc2NyaXB0cy1ydW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQW1DO0FBQ25DLDJDQUEyQztBQUMzQyx3REFBd0Q7QUFDeEQsMkNBQTJDO0FBQzNDLDZDQUE2QztBQUU3Qyw2QkFBNkI7QUFDN0IsMkNBQXVDO0FBQ3ZDLGlEQUErQztBQVkvQyw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLG9EQUFvRDtBQUNwRCxNQUFhLHNCQUF1QixTQUFRLHNCQUFTO0lBTW5ELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBa0M7UUFDMUUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFO1lBQzlDLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztZQUNkLFdBQVcsRUFBRSxtQkFBbUI7U0FDakMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLGVBQWUsRUFBRTtZQUNoRSxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUc7WUFDZCxpQkFBaUIsRUFBRSxzQkFBc0I7WUFDekMsV0FBVyxFQUFFLDZCQUE2QjtZQUMxQyxnQkFBZ0IsRUFBRSxJQUFJO1NBQ3ZCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxHQUFHLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzFFLE1BQU0sRUFBRSxtQkFBbUI7WUFDM0IsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSTtZQUN0QixjQUFjLEVBQUUsS0FBSyxDQUFDLGNBQWMsSUFBSSxJQUFJO1lBQzVDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxFQUFFO1lBQ3BELGVBQWUsRUFBRTtnQkFDZixlQUFlLEVBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNO2dCQUMzQyxxQkFBcUIsRUFBRSxHQUFHLENBQUMscUJBQXFCLENBQUMsS0FBSzthQUN2RDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBQSxzQkFBVSxFQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUU7WUFDM0QsYUFBYSxFQUFFLFNBQVM7WUFDeEIsdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSwrQ0FBK0M7WUFDL0MsS0FBSyxFQUFFLEdBQUcsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEVBQUU7Z0JBQzlGLElBQUksRUFBRSxZQUFZO2dCQUNsQixRQUFRLEVBQUUsU0FBUyxDQUFDLFFBQVEsQ0FBQyxXQUFXO2FBQ3pDLENBQUM7WUFDRixXQUFXO1lBQ1gsT0FBTztZQUNQLE9BQU8sRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQztnQkFDOUIsWUFBWSxFQUFFLG1CQUFtQjtnQkFDakMsWUFBWSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUzthQUMzQyxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsS0FBSyxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLFNBQVMsSUFBSSxDQUFDLENBQUM7SUFDeEcsQ0FBQztDQUNGO0FBckRELHdEQXFEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNkayBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBlYzIgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjMic7XG5pbXBvcnQgKiBhcyBlY3JBc3NldHMgZnJvbSAnYXdzLWNkay1saWIvYXdzLWVjci1hc3NldHMnO1xuaW1wb3J0ICogYXMgZWNzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1lY3MnO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbG9ncyc7XG5pbXBvcnQgKiBhcyBzMyBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgZ2V0RWNzRW52cyB9IGZyb20gJy4uL3V0aWwvbWlncmF0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBNaWdyYXRpb25TY3JpcHRzUnVubmVyUHJvcHMge1xuICB2cGM6IGVjMi5JVnBjO1xuICBhcnRpZmFjdHNCdWNrZXQ6IHMzLklCdWNrZXQ7XG4gIG1pZ3JhdGlvblJlcG9QYXRoPzogc3RyaW5nO1xuICBiYWNrdXBQcmVmaXg/OiBzdHJpbmc7XG4gIGNwdT86IG51bWJlcjtcbiAgbWVtb3J5TGltaXRNaUI/OiBudW1iZXI7XG4gIGVwaGVtZXJhbFN0b3JhZ2VHaUI/OiBudW1iZXI7XG59XG5cbi8vIE9uZS1zaG90IEZhcmdhdGUgdGFza3MgdGhhdCBydW4gdGhlIG1pZ3JhdGlvbiBzY3JpcHRzIChyZXN0b3JlLCBtaWdyYXRpb25zLFxuLy8gcHJlY29tcHV0ZS1kaXNlYXNlcywgcHJlY29tcHV0ZS1jbGFpbS1iYXRjaGVzLCByZXNldCkgdW5jaGFuZ2VkLiBUaGUgc3RhdGVcbi8vIG1hY2hpbmUgb3ZlcnJpZGVzIHRoZSBjb250YWluZXIgY29tbWFuZCBwZXIgc3RlcC5cbmV4cG9ydCBjbGFzcyBNaWdyYXRpb25TY3JpcHRzUnVubmVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IGNsdXN0ZXI6IGVjcy5DbHVzdGVyO1xuICBwdWJsaWMgcmVhZG9ubHkgc2VjdXJpdHlHcm91cDogZWMyLlNlY3VyaXR5R3JvdXA7XG4gIHB1YmxpYyByZWFkb25seSB0YXNrRGVmaW5pdGlvbjogZWNzLkZhcmdhdGVUYXNrRGVmaW5pdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IGNvbnRhaW5lcjogZWNzLkNvbnRhaW5lckRlZmluaXRpb247XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE1pZ3JhdGlvblNjcmlwdHNSdW5uZXJQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmNsdXN0ZXIgPSBuZXcgZWNzLkNsdXN0ZXIodGhpcywgJ0NsdXN0ZXInLCB7XG4gICAgICB2cGM6IHByb3BzLnZwYyxcbiAgICAgIGNsdXN0ZXJOYW1lOiAnbWlncmF0aW9uLXNjcmlwdHMnLFxuICAgIH0pO1xuXG4gICAgdGhpcy5zZWN1cml0eUdyb3VwID0gbmV3IGVjMi5TZWN1cml0eUdyb3VwKHRoaXMsICdTZWN1cml0eUdyb3VwJywge1xuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICBzZWN1cml0eUdyb3VwTmFtZTogJ01pZ3JhdGlvbi1TY3JpcHRzLVNHJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnTWlncmF0aW9uIHNjcmlwdHMgRUNTIHRhc2tzJyxcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICB0aGlzLnRhc2tEZWZpbml0aW9uID0gbmV3IGVjcy5GYXJnYXRlVGFza0RlZmluaXRpb24odGhpcywgJ1Rhc2tEZWZpbml0aW9uJywge1xuICAgICAgZmFtaWx5OiAnbWlncmF0aW9uLXNjcmlwdHMnLFxuICAgICAgY3B1OiBwcm9wcy5jcHUgPz8gNDA5NixcbiAgICAgIG1lbW9yeUxpbWl0TWlCOiBwcm9wcy5tZW1vcnlMaW1pdE1pQiA/PyA4MTkyLFxuICAgICAgZXBoZW1lcmFsU3RvcmFnZUdpQjogcHJvcHMuZXBoZW1lcmFsU3RvcmFnZUdpQiA/PyAyMSxcbiAgICAgIHJ1bnRpbWVQbGF0Zm9ybToge1xuICAgICAgICBjcHVBcmNoaXRlY3R1cmU6IGVjcy5DcHVBcmNoaXRlY3R1cmUuWDg2XzY0LFxuICAgICAgICBvcGVyYXRpbmdTeXN0ZW1GYW1pbHk6IGVjcy5PcGVyYXRpbmdTeXN0ZW1GYW1pbHkuTElOVVgsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBlbnZpcm9ubWVudCwgc2VjcmV0cyB9ID0gZ2V0RWNzRW52cyhjZGsuU3RhY2sub2YodGhpcykpO1xuXG4gICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnRhc2tEZWZpbml0aW9uLmFkZENvbnRhaW5lcignc2NyaXB0cycsIHtcbiAgICAgIGNvbnRhaW5lck5hbWU6ICdzY3JpcHRzJyxcbiAgICAgIC8vIFRoZSB0YXNrIGRlZmluaXRpb24gcnVucyBYODZfNjQgRmFyZ2F0ZTsgcGluIHRoZSBpbWFnZSBwbGF0Zm9ybSBzbyBhXG4gICAgICAvLyBidWlsZCBmcm9tIGFuIGFybTY0IGhvc3QgKGUuZy4gYSBNYWMpIGRvZXMgbm90IHByb2R1Y2UgYSBtaXNtYXRjaGVkXG4gICAgICAvLyBpbWFnZSAoZXhlYyBmb3JtYXQgZXJyb3Igb24gdGhlIGVudHJ5cG9pbnQpLlxuICAgICAgaW1hZ2U6IGVjcy5Db250YWluZXJJbWFnZS5mcm9tQXNzZXQocHJvcHMubWlncmF0aW9uUmVwb1BhdGggPz8gcGF0aC5yZXNvbHZlKCcuLi8uLi9taWdyYXRpb24nKSwge1xuICAgICAgICBmaWxlOiAnRG9ja2VyZmlsZScsXG4gICAgICAgIHBsYXRmb3JtOiBlY3JBc3NldHMuUGxhdGZvcm0uTElOVVhfQU1ENjQsXG4gICAgICB9KSxcbiAgICAgIGVudmlyb25tZW50LFxuICAgICAgc2VjcmV0cyxcbiAgICAgIGxvZ2dpbmc6IGVjcy5Mb2dEcml2ZXJzLmF3c0xvZ3Moe1xuICAgICAgICBzdHJlYW1QcmVmaXg6ICdtaWdyYXRpb24tc2NyaXB0cycsXG4gICAgICAgIGxvZ1JldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgcHJvcHMuYXJ0aWZhY3RzQnVja2V0LmdyYW50UmVhZCh0aGlzLnRhc2tEZWZpbml0aW9uLnRhc2tSb2xlLCBgJHtwcm9wcy5iYWNrdXBQcmVmaXggPz8gJ2JhY2t1cHMnfS8qYCk7XG4gIH1cbn1cbiJdfQ==
@@ -8,12 +8,14 @@ import { Construct } from 'constructs';
8
8
  export interface MigrationStateMachineProps {
9
9
  producer: lambda.IFunction;
10
10
  verifier: lambda.IFunction;
11
+ clearAffected: lambda.IFunction;
11
12
  queue: sqs.IQueue;
12
13
  cluster: ecs.ICluster;
13
14
  taskDefinition: ecs.TaskDefinition;
14
15
  container: ecs.ContainerDefinition;
15
16
  securityGroup: ec2.ISecurityGroup;
16
17
  artifactsBucket: s3.IBucket;
18
+ progressParameterName: string;
17
19
  maxInvocations?: number;
18
20
  drainMaxChecks?: number;
19
21
  loopWaitSeconds?: number;
@@ -23,17 +25,23 @@ export declare class MigrationStateMachine extends Construct {
23
25
  readonly stateMachine: sfn.StateMachine;
24
26
  private readonly producer;
25
27
  private readonly verifier;
28
+ private readonly clearAffected;
26
29
  private readonly queue;
27
30
  private readonly cluster;
28
31
  private readonly taskDefinition;
29
32
  private readonly container;
30
33
  private readonly securityGroup;
31
34
  private readonly artifactsBucket;
35
+ private readonly progressParameterName;
36
+ private readonly progressParameterArn;
32
37
  private readonly maxInvocations;
33
38
  private readonly drainMaxChecks;
34
39
  private readonly loopWaitSeconds;
35
40
  private readonly drainWaitSeconds;
36
41
  constructor(scope: Construct, id: string, props: MigrationStateMachineProps);
42
+ private previousStep;
43
+ private precomputeEnabled;
44
+ private markStep;
37
45
  private producerPass;
38
46
  private resourceStep;
39
47
  private ecsStep;