Skip to content

Conversation

@mikeallisonJS
Copy link
Collaborator

@mikeallisonJS mikeallisonJS commented May 30, 2025

Summary by CodeRabbit

  • New Features

    • Added an automated E2E Cleanup worker with a CLI command, scheduled daily run, configurable age threshold, and a dry-run preview mode.
  • Documentation

    • Added comprehensive README describing usage, patterns detected, safety measures, and monitoring guidance.
  • Tests

    • Added unit tests validating cleanup behavior, sequencing, dry-run, and error handling.
  • Chores

    • Enabled cascading deletes in database relations and added related environment/config updates.

✏️ Tip: You can customize this high-level summary in your review settings.

@mikeallisonJS mikeallisonJS self-assigned this May 30, 2025
@linear
Copy link

linear bot commented May 30, 2025

@coderabbitai
Copy link
Contributor

coderabbitai bot commented May 30, 2025

Walkthrough

Adds a new scheduled E2E cleanup worker and CLI command that finds and removes Playwright test data older than a configurable threshold, a new BullMQ queue/job, Prisma cascade delete schema changes, related migration, tests, docs, and minor build/environment config updates.

Changes

Cohort / File(s) Summary
E2E Cleanup Service & Tests
apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts, apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts, apis/api-journeys-modern/src/workers/e2eCleanup/service/index.ts
New service(job, logger) implementation and comprehensive Jest tests. Service computes cutoff, finds Playwright users and owned journeys, supports dryRun, deletes journeys then users (transactional where used), and logs progress.
Worker Config & Entry
apis/api-journeys-modern/src/workers/e2eCleanup/config.ts, apis/api-journeys-modern/src/workers/e2eCleanup/index.ts, apis/api-journeys-modern/src/workers/e2eCleanup/README.md
New queue/job naming and daily cron (DAILY_3AM), barrel exports, and README documenting patterns, safety, CLI usage, architecture, and testing guidance.
CLI & Server Integration
apis/api-journeys-modern/src/workers/cli.ts, apis/api-journeys-modern/src/workers/server.ts
Adds e2e-cleanup CLI branch with --dry-run and --hours flags; server dynamically imports/runs the new worker in the existing import/run flow (non-production path).
Schema & Migration
libs/prisma/journeys/db/schema.prisma, libs/prisma/journeys/db/migrations/.../migration.sql
Updated several relation declarations to add onDelete: Cascade, with migration SQL replacing FK constraints to add ON DELETE/UPDATE CASCADE for dependent tables.
Build / Env Configuration
apis/api-journeys-modern/project.json, apis/api-journeys-modern/infrastructure/locals.tf, apis/api-journeys-modern/tsconfig.app.json
New playwright-cleanup nx target (runs ts-node CLI), added PG_DATABASE_URL_USERS env var, and ts-node/transpile settings added to tsconfig.app.json.

Sequence Diagram(s)

mermaid
sequenceDiagram
participant Scheduler as Scheduler / Cron
participant Queue as BullMQ Queue
participant CLI as Worker CLI
participant Service as E2E Cleanup Service
participant JourneysDB as Journeys Prisma DB
participant UsersDB as Users Prisma DB
Scheduler->>Queue: enqueue cleanup job (daily)
CLI->>Queue: submit/run job (manual/CLI)
Queue->>Service: deliver Job payload
Service->>UsersDB: find Playwright users olderThan cutoff
UsersDB-->>Service: user list
Service->>JourneysDB: find journeys owned by user
JourneysDB-->>Service: journeys list
alt dryRun
Service-->>CLI: log candidates (no deletes)
else execute
Service->>JourneysDB: delete journey records (per journey)
JourneysDB-->>Service: deletion results
Service->>UsersDB: delete user
UsersDB-->>Service: deletion result
end
Service-->>Queue: report completion/log summary

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • chore: plausible worker to modern #8443: Adds/modernizes background workers and touches src/workers/server.ts and worker exports—closely related to this PR's worker integration.
  • fix: retroactively fix qr codes #6503: Adds scheduled worker/CLI targets and modifies same worker infrastructure files (project.json, cli.ts, server.ts), different worker implementation but overlapping areas.

Suggested reviewers

  • tataihono
  • csiyang
  • tanflem
🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 25.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately describes the main change: adding an e2e-cleanup command and integrating it into both CLI and server, which is well-supported by the changeset across multiple files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch mikeallison/prj-2784-playwright-cleanup-worker


📜 Recent review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between edca786 and 8ff53d4.

📒 Files selected for processing (2)
  • apis/api-journeys-modern/src/workers/e2eCleanup/config.ts
  • apis/api-journeys-modern/src/workers/e2eCleanup/index.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • apis/api-journeys-modern/src/workers/e2eCleanup/config.ts
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (.cursor/rules/base.mdc)

**/*.{ts,tsx,js,jsx}: Use early returns whenever possible to make the code more readable.
Use descriptive variable and function/const names.
Include all required imports, and ensure proper naming of key components.

Files:

  • apis/api-journeys-modern/src/workers/e2eCleanup/index.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/base.mdc)

Define a type if possible.

Files:

  • apis/api-journeys-modern/src/workers/e2eCleanup/index.ts
🧠 Learnings (2)
📓 Common learnings
Learnt from: CR
Repo: JesusFilm/core PR: 0
File: apps/watch/AGENTS.md:0-0
Timestamp: 2025-12-19T04:58:24.460Z
Learning: Reuse E2E coverage from `apps/watch-e2e` and its Playwright setup instead of creating new tooling.
Learnt from: CR
Repo: JesusFilm/core PR: 0
File: apps/watch/AGENTS.md:0-0
Timestamp: 2025-12-19T04:58:24.460Z
Learning: Applies to apps/watch/apps/watch-e2e/**/*.{ts,tsx} : Reuse the workspace Playwright installation for E2E tests in `apps/watch-e2e`; never install Playwright globally or commit browser binaries.
Learnt from: CR
Repo: JesusFilm/core PR: 0
File: apps/watch/AGENTS.md:0-0
Timestamp: 2025-12-19T04:58:24.460Z
Learning: Extend Playwright scenarios when UI behavior shifts, and capture console logs/screenshots for regressions.
📚 Learning: 2025-11-11T23:22:02.196Z
Learnt from: mikeallisonJS
Repo: JesusFilm/core PR: 8156
File: apis/api-journeys-modern/src/lib/google/googleAuth.ts:0-0
Timestamp: 2025-11-11T23:22:02.196Z
Learning: In apis/api-journeys-modern, use the validated `env` object from `../../env` instead of accessing `process.env` directly for environment variables that are defined in env.ts (e.g., GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET). This eliminates the need for runtime validation checks since Zod validates them at application startup.

Applied to files:

  • apis/api-journeys-modern/src/workers/e2eCleanup/index.ts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: test (22, 1/3)
  • GitHub Check: affected (22)
  • GitHub Check: test (22, 2/3)
  • GitHub Check: lint (22)
  • GitHub Check: test (22, 3/3)
  • GitHub Check: build (22)
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (1)
apis/api-journeys-modern/src/workers/e2eCleanup/index.ts (1)

1-2: Clean, focused export barrel.

Re-exports are concise and clear.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link
Contributor

github-actions bot commented May 30, 2025

Warnings
⚠️ ❗ Big PR (848 changes)

(change count - 848): Pull Request size seems relatively large. If Pull Request contains multiple changes, split each into separate PR will helps faster, easier review.

Generated by 🚫 dangerJS against 8ff53d4

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
apis/api-journeys-modern/src/workers/e2eCleanup/README.md (1)

1-167: Fix minor markdown formatting issues.

The documentation is comprehensive and well-written! However, there are some formatting issues to address:

  1. Remove trailing colons from headings (markdown best practice)
  2. Add language specification to code blocks

Apply these formatting fixes:

-### Journey Patterns (case-insensitive):
+### Journey Patterns (case-insensitive)

-### Team Patterns (case-insensitive):
+### Team Patterns (case-insensitive)

-### Email Patterns:
+### Email Patterns

-### For Journeys:
+### For Journeys

-### For Teams:
+### For Teams

-### For Invitations:
+### For Invitations

For the code blocks at lines 107-119 and 123-131, add language specification:

-```
+```text
Running in DRY RUN mode - no data will be deleted
-```
+```text
Will clean up test data older than 24 hours
🧰 Tools
🪛 LanguageTool

[uncategorized] ~67-~67: Loose punctuation mark.
Context: ...s 12 ``` ### CLI Options - --dry-run: Preview mode - shows what would be dele...

(UNLIKELY_OPENING_PUNCTUATION)

🪛 markdownlint-cli2 (0.17.2)

21-21: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


31-31: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


40-40: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


74-74: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


83-83: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


90-90: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


107-107: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


123-123: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4b4e235 and 9593916.

📒 Files selected for processing (9)
  • apis/api-journeys-modern/project.json (1 hunks)
  • apis/api-journeys-modern/src/workers/cli.ts (2 hunks)
  • apis/api-journeys-modern/src/workers/e2eCleanup/README.md (1 hunks)
  • apis/api-journeys-modern/src/workers/e2eCleanup/config.ts (1 hunks)
  • apis/api-journeys-modern/src/workers/e2eCleanup/index.ts (1 hunks)
  • apis/api-journeys-modern/src/workers/e2eCleanup/service/index.ts (1 hunks)
  • apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts (1 hunks)
  • apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts (1 hunks)
  • apis/api-journeys-modern/src/workers/server.ts (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (3)
apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts (1)
apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts (1)
  • service (24-342)
apis/api-journeys-modern/src/workers/cli.ts (1)
apis/api-journeys-modern/src/workers/e2eCleanup/config.ts (2)
  • queueName (1-1)
  • jobName (2-2)
apis/api-journeys-modern/src/workers/e2eCleanup/config.ts (1)
apis/api-journeys-modern/src/workers/e2eCleanup/index.ts (2)
  • queueName (2-2)
  • jobName (2-2)
🪛 LanguageTool
apis/api-journeys-modern/src/workers/e2eCleanup/README.md

[uncategorized] ~67-~67: Loose punctuation mark.
Context: ...s 12 ``` ### CLI Options - --dry-run: Preview mode - shows what would be dele...

(UNLIKELY_OPENING_PUNCTUATION)

🪛 markdownlint-cli2 (0.17.2)
apis/api-journeys-modern/src/workers/e2eCleanup/README.md

21-21: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


31-31: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


40-40: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


74-74: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


83-83: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


90-90: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


107-107: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


123-123: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: danger (22)
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (9)
apis/api-journeys-modern/src/workers/e2eCleanup/config.ts (1)

1-2: Configuration naming is clear and consistent.
The queueName and jobName constants follow the established pattern and will provide unified identifiers across the E2E cleanup workflow.

apis/api-journeys-modern/src/workers/e2eCleanup/service/index.ts (1)

1-1: Barrel export is correct.
Re-exporting service from ./service provides a clean import surface for upstream modules.

apis/api-journeys-modern/src/workers/e2eCleanup/index.ts (1)

1-2: Centralized exports look good.
Consolidating service, jobName, and queueName exports in this index simplifies dynamic imports in the CLI and server modules.

apis/api-journeys-modern/src/workers/server.ts (1)

78-83: Register the E2E Cleanup Worker alongside existing workers.
The dynamic import and run(...) invocation mirror the pattern used for other workers and will integrate the new cleanup job into the server lifecycle as intended.

apis/api-journeys-modern/src/workers/cli.ts (2)

23-32: LGTM! Clean implementation following existing patterns.

The new case branch for e2e-cleanup is well-structured and follows the established pattern from the shortlink-updater case, including proper dynamic imports and queue initialization.


46-69: Excellent command-line option handling with proper validation.

The implementation includes:

  • Clear user feedback for dry-run mode
  • Robust validation for the hours parameter (parseInt, isNaN check, positive value check)
  • Informative console messages using chalk for better visibility
apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts (1)

1-309: Excellent test coverage for the e2e cleanup service!

The test suite is comprehensive and well-structured:

  • Tests all major scenarios including successful cleanup, dry run mode, default values, and error handling
  • Properly mocks all Prisma operations
  • Includes both positive assertions (what should happen) and negative assertions (what shouldn't happen in dry run)
  • Test data uses realistic patterns matching actual e2e test data
apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts (2)

34-52: Consider the breadth of pattern matching.

The implementation looks solid! The generic patterns like 'E2E', 'Automation', and 'Test Team' could potentially match non-test data. However, this risk is well-mitigated by:

  • Time-based filtering (olderThanHours)
  • Dry run mode for verification before actual deletion
  • Case-insensitive partial matching reduces false positives

Consider monitoring the dry run outputs initially to ensure patterns don't match unintended data.


219-342: Excellent implementation of cascading deletions with proper error handling!

The deletion logic is well-designed:

  • Respects foreign key constraints by deleting in the correct order
  • Handles team-owned journeys separately to ensure complete cleanup
  • Comprehensive error handling with logging and proper error propagation
  • Clear separation between journey, team, and invitation cleanup

…llo client integration

- Added Apollo Client setup for user email queries.
- Implemented filtering of test journeys based on title patterns and user roles.
- Introduced caching for user email lookups to optimize performance.
- Updated logging to provide detailed statistics during dry runs and suppress info logs during actual cleanup.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
apis/api-journeys-modern/src/workers/e2eCleanup/README.md (1)

136-136: Add language specifiers to code blocks for better syntax highlighting.

The example output blocks should specify a language for proper rendering.

-```
+```console

Apply this change to both code blocks at lines 136 and 162.

Also applies to: 162-162

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

136-136: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts (1)

88-92: Remove unnecessary non-null assertion.

TypeScript should correctly infer that the value exists after the .has() check.

     // Check cache first
     if (playwrightUserCache.has(userId)) {
-      return playwrightUserCache.get(userId)!
+      return playwrightUserCache.get(userId) as boolean
     }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9593916 and 3d7c5b7.

📒 Files selected for processing (3)
  • apis/api-journeys-modern/src/workers/e2eCleanup/README.md (1 hunks)
  • apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts (1 hunks)
  • apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts (1 hunks)
🧰 Additional context used
🪛 LanguageTool
apis/api-journeys-modern/src/workers/e2eCleanup/README.md

[uncategorized] ~94-~94: Loose punctuation mark.
Context: ...s 12 ``` ### CLI Options - --dry-run: Preview mode - shows what would be dele...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~235-~235: Loose punctuation mark.
Context: ... environment variables: - GATEWAY_URL: URL for the GraphQL gateway - `INTEROP_...

(UNLIKELY_OPENING_PUNCTUATION)

🪛 markdownlint-cli2 (0.17.2)
apis/api-journeys-modern/src/workers/e2eCleanup/README.md

24-24: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


40-40: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


49-49: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


101-101: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


110-110: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


117-117: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


136-136: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


162-162: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


217-217: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


224-224: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)

⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (6)
apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts (4)

38-169: Well-structured test case for journey cleanup logic!

The test comprehensively covers both title pattern matching and playwright user filtering, with appropriate mock data and assertions.


170-257: Excellent coverage of dry run mode!

The test properly verifies that no destructive operations occur during dry run and that detailed logging is performed.


259-320: Good test for caching efficiency!

The test effectively validates that the user email caching mechanism prevents redundant API calls.


321-511: Comprehensive test coverage for edge cases and error scenarios!

The remaining test cases effectively cover error handling, default parameters, team cleanup cascades, and logging behavior. The tests ensure the service is resilient to failures.

apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts (2)

130-207: Well-implemented journey filtering logic!

The dual filtering approach (by title patterns and user emails) with detailed statistics tracking is excellent.


456-461: Appropriate error handling implementation!

The error logging and re-throwing pattern is correct for a job queue worker.

…ed data integrity

- Wrapped all cleanup operations in a single database transaction to ensure atomicity.
- Enhanced logging to reflect the number of deleted journeys, teams, and invitations.
- Removed generic fallback patterns from journey and team identification to streamline detection.
- Updated tests to validate transaction behavior and error handling during cleanup operations.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts (1)

22-22: ⚠️ Potential issue

INTEROP_TOKEN fallback issue remains unaddressed.

The fallback to an empty string for INTEROP_TOKEN can still lead to authentication failures, as mentioned in the previous review. This issue should be resolved.

Apply this fix to ensure the service fails fast with a clear error message:

-    'interop-token': process.env.INTEROP_TOKEN ?? '',
+    'interop-token': process.env.INTEROP_TOKEN || (() => { throw new Error('INTEROP_TOKEN environment variable is required') })(),
🧹 Nitpick comments (2)
apis/api-journeys-modern/src/workers/e2eCleanup/README.md (2)

25-25: Fix markdown heading formatting.

Remove trailing colons from headings to comply with markdown standards.

Apply these changes to fix the heading formatting:

-### Journey Detection (OR logic):
+### Journey Detection (OR logic)

-### Team Patterns (case-insensitive):
+### Team Patterns (case-insensitive)

-### Email Patterns (invitations):
+### Email Patterns (invitations)

-### For Journeys:
+### For Journeys

-### For Teams:
+### For Teams

-### For Invitations:
+### For Invitations

-### Dry Run Mode:
+### Dry Run Mode

-### Production Mode:
+### Production Mode

Also applies to: 37-37, 42-42, 94-94, 103-103, 110-110, 218-218, 225-225

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

25-25: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


136-158: Add language specification to code blocks.

Specify the language for code blocks to improve syntax highlighting and readability.

Apply these changes:

-```
+```text
 Running in DRY RUN mode - no data will be deleted
 Will clean up test data older than 24 hours
 ...

- +text
Starting e2e cleanup: olderThanHours=24, dryRun=false
Deleted test journeys: deletedJourneys=3
...

Also applies to: 162-169

🧰 Tools
🪛 markdownlint-cli2 (0.17.2)

136-136: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3d7c5b7 and 7202e4b.

📒 Files selected for processing (3)
  • apis/api-journeys-modern/src/workers/e2eCleanup/README.md (1 hunks)
  • apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts (1 hunks)
  • apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts (1 hunks)
🧰 Additional context used
🪛 GitHub Check: test (22, 1/3)
apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts

[failure] 685-685: E2E Cleanup Service › service › should identify journeys with exact testData.json patterns
expect(jest.fn()).toHaveBeenCalledWith(...expected)

  • Expected
  • Received

@@ -2,9 +2,10 @@
"where": Object {
"id": Object {
"in": Array [
"team-1",
"team-2",

  •     "team-3",
      ],
    },
    
    },
    },

Number of calls: 1

at src/workers/e2eCleanup/service/service.spec.ts:685:38
at fulfilled (../../node_modules/tslib/tslib.js:167:62)
🪛 LanguageTool
apis/api-journeys-modern/src/workers/e2eCleanup/README.md

[uncategorized] ~87-~87: Loose punctuation mark.
Context: ...s 12 ``` ### CLI Options - --dry-run: Preview mode - shows what would be dele...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~236-~236: Loose punctuation mark.
Context: ... environment variables: - GATEWAY_URL: URL for the GraphQL gateway - `INTEROP_...

(UNLIKELY_OPENING_PUNCTUATION)

🪛 markdownlint-cli2 (0.17.2)
apis/api-journeys-modern/src/workers/e2eCleanup/README.md

25-25: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


37-37: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


42-42: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


94-94: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


103-103: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


110-110: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


136-136: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


162-162: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


218-218: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


225-225: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)

⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: visual-test (22)
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (4)
apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts (2)

323-446: Excellent implementation of transaction-based cleanup.

The transaction implementation properly addresses the previous review concern about atomicity. The deletion order correctly respects foreign key constraints, and all operations are wrapped in a single transaction for consistency.


71-101: Well-implemented user email caching strategy.

The caching implementation efficiently reduces API calls by storing both positive and negative lookup results. The error handling gracefully degrades when user lookups fail without stopping the entire cleanup process.

apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts (1)

25-700: Comprehensive test coverage with excellent mocking strategy.

The test suite provides thorough coverage of the cleanup logic including:

  • Pattern matching for journeys and teams
  • User email caching behavior
  • Error handling scenarios
  • Transaction rollback testing
  • Dry run vs actual cleanup modes

The mocking approach correctly isolates the service logic from external dependencies.

🧰 Tools
🪛 GitHub Check: test (22, 1/3)

[failure] 685-685: E2E Cleanup Service › service › should identify journeys with exact testData.json patterns
expect(jest.fn()).toHaveBeenCalledWith(...expected)

  • Expected
  • Received

@@ -2,9 +2,10 @@
"where": Object {
"id": Object {
"in": Array [
"team-1",
"team-2",

  •     "team-3",
      ],
    },
    
    },
    },

Number of calls: 1

at src/workers/e2eCleanup/service/service.spec.ts:685:38
at fulfilled (../../node_modules/tslib/tslib.js:167:62)
apis/api-journeys-modern/src/workers/e2eCleanup/README.md (1)

1-250: Excellent comprehensive documentation.

The README provides thorough documentation covering:

  • Clear overview and features
  • Detailed detection patterns with examples
  • Performance optimizations and caching strategy
  • Usage instructions and CLI options
  • Safety features and error handling
  • Integration guidance

This will be very helpful for developers working with the E2E cleanup functionality.

🧰 Tools
🪛 LanguageTool

[uncategorized] ~87-~87: Loose punctuation mark.
Context: ...s 12 ``` ### CLI Options - --dry-run: Preview mode - shows what would be dele...

(UNLIKELY_OPENING_PUNCTUATION)


[uncategorized] ~236-~236: Loose punctuation mark.
Context: ... environment variables: - GATEWAY_URL: URL for the GraphQL gateway - `INTEROP_...

(UNLIKELY_OPENING_PUNCTUATION)

🪛 markdownlint-cli2 (0.17.2)

25-25: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


37-37: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


42-42: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


94-94: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


103-103: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


110-110: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


136-136: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


162-162: Fenced code blocks should have a language specified
null

(MD040, fenced-code-language)


218-218: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


225-225: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)

- Changed team title from 'Regular Team' to 'Production Group'.
- Updated mock data for teams to include specific names for better test clarity.
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7202e4b and 83a3ddf.

📒 Files selected for processing (1)
  • apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts (3)
apis/api-journeys-modern/src/workers/e2eCleanup/index.ts (1)
  • service (1-1)
apis/api-journeys-modern/src/workers/e2eCleanup/service/index.ts (1)
  • service (1-1)
apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts (1)
  • service (55-482)
⏰ Context from checks skipped due to timeout of 90000ms (4)
  • GitHub Check: affected (22)
  • GitHub Check: test (22, 2/3)
  • GitHub Check: visual-test (22)
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (8)
apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts (8)

1-24: LGTM: Well-structured imports and mocking setup.

The imports are clean and the Apollo Client and gql.tada mocks are properly configured for testing. The mock implementation correctly intercepts the relevant methods.


25-55: LGTM: Comprehensive test setup with proper mocking.

The beforeEach setup properly clears mocks and creates comprehensive mock objects for the logger and transaction client. The transaction mock implementation correctly simulates the callback-based behavior.


58-193: LGTM: Comprehensive test coverage for main cleanup functionality.

This test properly validates the core cleanup logic including:

  • Journey filtering by title patterns and playwright users
  • Transaction-based deletion
  • Proper Apollo Client mocking for user email lookups
  • Correct assertion of deletion calls and logging

The test data setup and expectations align well with the service behavior.


194-282: LGTM: Good dry run validation with detailed logging verification.

This test effectively validates that:

  • No actual deletions occur during dry run mode
  • Detailed filtering statistics are logged only in dry run
  • Transaction is not called in dry run mode

The logging assertions are comprehensive and ensure proper behavior differentiation between dry run and actual cleanup.


284-344: LGTM: Excellent test for user email lookup caching optimization.

This test validates an important performance optimization by ensuring that duplicate user IDs only trigger a single Apollo query. The test setup with the same user owning multiple journeys is realistic and the assertion confirms the caching behavior works correctly.


346-398: LGTM: Robust error handling test for external service failures.

This test properly validates graceful handling of Apollo Client errors, ensuring that:

  • User lookup failures are logged as warnings
  • Processing continues despite individual user lookup failures
  • The overall cleanup process completes successfully

This is important for resilience against external service issues.


487-540: LGTM: Good validation of conditional logging behavior.

This test ensures that filtering statistics are only logged during dry runs and not during actual cleanup operations, which helps keep the logs clean during normal operations while providing detailed information when needed for analysis.


542-585: LGTM: Important test for transaction error handling and rollback.

This test validates that transaction failures are properly handled with:

  • Error logging with context
  • Error propagation to caller
  • Proper transaction attempt tracking

This ensures data consistency in case of database operation failures.

kiran-redhat
kiran-redhat previously approved these changes May 31, 2025
…ervice

- Changed the command for Playwright cleanup to include 'e2e-cleanup' as an argument.
- Updated the import path for E2E cleanup configuration in the CLI.
- Modified README to reflect the new command structure for triggering cleanup jobs.
- Refactored E2E cleanup service to utilize Prisma for user queries, removing Apollo Client setup and related code.
kiran-redhat
kiran-redhat previously approved these changes Jun 5, 2025
@jesus-film-bot
Copy link

Ran Plan for dir: infrastructure workspace: default

Show Output
Note: Objects have changed outside of Terraform

Terraform detected the following changes made outside of Terraform since the
last "terraform apply" which may have affected this plan:

  # module.prod.module.postgresql.aws_rds_cluster.default has changed
~ resource "aws_rds_cluster" "default" {
      ~ engine_version                        = "13.18" -> "13.20"
      ~ engine_version_actual                 = "13.18" -> "13.20"
        id                                    = "jfp-core-prod"
        tags                                  = {}
        # (58 unchanged attributes hidden)

        # (1 unchanged block hidden)
    }

  # module.stage.module.postgresql.aws_rds_cluster.default has changed
~ resource "aws_rds_cluster" "default" {
      ~ engine_version                        = "13.18" -> "13.20"
      ~ engine_version_actual                 = "13.18" -> "13.20"
        id                                    = "jfp-core-stage"
        tags                                  = {}
        # (58 unchanged attributes hidden)

        # (1 unchanged block hidden)
    }


Unless you have made equivalent changes to your configuration, or ignored the
relevant attributes using ignore_changes, the following plan may include
actions to undo or respond to these changes.

─────────────────────────────────────────────────────────────────────────────

Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create
~ update in-place
+/- create replacement and then destroy
 <= read (data resources)

Terraform will perform the following actions:

  # module.prod.module.eks.data.aws_ami.eks-worker will be read during apply
  # (depends on a resource or a module with changes pending)
 <= data "aws_ami" "eks-worker" {
      + architecture          = (known after apply)
      + arn                   = (known after apply)
      + block_device_mappings = (known after apply)
      + boot_mode             = (known after apply)
      + creation_date         = (known after apply)
      + deprecation_time      = (known after apply)
      + description           = (known after apply)
      + ena_support           = (known after apply)
      + hypervisor            = (known after apply)
      + id                    = (known after apply)
      + image_id              = (known after apply)
      + image_location        = (known after apply)
      + image_owner_alias     = (known after apply)
      + image_type            = (known after apply)
      + imds_support          = (known after apply)
      + kernel_id             = (known after apply)
      + last_launched_time    = (known after apply)
      + most_recent           = true
      + name                  = (known after apply)
      + owner_id              = (known after apply)
      + owners                = [
          + "602401143452",
        ]
      + platform              = (known after apply)
      + platform_details      = (known after apply)
      + product_codes         = (known after apply)
      + public                = (known after apply)
      + ramdisk_id            = (known after apply)
      + region                = (known after apply)
      + root_device_name      = (known after apply)
      + root_device_type      = (known after apply)
      + root_snapshot_id      = (known after apply)
      + sriov_net_support     = (known after apply)
      + state                 = (known after apply)
      + state_reason          = (known after apply)
      + tags                  = (known after apply)
      + tpm_support           = (known after apply)
      + usage_operation       = (known after apply)
      + virtualization_type   = (known after apply)

      + filter {
          + name   = "name"
          + values = [
              + "amazon-eks-node-1.32-v*",
            ]
        }
    }

  # module.prod.module.eks.aws_eks_cluster.this will be updated in-place
~ resource "aws_eks_cluster" "this" {
        id                            = "jfp-eks-prod"
        name                          = "jfp-eks-prod"
        tags                          = {
            "alpha.eksctl.io/cluster-oidc-enabled" = "true"
        }
      ~ version                       = "1.31" -> "1.32"
        # (13 unchanged attributes hidden)

        # (4 unchanged blocks hidden)
    }

  # module.prod.module.postgresql.aws_rds_cluster.default will be updated in-place
~ resource "aws_rds_cluster" "default" {
      + enable_local_write_forwarding         = false
      ~ engine_version                        = "13.20" -> "13.18"
        id                                    = "jfp-core-prod"
        tags                                  = {}
        # (59 unchanged attributes hidden)

        # (1 unchanged block hidden)
    }

  # module.prod.module.postgresql.aws_rds_cluster_instance.default will be updated in-place
~ resource "aws_rds_cluster_instance" "default" {
      ~ engine_version                        = "13.20" -> "13.18"
      + force_destroy                         = false
        id                                    = "tf-20240604195536182300000003"
        tags                                  = {}
        # (32 unchanged attributes hidden)
    }

  # module.stage.module.eks.aws_eks_node_group.az_2a_ondemand will be updated in-place
~ resource "aws_eks_node_group" "az_2a_ondemand" {
        id                     = "jfp-eks-stage:jfp-eks-node-group-2a-stage"
        tags                   = {}
        # (17 unchanged attributes hidden)

      ~ scaling_config {
          ~ desired_size = 3 -> 2
          ~ max_size     = 5 -> 4
          ~ min_size     = 3 -> 2
        }

        # (2 unchanged blocks hidden)
    }

  # module.stage.module.postgresql.aws_rds_cluster.default will be updated in-place
~ resource "aws_rds_cluster" "default" {
      + enable_local_write_forwarding         = false
      ~ engine_version                        = "13.20" -> "13.18"
        id                                    = "jfp-core-stage"
        tags                                  = {}
        # (59 unchanged attributes hidden)

        # (1 unchanged block hidden)
    }

  # module.stage.module.postgresql.aws_rds_cluster_instance.default will be updated in-place
~ resource "aws_rds_cluster_instance" "default" {
      ~ engine_version                        = "13.20" -> "13.18"
      + force_destroy                         = false
        id                                    = "tf-20240618004835876400000003"
        tags                                  = {}
        # (32 unchanged attributes hidden)
    }

  # module.prod.module.api-journeys-modern.module.ecs-task.aws_ecs_service.ecs_service will be updated in-place
~ resource "aws_ecs_service" "ecs_service" {
        id                                 = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-prod/api-journeys-modern-prod-service"
        name                               = "api-journeys-modern-prod-service"
        tags                               = {}
      ~ task_definition                    = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-prod:17" -> (known after apply)
        # (18 unchanged attributes hidden)

        # (4 unchanged blocks hidden)
    }

  # module.prod.module.api-journeys-modern.module.ecs-task.aws_ecs_task_definition.ecs_task_definition must be replaced
+/- resource "aws_ecs_task_definition" "ecs_task_definition" {
      ~ arn                      = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-prod:17" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-prod" -> (known after apply)
      ~ container_definitions    = jsonencode(
            [
              - {
                  - cpu              = 1024
                  - environment      = [
                      - {
                          - name  = "NODE_ENV"
                          - value = "production"
                        },
                      - {
                          - name  = "SERVICE_ENV"
                          - value = "prod"
                        },
                      - {
                          - name  = "SERVICE_NAME"
                          - value = "api-journeys-modern"
                        },
                    ]
                  - essential        = true
                  - image            = "410965620680.dkr.ecr.us-east-2.amazonaws.com/jfp-api-journeys-modern-prod:latest"
                  - logConfiguration = {
                      - logDriver     = "awsfirelens"
                      - options       = {
                          - Host        = "http-intake.logs.datadoghq.com"
                          - Name        = "datadog"
                          - TLS         = "on"
                          - compress    = "gzip"
                          - dd_service  = "api-journeys-modern"
                          - dd_source   = "graphql-yoga"
                          - dd_tags     = "env:prod"
                          - provider    = "ecs"
                          - retry_limit = "2"
                        }
                      - secretOptions = [
                          - {
                              - name      = "apikey"
                              - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                            },
                        ]
                    }
                  - memory           = 2048
                  - mountPoints      = []
                  - name             = "jfp-api-journeys-modern-prod-app"
                  - portMappings     = [
                      - {
                          - containerPort = 4004
                          - hostPort      = 4004
                          - protocol      = "tcp"
                        },
                    ]
                  - secrets          = [
                      - {
                          - name      = "AWS_ACCESS_KEY_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/AWS_ACCESS_KEY_ID"
                        },
                      - {
                          - name      = "AWS_SECRET_ACCESS_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/AWS_SECRET_ACCESS_KEY"
                        },
                      - {
                          - name      = "CLOUDFLARE_UPLOAD_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/CLOUDFLARE_UPLOAD_KEY"
                        },
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                      - {
                          - name      = "FACEBOOK_APP_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/FACEBOOK_APP_ID"
                        },
                      - {
                          - name      = "FACEBOOK_APP_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/FACEBOOK_APP_SECRET"
                        },
                      - {
                          - name      = "FIREBASE_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/FIREBASE_API_KEY"
                        },
                      - {
                          - name      = "GATEWAY_HMAC_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GATEWAY_HMAC_SECRET"
                        },
                      - {
                          - name      = "GATEWAY_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GATEWAY_URL"
                        },
                      - {
                          - name      = "GIT_BRANCH"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GIT_BRANCH"
                        },
                      - {
                          - name      = "GOOGLE_APPLICATION_JSON"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GOOGLE_APPLICATION_JSON"
                        },
                      - {
                          - name      = "GOOGLE_CLIENT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GOOGLE_CLIENT_ID"
                        },
                      - {
                          - name      = "GOOGLE_CLIENT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GOOGLE_CLIENT_SECRET"
                        },
                      - {
                          - name      = "GOOGLE_GENERATIVE_AI_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GOOGLE_GENERATIVE_AI_API_KEY"
                        },
                      - {
                          - name      = "GROWTH_SPACES_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GROWTH_SPACES_URL"
                        },
                      - {
                          - name      = "INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET"
                        },
                      - {
                          - name      = "INTEROP_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/INTEROP_TOKEN"
                        },
                      - {
                          - name      = "JOURNEYS_ADMIN_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/JOURNEYS_ADMIN_URL"
                        },
                      - {
                          - name      = "JOURNEYS_REVALIDATE_ACCESS_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/JOURNEYS_REVALIDATE_ACCESS_TOKEN"
                        },
                      - {
                          - name      = "JOURNEYS_SHORTLINK_DOMAIN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/JOURNEYS_SHORTLINK_DOMAIN"
                        },
                      - {
                          - name      = "JOURNEYS_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/JOURNEYS_URL"
                        },
                      - {
                          - name      = "MAILCHIMP_AUDIENCE_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/MAILCHIMP_AUDIENCE_ID"
                        },
                      - {
                          - name      = "MAILCHIMP_MARKETING_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/MAILCHIMP_MARKETING_API_KEY"
                        },
                      - {
                          - name      = "MAILCHIMP_MARKETING_API_SERVER_PREFIX"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/MAILCHIMP_MARKETING_API_SERVER_PREFIX"
                        },
                      - {
                          - name      = "NAT_ADDRESSES"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/NAT_ADDRESSES"
                        },
                      - {
                          - name      = "OPEN_AI_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/OPEN_AI_API_KEY"
                        },
                      - {
                          - name      = "PG_DATABASE_URL_JOURNEYS"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PG_DATABASE_URL_JOURNEYS"
                        },
                      - {
                          - name      = "PLAUSIBLE_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAUSIBLE_API_KEY"
                        },
                      - {
                          - name      = "PLAUSIBLE_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAUSIBLE_URL"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_2"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_2"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_3"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_3"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_4"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_4"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_5"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_5"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_6"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_6"
                        },
                      - {
                          - name      = "POWER_BI_CLIENT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_CLIENT_ID"
                        },
                      - {
                          - name      = "POWER_BI_CLIENT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_CLIENT_SECRET"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_MULTIPLE_FULL_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_JOURNEYS_MULTIPLE_FULL_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_MULTIPLE_SUMMARY_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_JOURNEYS_MULTIPLE_SUMMARY_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_SINGLE_FULL_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_JOURNEYS_SINGLE_FULL_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_SINGLE_SUMMARY_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_JOURNEYS_SINGLE_SUMMARY_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_TENANT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_TENANT_ID"
                        },
                      - {
                          - name      = "POWER_BI_WORKSPACE_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_WORKSPACE_ID"
                        },
                      - {
                          - name      = "REDIS_PORT"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/REDIS_PORT"
                        },
                      - {
                          - name      = "REDIS_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/REDIS_URL"
                        },
                      - {
                          - name      = "SMTP_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/SMTP_URL"
                        },
                      - {
                          - name      = "VERCEL_JOURNEYS_PROJECT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/VERCEL_JOURNEYS_PROJECT_ID"
                        },
                      - {
                          - name      = "VERCEL_TEAM_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/VERCEL_TEAM_ID"
                        },
                      - {
                          - name      = "VERCEL_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/VERCEL_TOKEN"
                        },
                    ]
                  - systemControls   = []
                  - volumesFrom      = []
                },
              - {
                  - environment       = [
                      - {
                          - name  = "DD_APM_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_APM_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_DOGSTATSD_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_LOGS_INJECTION"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT"
                          - value = "0.0.0.0:4317"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT"
                          - value = "0.0.0.0:4318"
                        },
                      - {
                          - name  = "DD_PROCESS_AGENT_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_PROFILING_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_RUNTIME_METRICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_TAGS"
                          - value = "env:prod app:api-journeys-modern"
                        },
                      - {
                          - name  = "DD_TRACE_ANALYTICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "ECS_FARGATE"
                          - value = "true"
                        },
                    ]
                  - essential         = true
                  - image             = "public.ecr.aws/datadog/agent:latest"
                  - logConfiguration  = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "api-journeys-modern-prod-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation = 128
                  - mountPoints       = []
                  - name              = "jfp-api-journeys-modern-prod-datadog-agent"
                  - portMappings      = [
                      - {
                          - containerPort = 4317
                          - hostPort      = 4317
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 4318
                          - hostPort      = 4318
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 8125
                          - hostPort      = 8125
                          - protocol      = "udp"
                        },
                    ]
                  - secrets           = [
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                    ]
                  - systemControls    = []
                  - volumesFrom       = []
                },
              - {
                  - environment           = []
                  - essential             = true
                  - firelensConfiguration = {
                      - options = {
                          - config-file-type        = "file"
                          - config-file-value       = "/fluent-bit/configs/parse-json.conf"
                          - enable-ecs-log-metadata = "true"
                        }
                      - type    = "fluentbit"
                    }
                  - image                 = "amazon/aws-for-fluent-bit:stable"
                  - logConfiguration      = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "api-journeys-modern-prod-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation     = 100
                  - mountPoints           = []
                  - name                  = "jfp-api-journeys-modern-prod-log-router"
                  - portMappings          = []
                  - systemControls        = []
                  - user                  = "0"
                  - volumesFrom           = []
                },
            ]
        ) -> (known after apply) # forces replacement
      ~ enable_fault_injection   = false -> (known after apply)
      ~ id                       = "jfp-api-journeys-modern-prod" -> (known after apply)
      ~ revision                 = 17 -> (known after apply)
      - tags                     = {} -> null
      ~ tags_all                 = {} -> (known after apply)
        # (12 unchanged attributes hidden)
    }

  # module.prod.module.api-journeys-modern.module.ecs-task.aws_ssm_parameter.parameters["PG_DATABASE_URL_USERS"] will be created
+ resource "aws_ssm_parameter" "parameters" {
      + arn            = (known after apply)
      + data_type      = (known after apply)
      + has_value_wo   = (known after apply)
      + id             = (known after apply)
      + insecure_value = (known after apply)
      + key_id         = (known after apply)
      + name           = "/ecs/api-journeys/prod/PG_DATABASE_URL_USERS"
      + overwrite      = true
      + region         = "us-east-2"
      + tags           = {
          + "name" = "PG_DATABASE_URL_USERS"
        }
      + tags_all       = {
          + "name" = "PG_DATABASE_URL_USERS"
        }
      + tier           = (known after apply)
      + type           = "SecureString"
      + value          = (sensitive value)
      + value_wo       = (write-only attribute)
      + version        = (known after apply)
    }

  # module.prod.module.arclight.module.ecs-task.aws_ecs_service.ecs_service will be updated in-place
~ resource "aws_ecs_service" "ecs_service" {
      ~ desired_count                      = 4 -> 1
        id                                 = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-prod/arclight-prod-service"
        name                               = "arclight-prod-service"
        tags                               = {}
        # (18 unchanged attributes hidden)

        # (4 unchanged blocks hidden)
    }

  # module.stage.module.api-journeys-modern.module.ecs-task.aws_ecs_service.ecs_service will be updated in-place
~ resource "aws_ecs_service" "ecs_service" {
        id                                 = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-stage/api-journeys-modern-stage-service"
        name                               = "api-journeys-modern-stage-service"
        tags                               = {}
      ~ task_definition                    = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-stage:17" -> (known after apply)
        # (18 unchanged attributes hidden)

        # (4 unchanged blocks hidden)
    }

  # module.stage.module.api-journeys-modern.module.ecs-task.aws_ecs_task_definition.ecs_task_definition must be replaced
+/- resource "aws_ecs_task_definition" "ecs_task_definition" {
      ~ arn                      = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-stage:17" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-stage" -> (known after apply)
      ~ container_definitions    = jsonencode(
            [
              - {
                  - cpu              = 1024
                  - environment      = [
                      - {
                          - name  = "NODE_ENV"
                          - value = "production"
                        },
                      - {
                          - name  = "SERVICE_ENV"
                          - value = "stage"
                        },
                      - {
                          - name  = "SERVICE_NAME"
                          - value = "api-journeys-modern"
                        },
                    ]
                  - essential        = true
                  - image            = "410965620680.dkr.ecr.us-east-2.amazonaws.com/jfp-api-journeys-modern-stage:latest"
                  - logConfiguration = {
                      - logDriver     = "awsfirelens"
                      - options       = {
                          - Host        = "http-intake.logs.datadoghq.com"
                          - Name        = "datadog"
                          - TLS         = "on"
                          - compress    = "gzip"
                          - dd_service  = "api-journeys-modern"
                          - dd_source   = "graphql-yoga"
                          - dd_tags     = "env:stage"
                          - provider    = "ecs"
                          - retry_limit = "2"
                        }
                      - secretOptions = [
                          - {
                              - name      = "apikey"
                              - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                            },
                        ]
                    }
                  - memory           = 2048
                  - mountPoints      = []
                  - name             = "jfp-api-journeys-modern-stage-app"
                  - portMappings     = [
                      - {
                          - containerPort = 4004
                          - hostPort      = 4004
                          - protocol      = "tcp"
                        },
                    ]
                  - secrets          = [
                      - {
                          - name      = "AWS_ACCESS_KEY_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/AWS_ACCESS_KEY_ID"
                        },
                      - {
                          - name      = "AWS_SECRET_ACCESS_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/AWS_SECRET_ACCESS_KEY"
                        },
                      - {
                          - name      = "CLOUDFLARE_UPLOAD_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/CLOUDFLARE_UPLOAD_KEY"
                        },
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                      - {
                          - name      = "FACEBOOK_APP_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/FACEBOOK_APP_ID"
                        },
                      - {
                          - name      = "FACEBOOK_APP_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/FACEBOOK_APP_SECRET"
                        },
                      - {
                          - name      = "FIREBASE_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/FIREBASE_API_KEY"
                        },
                      - {
                          - name      = "GATEWAY_HMAC_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GATEWAY_HMAC_SECRET"
                        },
                      - {
                          - name      = "GATEWAY_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GATEWAY_URL"
                        },
                      - {
                          - name      = "GIT_BRANCH"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GIT_BRANCH"
                        },
                      - {
                          - name      = "GOOGLE_APPLICATION_JSON"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GOOGLE_APPLICATION_JSON"
                        },
                      - {
                          - name      = "GOOGLE_CLIENT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GOOGLE_CLIENT_ID"
                        },
                      - {
                          - name      = "GOOGLE_CLIENT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GOOGLE_CLIENT_SECRET"
                        },
                      - {
                          - name      = "GOOGLE_GENERATIVE_AI_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GOOGLE_GENERATIVE_AI_API_KEY"
                        },
                      - {
                          - name      = "GROWTH_SPACES_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GROWTH_SPACES_URL"
                        },
                      - {
                          - name      = "INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET"
                        },
                      - {
                          - name      = "INTEROP_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/INTEROP_TOKEN"
                        },
                      - {
                          - name      = "JOURNEYS_ADMIN_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/JOURNEYS_ADMIN_URL"
                        },
                      - {
                          - name      = "JOURNEYS_REVALIDATE_ACCESS_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/JOURNEYS_REVALIDATE_ACCESS_TOKEN"
                        },
                      - {
                          - name      = "JOURNEYS_SHORTLINK_DOMAIN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/JOURNEYS_SHORTLINK_DOMAIN"
                        },
                      - {
                          - name      = "JOURNEYS_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/JOURNEYS_URL"
                        },
                      - {
                          - name      = "MAILCHIMP_AUDIENCE_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/MAILCHIMP_AUDIENCE_ID"
                        },
                      - {
                          - name      = "MAILCHIMP_MARKETING_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/MAILCHIMP_MARKETING_API_KEY"
                        },
                      - {
                          - name      = "MAILCHIMP_MARKETING_API_SERVER_PREFIX"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/MAILCHIMP_MARKETING_API_SERVER_PREFIX"
                        },
                      - {
                          - name      = "NAT_ADDRESSES"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/NAT_ADDRESSES"
                        },
                      - {
                          - name      = "OPEN_AI_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/OPEN_AI_API_KEY"
                        },
                      - {
                          - name      = "PG_DATABASE_URL_JOURNEYS"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PG_DATABASE_URL_JOURNEYS"
                        },
                      - {
                          - name      = "PLAUSIBLE_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAUSIBLE_API_KEY"
                        },
                      - {
                          - name      = "PLAUSIBLE_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAUSIBLE_URL"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_2"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_2"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_3"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_3"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_4"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_4"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_5"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_5"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_6"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_6"
                        },
                      - {
                          - name      = "POWER_BI_CLIENT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_CLIENT_ID"
                        },
                      - {
                          - name      = "POWER_BI_CLIENT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_CLIENT_SECRET"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_MULTIPLE_FULL_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_JOURNEYS_MULTIPLE_FULL_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_MULTIPLE_SUMMARY_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_JOURNEYS_MULTIPLE_SUMMARY_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_SINGLE_FULL_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_JOURNEYS_SINGLE_FULL_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_SINGLE_SUMMARY_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_JOURNEYS_SINGLE_SUMMARY_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_TENANT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_TENANT_ID"
                        },
                      - {
                          - name      = "POWER_BI_WORKSPACE_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_WORKSPACE_ID"
                        },
                      - {
                          - name      = "REDIS_PORT"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/REDIS_PORT"
                        },
                      - {
                          - name      = "REDIS_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/REDIS_URL"
                        },
                      - {
                          - name      = "SMTP_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/SMTP_URL"
                        },
                      - {
                          - name      = "VERCEL_JOURNEYS_PROJECT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/VERCEL_JOURNEYS_PROJECT_ID"
                        },
                      - {
                          - name      = "VERCEL_TEAM_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/VERCEL_TEAM_ID"
                        },
                      - {
                          - name      = "VERCEL_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/VERCEL_TOKEN"
                        },
                    ]
                  - systemControls   = []
                  - volumesFrom      = []
                },
              - {
                  - environment       = [
                      - {
                          - name  = "DD_APM_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_APM_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_DOGSTATSD_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_LOGS_INJECTION"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT"
                          - value = "0.0.0.0:4317"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT"
                          - value = "0.0.0.0:4318"
                        },
                      - {
                          - name  = "DD_PROCESS_AGENT_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_PROFILING_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_RUNTIME_METRICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_TAGS"
                          - value = "env:stage app:api-journeys-modern"
                        },
                      - {
                          - name  = "DD_TRACE_ANALYTICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "ECS_FARGATE"
                          - value = "true"
                        },
                    ]
                  - essential         = true
                  - image             = "public.ecr.aws/datadog/agent:latest"
                  - logConfiguration  = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "api-journeys-modern-stage-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation = 128
                  - mountPoints       = []
                  - name              = "jfp-api-journeys-modern-stage-datadog-agent"
                  - portMappings      = [
                      - {
                          - containerPort = 4317
                          - hostPort      = 4317
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 4318
                          - hostPort      = 4318
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 8125
                          - hostPort      = 8125
                          - protocol      = "udp"
                        },
                    ]
                  - secrets           = [
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                    ]
                  - systemControls    = []
                  - volumesFrom       = []
                },
              - {
                  - environment           = []
                  - essential             = true
                  - firelensConfiguration = {
                      - options = {
                          - config-file-type        = "file"
                          - config-file-value       = "/fluent-bit/configs/parse-json.conf"
                          - enable-ecs-log-metadata = "true"
                        }
                      - type    = "fluentbit"
                    }
                  - image                 = "amazon/aws-for-fluent-bit:stable"
                  - logConfiguration      = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "api-journeys-modern-stage-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation     = 100
                  - mountPoints           = []
                  - name                  = "jfp-api-journeys-modern-stage-log-router"
                  - portMappings          = []
                  - systemControls        = []
                  - user                  = "0"
                  - volumesFrom           = []
                },
            ]
        ) -> (known after apply) # forces replacement
      ~ enable_fault_injection   = false -> (known after apply)
      ~ id                       = "jfp-api-journeys-modern-stage" -> (known after apply)
      ~ revision                 = 17 -> (known after apply)
      - tags                     = {} -> null
      ~ tags_all                 = {} -> (known after apply)
        # (12 unchanged attributes hidden)
    }

  # module.stage.module.api-journeys-modern.module.ecs-task.aws_ssm_parameter.parameters["PG_DATABASE_URL_USERS"] will be created
+ resource "aws_ssm_parameter" "parameters" {
      + arn            = (known after apply)
      + data_type      = (known after apply)
      + has_value_wo   = (known after apply)
      + id             = (known after apply)
      + insecure_value = (known after apply)
      + key_id         = (known after apply)
      + name           = "/ecs/api-journeys/stage/PG_DATABASE_URL_USERS"
      + overwrite      = true
      + region         = "us-east-2"
      + tags           = {
          + "name" = "PG_DATABASE_URL_USERS"
        }
      + tags_all       = {
          + "name" = "PG_DATABASE_URL_USERS"
        }
      + tier           = (known after apply)
      + type           = "SecureString"
      + value          = (sensitive value)
      + value_wo       = (write-only attribute)
      + version        = (known after apply)
    }

Plan: 4 to add, 9 to change, 2 to destroy.
╷
│ Warning: Deprecated Resource
│ 
│   with module.datadog.datadog_integration_aws.sandbox,
│   on modules/aws/datadog/main.tf line 118, in resource "datadog_integration_aws" "sandbox":
│  118: resource "datadog_integration_aws" "sandbox" {
│ 
│ **This resource is deprecated - use the `datadog_integration_aws_account`
│ resource instead**:
│ https://registry.terraform.io/providers/DataDog/datadog/latest/docs/resources/integration_aws_account
╵
╷
│ Warning: Deprecated attribute
│ 
│   on .terraform/modules/datadog.datadog_log_forwarder/modules/log_forwarder/main.tf line 2, in locals:
│    2:   bucket_name = var.bucket_name != "" ? var.bucket_name : "datadog-forwarder-${data.aws_caller_identity.current.account_id}-${data.aws_region.current.name}"
│ 
│ The attribute "name" is deprecated. Refer to the provider documentation for
│ details.
│ 
│ (and 2 more similar warnings elsewhere)
╵
  • ▶️ To apply this plan, comment:
    atlantis apply -d infrastructure
  • 🚮 To delete this plan and lock, click here
  • 🔁 To plan this project again, comment:
    atlantis plan -d infrastructure

Note: Objects have changed outside of Terraform
Plan: 4 to add, 9 to change, 2 to destroy.


  • ⏩ To apply all unapplied plans from this Pull Request, comment:
    atlantis apply
  • 🚮 To delete all plans and locks from this Pull Request, comment:
    atlantis unlock

csiyang
csiyang previously approved these changes Jan 15, 2026
@tataihono
Copy link
Contributor

atlantis unlock

@jesus-film-bot
Copy link

All Atlantis locks for this PR have been unlocked and plans discarded

… removing transaction and enabling cascade deletes for related records
@jesus-film-bot
Copy link

Plan Error

cannot run "plan": the default workspace at path . is currently locked for this pull request by "plan".
Wait until the previous command is complete and try again

@mikeallisonJS
Copy link
Collaborator Author

atlantis unlock

@jesus-film-bot
Copy link

All Atlantis locks for this PR have been unlocked and plans discarded

@jesus-film-bot
Copy link

Ran Plan for dir: infrastructure workspace: default

Show Output
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create
~ update in-place
- destroy
+/- create replacement and then destroy

Terraform will perform the following actions:

  # module.prod.module.eks.aws_eks_node_group.az_2a_ondemand will be updated in-place
~ resource "aws_eks_node_group" "az_2a_ondemand" {
        id                     = "jfp-eks-prod:jfp-eks-node-group-2a-prod"
        tags                   = {}
        # (17 unchanged attributes hidden)

      ~ scaling_config {
          ~ desired_size = 3 -> 2
          ~ max_size     = 5 -> 4
          ~ min_size     = 3 -> 2
        }

        # (2 unchanged blocks hidden)
    }

  # module.prod.module.postgresql.aws_rds_cluster.default will be updated in-place
~ resource "aws_rds_cluster" "default" {
      + enable_local_write_forwarding         = false
      ~ engine_version                        = "13.20" -> "13.18"
        id                                    = "jfp-core-prod"
        tags                                  = {}
        # (59 unchanged attributes hidden)

        # (1 unchanged block hidden)
    }

  # module.prod.module.postgresql.aws_rds_cluster_instance.default will be updated in-place
~ resource "aws_rds_cluster_instance" "default" {
      ~ engine_version                        = "13.20" -> "13.18"
      + force_destroy                         = false
        id                                    = "tf-20240604195536182300000003"
        tags                                  = {}
        # (32 unchanged attributes hidden)
    }

  # module.stage.module.eks.aws_eks_node_group.az_2a_ondemand will be updated in-place
~ resource "aws_eks_node_group" "az_2a_ondemand" {
        id                     = "jfp-eks-stage:jfp-eks-node-group-2a-stage"
        tags                   = {}
        # (17 unchanged attributes hidden)

      ~ scaling_config {
          ~ desired_size = 3 -> 2
          ~ max_size     = 5 -> 4
          ~ min_size     = 3 -> 2
        }

        # (2 unchanged blocks hidden)
    }

  # module.stage.module.postgresql.aws_rds_cluster.default will be updated in-place
~ resource "aws_rds_cluster" "default" {
      + enable_local_write_forwarding         = false
      ~ engine_version                        = "13.20" -> "13.18"
        id                                    = "jfp-core-stage"
        tags                                  = {}
        # (59 unchanged attributes hidden)

        # (1 unchanged block hidden)
    }

  # module.stage.module.postgresql.aws_rds_cluster_instance.default will be updated in-place
~ resource "aws_rds_cluster_instance" "default" {
      ~ engine_version                        = "13.20" -> "13.18"
      + force_destroy                         = false
        id                                    = "tf-20240618004835876400000003"
        tags                                  = {}
        # (32 unchanged attributes hidden)
    }

  # module.prod.module.api-journeys-modern.module.ecs-task.aws_ecs_service.ecs_service will be updated in-place
~ resource "aws_ecs_service" "ecs_service" {
        id                                 = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-prod/api-journeys-modern-prod-service"
        name                               = "api-journeys-modern-prod-service"
        tags                               = {}
      ~ task_definition                    = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-prod:17" -> (known after apply)
        # (18 unchanged attributes hidden)

        # (4 unchanged blocks hidden)
    }

  # module.prod.module.api-journeys-modern.module.ecs-task.aws_ecs_task_definition.ecs_task_definition must be replaced
+/- resource "aws_ecs_task_definition" "ecs_task_definition" {
      ~ arn                      = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-prod:17" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-prod" -> (known after apply)
      ~ container_definitions    = jsonencode(
            [
              - {
                  - cpu              = 1024
                  - environment      = [
                      - {
                          - name  = "NODE_ENV"
                          - value = "production"
                        },
                      - {
                          - name  = "SERVICE_ENV"
                          - value = "prod"
                        },
                      - {
                          - name  = "SERVICE_NAME"
                          - value = "api-journeys-modern"
                        },
                    ]
                  - essential        = true
                  - image            = "410965620680.dkr.ecr.us-east-2.amazonaws.com/jfp-api-journeys-modern-prod:latest"
                  - logConfiguration = {
                      - logDriver     = "awsfirelens"
                      - options       = {
                          - Host        = "http-intake.logs.datadoghq.com"
                          - Name        = "datadog"
                          - TLS         = "on"
                          - compress    = "gzip"
                          - dd_service  = "api-journeys-modern"
                          - dd_source   = "graphql-yoga"
                          - dd_tags     = "env:prod"
                          - provider    = "ecs"
                          - retry_limit = "2"
                        }
                      - secretOptions = [
                          - {
                              - name      = "apikey"
                              - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                            },
                        ]
                    }
                  - memory           = 2048
                  - mountPoints      = []
                  - name             = "jfp-api-journeys-modern-prod-app"
                  - portMappings     = [
                      - {
                          - containerPort = 4004
                          - hostPort      = 4004
                          - protocol      = "tcp"
                        },
                    ]
                  - secrets          = [
                      - {
                          - name      = "AWS_ACCESS_KEY_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/AWS_ACCESS_KEY_ID"
                        },
                      - {
                          - name      = "AWS_SECRET_ACCESS_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/AWS_SECRET_ACCESS_KEY"
                        },
                      - {
                          - name      = "CLOUDFLARE_UPLOAD_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/CLOUDFLARE_UPLOAD_KEY"
                        },
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                      - {
                          - name      = "FACEBOOK_APP_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/FACEBOOK_APP_ID"
                        },
                      - {
                          - name      = "FACEBOOK_APP_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/FACEBOOK_APP_SECRET"
                        },
                      - {
                          - name      = "FIREBASE_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/FIREBASE_API_KEY"
                        },
                      - {
                          - name      = "GATEWAY_HMAC_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GATEWAY_HMAC_SECRET"
                        },
                      - {
                          - name      = "GATEWAY_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GATEWAY_URL"
                        },
                      - {
                          - name      = "GIT_BRANCH"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GIT_BRANCH"
                        },
                      - {
                          - name      = "GOOGLE_APPLICATION_JSON"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GOOGLE_APPLICATION_JSON"
                        },
                      - {
                          - name      = "GOOGLE_CLIENT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GOOGLE_CLIENT_ID"
                        },
                      - {
                          - name      = "GOOGLE_CLIENT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GOOGLE_CLIENT_SECRET"
                        },
                      - {
                          - name      = "GOOGLE_GENERATIVE_AI_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GOOGLE_GENERATIVE_AI_API_KEY"
                        },
                      - {
                          - name      = "GROWTH_SPACES_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GROWTH_SPACES_URL"
                        },
                      - {
                          - name      = "INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET"
                        },
                      - {
                          - name      = "INTEROP_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/INTEROP_TOKEN"
                        },
                      - {
                          - name      = "JOURNEYS_ADMIN_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/JOURNEYS_ADMIN_URL"
                        },
                      - {
                          - name      = "JOURNEYS_REVALIDATE_ACCESS_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/JOURNEYS_REVALIDATE_ACCESS_TOKEN"
                        },
                      - {
                          - name      = "JOURNEYS_SHORTLINK_DOMAIN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/JOURNEYS_SHORTLINK_DOMAIN"
                        },
                      - {
                          - name      = "JOURNEYS_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/JOURNEYS_URL"
                        },
                      - {
                          - name      = "MAILCHIMP_AUDIENCE_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/MAILCHIMP_AUDIENCE_ID"
                        },
                      - {
                          - name      = "MAILCHIMP_MARKETING_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/MAILCHIMP_MARKETING_API_KEY"
                        },
                      - {
                          - name      = "MAILCHIMP_MARKETING_API_SERVER_PREFIX"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/MAILCHIMP_MARKETING_API_SERVER_PREFIX"
                        },
                      - {
                          - name      = "NAT_ADDRESSES"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/NAT_ADDRESSES"
                        },
                      - {
                          - name      = "OPEN_AI_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/OPEN_AI_API_KEY"
                        },
                      - {
                          - name      = "PG_DATABASE_URL_JOURNEYS"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PG_DATABASE_URL_JOURNEYS"
                        },
                      - {
                          - name      = "PLAUSIBLE_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAUSIBLE_API_KEY"
                        },
                      - {
                          - name      = "PLAUSIBLE_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAUSIBLE_URL"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_2"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_2"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_3"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_3"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_4"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_4"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_5"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_5"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_6"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_6"
                        },
                      - {
                          - name      = "POWER_BI_CLIENT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_CLIENT_ID"
                        },
                      - {
                          - name      = "POWER_BI_CLIENT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_CLIENT_SECRET"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_MULTIPLE_FULL_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_JOURNEYS_MULTIPLE_FULL_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_MULTIPLE_SUMMARY_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_JOURNEYS_MULTIPLE_SUMMARY_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_SINGLE_FULL_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_JOURNEYS_SINGLE_FULL_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_SINGLE_SUMMARY_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_JOURNEYS_SINGLE_SUMMARY_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_TENANT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_TENANT_ID"
                        },
                      - {
                          - name      = "POWER_BI_WORKSPACE_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_WORKSPACE_ID"
                        },
                      - {
                          - name      = "REDIS_PORT"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/REDIS_PORT"
                        },
                      - {
                          - name      = "REDIS_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/REDIS_URL"
                        },
                      - {
                          - name      = "SMTP_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/SMTP_URL"
                        },
                      - {
                          - name      = "VERCEL_JOURNEYS_PROJECT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/VERCEL_JOURNEYS_PROJECT_ID"
                        },
                      - {
                          - name      = "VERCEL_TEAM_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/VERCEL_TEAM_ID"
                        },
                      - {
                          - name      = "VERCEL_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/VERCEL_TOKEN"
                        },
                    ]
                  - systemControls   = []
                  - volumesFrom      = []
                },
              - {
                  - environment       = [
                      - {
                          - name  = "DD_APM_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_APM_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_DOGSTATSD_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_LOGS_INJECTION"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT"
                          - value = "0.0.0.0:4317"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT"
                          - value = "0.0.0.0:4318"
                        },
                      - {
                          - name  = "DD_PROCESS_AGENT_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_PROFILING_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_RUNTIME_METRICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_TAGS"
                          - value = "env:prod app:api-journeys-modern"
                        },
                      - {
                          - name  = "DD_TRACE_ANALYTICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "ECS_FARGATE"
                          - value = "true"
                        },
                    ]
                  - essential         = true
                  - image             = "public.ecr.aws/datadog/agent:latest"
                  - logConfiguration  = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "api-journeys-modern-prod-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation = 128
                  - mountPoints       = []
                  - name              = "jfp-api-journeys-modern-prod-datadog-agent"
                  - portMappings      = [
                      - {
                          - containerPort = 4317
                          - hostPort      = 4317
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 4318
                          - hostPort      = 4318
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 8125
                          - hostPort      = 8125
                          - protocol      = "udp"
                        },
                    ]
                  - secrets           = [
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                    ]
                  - systemControls    = []
                  - volumesFrom       = []
                },
              - {
                  - environment           = []
                  - essential             = true
                  - firelensConfiguration = {
                      - options = {
                          - config-file-type        = "file"
                          - config-file-value       = "/fluent-bit/configs/parse-json.conf"
                          - enable-ecs-log-metadata = "true"
                        }
                      - type    = "fluentbit"
                    }
                  - image                 = "amazon/aws-for-fluent-bit:stable"
                  - logConfiguration      = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "api-journeys-modern-prod-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation     = 100
                  - mountPoints           = []
                  - name                  = "jfp-api-journeys-modern-prod-log-router"
                  - portMappings          = []
                  - systemControls        = []
                  - user                  = "0"
                  - volumesFrom           = []
                },
            ]
        ) -> (known after apply) # forces replacement
      ~ enable_fault_injection   = false -> (known after apply)
      ~ id                       = "jfp-api-journeys-modern-prod" -> (known after apply)
      ~ revision                 = 17 -> (known after apply)
      - tags                     = {} -> null
      ~ tags_all                 = {} -> (known after apply)
        # (12 unchanged attributes hidden)
    }

  # module.prod.module.api-journeys-modern.module.ecs-task.aws_ssm_parameter.parameters["PG_DATABASE_URL_USERS"] will be created
+ resource "aws_ssm_parameter" "parameters" {
      + arn            = (known after apply)
      + data_type      = (known after apply)
      + has_value_wo   = (known after apply)
      + id             = (known after apply)
      + insecure_value = (known after apply)
      + key_id         = (known after apply)
      + name           = "/ecs/api-journeys/prod/PG_DATABASE_URL_USERS"
      + overwrite      = true
      + region         = "us-east-2"
      + tags           = {
          + "name" = "PG_DATABASE_URL_USERS"
        }
      + tags_all       = {
          + "name" = "PG_DATABASE_URL_USERS"
        }
      + tier           = (known after apply)
      + type           = "SecureString"
      + value          = (sensitive value)
      + value_wo       = (write-only attribute)
      + version        = (known after apply)
    }

  # module.prod.module.arclight.module.ecs-task.aws_ecs_service.ecs_service will be updated in-place
~ resource "aws_ecs_service" "ecs_service" {
      ~ desired_count                      = 3 -> 1
        id                                 = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-prod/arclight-prod-service"
        name                               = "arclight-prod-service"
        tags                               = {}
        # (18 unchanged attributes hidden)

        # (4 unchanged blocks hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_alb_listener_rule.alb_listener_rule will be destroyed
  # (because aws_alb_listener_rule.alb_listener_rule is not in configuration)
- resource "aws_alb_listener_rule" "alb_listener_rule" {
      - arn          = "arn:aws:elasticloadbalancing:us-east-2:410965620680:listener-rule/app/jfp-public-alb-prod/7cf1f0916ed2c660/baff3356faf3dfae/02c9778953c343ed" -> null
      - id           = "arn:aws:elasticloadbalancing:us-east-2:410965620680:listener-rule/app/jfp-public-alb-prod/7cf1f0916ed2c660/baff3356faf3dfae/02c9778953c343ed" -> null
      - listener_arn = "arn:aws:elasticloadbalancing:us-east-2:410965620680:listener/app/jfp-public-alb-prod/7cf1f0916ed2c660/baff3356faf3dfae" -> null
      - priority     = 4 -> null
      - region       = "us-east-2" -> null
      - tags         = {} -> null
      - tags_all     = {} -> null

      - action {
          - order            = 1 -> null
          - target_group_arn = "arn:aws:elasticloadbalancing:us-east-2:410965620680:targetgroup/cms-prod-tg/558eae36912ff7d4" -> null
          - type             = "forward" -> null
        }

      - condition {
          - host_header {
              - values = [
                  - "cms.jesusfilm.org",
                ] -> null
            }
        }
    }

  # module.prod.module.cms.module.ecs-task.aws_alb_target_group.alb_target_group will be destroyed
  # (because aws_alb_target_group.alb_target_group is not in configuration)
- resource "aws_alb_target_group" "alb_target_group" {
      - arn                                = "arn:aws:elasticloadbalancing:us-east-2:410965620680:targetgroup/cms-prod-tg/558eae36912ff7d4" -> null
      - arn_suffix                         = "targetgroup/cms-prod-tg/558eae36912ff7d4" -> null
      - deregistration_delay               = "300" -> null
      - id                                 = "arn:aws:elasticloadbalancing:us-east-2:410965620680:targetgroup/cms-prod-tg/558eae36912ff7d4" -> null
      - ip_address_type                    = "ipv4" -> null
      - lambda_multi_value_headers_enabled = false -> null
      - load_balancer_arns                 = [
          - "arn:aws:elasticloadbalancing:us-east-2:410965620680:loadbalancer/app/jfp-public-alb-prod/7cf1f0916ed2c660",
        ] -> null
      - load_balancing_algorithm_type      = "round_robin" -> null
      - load_balancing_anomaly_mitigation  = "off" -> null
      - load_balancing_cross_zone_enabled  = "use_load_balancer_configuration" -> null
      - name                               = "cms-prod-tg" -> null
      - port                               = 1337 -> null
      - protocol                           = "HTTP" -> null
      - protocol_version                   = "HTTP1" -> null
      - proxy_protocol_v2                  = false -> null
      - region                             = "us-east-2" -> null
      - slow_start                         = 0 -> null
      - tags                               = {} -> null
      - tags_all                           = {} -> null
      - target_type                        = "ip" -> null
      - vpc_id                             = "vpc-0b722b0a1f7789afd" -> null
        # (1 unchanged attribute hidden)

      - health_check {
          - enabled             = true -> null
          - healthy_threshold   = 2 -> null
          - interval            = 10 -> null
          - matcher             = "200" -> null
          - path                = "/_health" -> null
          - port                = "1337" -> null
          - protocol            = "HTTP" -> null
          - timeout             = 4 -> null
          - unhealthy_threshold = 4 -> null
        }

      - stickiness {
          - cookie_duration = 86400 -> null
          - enabled         = false -> null
          - type            = "lb_cookie" -> null
            # (1 unchanged attribute hidden)
        }

      - target_failover {}

      - target_group_health {
          - dns_failover {
              - minimum_healthy_targets_count      = "1" -> null
              - minimum_healthy_targets_percentage = "off" -> null
            }
          - unhealthy_state_routing {
              - minimum_healthy_targets_count      = 1 -> null
              - minimum_healthy_targets_percentage = "off" -> null
            }
        }

      - target_health_state {}
    }

  # module.prod.module.cms.module.ecs-task.aws_appautoscaling_policy.ecs_policy_cpu will be destroyed
  # (because aws_appautoscaling_policy.ecs_policy_cpu is not in configuration)
- resource "aws_appautoscaling_policy" "ecs_policy_cpu" {
      - alarm_arns         = [
          - "arn:aws:cloudwatch:us-east-2:410965620680:alarm:TargetTracking-service/jfp-ecs-cluster-prod/cms-prod-service-AlarmHigh-423543b4-a52a-4c87-99b4-7e7e0a98aec9",
          - "arn:aws:cloudwatch:us-east-2:410965620680:alarm:TargetTracking-service/jfp-ecs-cluster-prod/cms-prod-service-AlarmLow-fc30a017-257e-47ad-a23f-bb14a2c99fbc",
        ] -> null
      - arn                = "arn:aws:autoscaling:us-east-2:410965620680:scalingPolicy:83ba10e2-c834-400f-b131-aebaa29887df:resource/ecs/service/jfp-ecs-cluster-prod/cms-prod-service:policyName/jfp-cpu-autoscaling-prod" -> null
      - id                 = "jfp-cpu-autoscaling-prod" -> null
      - name               = "jfp-cpu-autoscaling-prod" -> null
      - policy_type        = "TargetTrackingScaling" -> null
      - region             = "us-east-2" -> null
      - resource_id        = "service/jfp-ecs-cluster-prod/cms-prod-service" -> null
      - scalable_dimension = "ecs:service:DesiredCount" -> null
      - service_namespace  = "ecs" -> null

      - target_tracking_scaling_policy_configuration {
          - disable_scale_in   = false -> null
          - scale_in_cooldown  = 0 -> null
          - scale_out_cooldown = 0 -> null
          - target_value       = 75 -> null

          - predefined_metric_specification {
              - predefined_metric_type = "ECSServiceAverageCPUUtilization" -> null
                # (1 unchanged attribute hidden)
            }
        }
    }

  # module.prod.module.cms.module.ecs-task.aws_appautoscaling_policy.ecs_policy_memory will be destroyed
  # (because aws_appautoscaling_policy.ecs_policy_memory is not in configuration)
- resource "aws_appautoscaling_policy" "ecs_policy_memory" {
      - alarm_arns         = [
          - "arn:aws:cloudwatch:us-east-2:410965620680:alarm:TargetTracking-service/jfp-ecs-cluster-prod/cms-prod-service-AlarmHigh-1cb3c0eb-9913-447e-80e7-798fed5d7748",
          - "arn:aws:cloudwatch:us-east-2:410965620680:alarm:TargetTracking-service/jfp-ecs-cluster-prod/cms-prod-service-AlarmLow-e40df7e0-6368-4805-8d91-cea2a5e171a2",
        ] -> null
      - arn                = "arn:aws:autoscaling:us-east-2:410965620680:scalingPolicy:83ba10e2-c834-400f-b131-aebaa29887df:resource/ecs/service/jfp-ecs-cluster-prod/cms-prod-service:policyName/jfp-memory-autoscaling-prod" -> null
      - id                 = "jfp-memory-autoscaling-prod" -> null
      - name               = "jfp-memory-autoscaling-prod" -> null
      - policy_type        = "TargetTrackingScaling" -> null
      - region             = "us-east-2" -> null
      - resource_id        = "service/jfp-ecs-cluster-prod/cms-prod-service" -> null
      - scalable_dimension = "ecs:service:DesiredCount" -> null
      - service_namespace  = "ecs" -> null

      - target_tracking_scaling_policy_configuration {
          - disable_scale_in   = false -> null
          - scale_in_cooldown  = 0 -> null
          - scale_out_cooldown = 0 -> null
          - target_value       = 75 -> null

          - predefined_metric_specification {
              - predefined_metric_type = "ECSServiceAverageMemoryUtilization" -> null
                # (1 unchanged attribute hidden)
            }
        }
    }

  # module.prod.module.cms.module.ecs-task.aws_appautoscaling_target.service_autoscaling will be destroyed
  # (because aws_appautoscaling_target.service_autoscaling is not in configuration)
- resource "aws_appautoscaling_target" "service_autoscaling" {
      - arn                = "arn:aws:application-autoscaling:us-east-2:410965620680:scalable-target/0ec583ba10e2c834400fb131aebaa29887df" -> null
      - id                 = "service/jfp-ecs-cluster-prod/cms-prod-service" -> null
      - max_capacity       = 4 -> null
      - min_capacity       = 1 -> null
      - region             = "us-east-2" -> null
      - resource_id        = "service/jfp-ecs-cluster-prod/cms-prod-service" -> null
      - role_arn           = "arn:aws:iam::410965620680:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService" -> null
      - scalable_dimension = "ecs:service:DesiredCount" -> null
      - service_namespace  = "ecs" -> null
      - tags               = {} -> null
      - tags_all           = {} -> null

      - suspended_state {
          - dynamic_scaling_in_suspended  = false -> null
          - dynamic_scaling_out_suspended = false -> null
          - scheduled_scaling_suspended   = false -> null
        }
    }

  # module.prod.module.cms.module.ecs-task.aws_cloudwatch_log_group.ecs_cw_log_group will be destroyed
  # (because aws_cloudwatch_log_group.ecs_cw_log_group is not in configuration)
- resource "aws_cloudwatch_log_group" "ecs_cw_log_group" {
      - arn               = "arn:aws:logs:us-east-2:410965620680:log-group:cms-prod-logs" -> null
      - id                = "cms-prod-logs" -> null
      - log_group_class   = "STANDARD" -> null
      - name              = "cms-prod-logs" -> null
      - region            = "us-east-2" -> null
      - retention_in_days = 0 -> null
      - skip_destroy      = false -> null
      - tags              = {} -> null
      - tags_all          = {} -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_ecr_lifecycle_policy.ecr_policy will be destroyed
  # (because aws_ecr_lifecycle_policy.ecr_policy is not in configuration)
- resource "aws_ecr_lifecycle_policy" "ecr_policy" {
      - id          = "jfp-cms-prod" -> null
      - policy      = jsonencode(
            {
              - rules = [
                  - {
                      - action       = {
                          - type = "expire"
                        }
                      - description  = "Expire more than 10 images"
                      - rulePriority = 1
                      - selection    = {
                          - countNumber = 10
                          - countType   = "imageCountMoreThan"
                          - tagStatus   = "any"
                        }
                    },
                ]
            }
        ) -> null
      - region      = "us-east-2" -> null
      - registry_id = "410965620680" -> null
      - repository  = "jfp-cms-prod" -> null
    }

  # module.prod.module.cms.module.ecs-task.aws_ecr_repository.ecr_repository will be destroyed
  # (because aws_ecr_repository.ecr_repository is not in configuration)
- resource "aws_ecr_repository" "ecr_repository" {
      - arn                  = "arn:aws:ecr:us-east-2:410965620680:repository/jfp-cms-prod" -> null
      - id                   = "jfp-cms-prod" -> null
      - image_tag_mutability = "MUTABLE" -> null
      - name                 = "jfp-cms-prod" -> null
      - region               = "us-east-2" -> null
      - registry_id          = "410965620680" -> null
      - repository_url       = "410965620680.dkr.ecr.us-east-2.amazonaws.com/jfp-cms-prod" -> null
      - tags                 = {} -> null
      - tags_all             = {} -> null

      - encryption_configuration {
          - encryption_type = "AES256" -> null
            # (1 unchanged attribute hidden)
        }

      - image_scanning_configuration {
          - scan_on_push = false -> null
        }
    }

  # module.prod.module.cms.module.ecs-task.aws_ecs_service.ecs_service will be destroyed
  # (because aws_ecs_service.ecs_service is not in configuration)
- resource "aws_ecs_service" "ecs_service" {
      - arn                                = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-prod/cms-prod-service" -> null
      - availability_zone_rebalancing      = "DISABLED" -> null
      - cluster                            = "arn:aws:ecs:us-east-2:410965620680:cluster/jfp-ecs-cluster-prod" -> null
      - deployment_maximum_percent         = 200 -> null
      - deployment_minimum_healthy_percent = 100 -> null
      - desired_count                      = 1 -> null
      - enable_ecs_managed_tags            = false -> null
      - enable_execute_command             = true -> null
      - health_check_grace_period_seconds  = 0 -> null
      - iam_role                           = "/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS" -> null
      - id                                 = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-prod/cms-prod-service" -> null
      - launch_type                        = "FARGATE" -> null
      - name                               = "cms-prod-service" -> null
      - platform_version                   = "LATEST" -> null
      - propagate_tags                     = "NONE" -> null
      - region                             = "us-east-2" -> null
      - scheduling_strategy                = "REPLICA" -> null
      - tags                               = {} -> null
      - tags_all                           = {} -> null
      - task_definition                    = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-cms-prod:1" -> null
      - triggers                           = {} -> null
      - wait_for_steady_state              = false -> null

      - deployment_circuit_breaker {
          - enable   = false -> null
          - rollback = false -> null
        }

      - deployment_controller {
          - type = "ECS" -> null
        }

      - load_balancer {
          - container_name   = "jfp-cms-prod-app" -> null
          - container_port   = 1337 -> null
          - target_group_arn = "arn:aws:elasticloadbalancing:us-east-2:410965620680:targetgroup/cms-prod-tg/558eae36912ff7d4" -> null
            # (1 unchanged attribute hidden)
        }

      - network_configuration {
          - assign_public_ip = true -> null
          - security_groups  = [
              - "sg-030c49feae781c660",
            ] -> null
          - subnets          = [
              - "subnet-01aa708571a3e499c",
              - "subnet-0aa10af01283bbcdb",
              - "subnet-0b7c1e14af0ffb3ea",
            ] -> null
        }
    }

  # module.prod.module.cms.module.ecs-task.aws_ecs_task_definition.ecs_task_definition will be destroyed
  # (because aws_ecs_task_definition.ecs_task_definition is not in configuration)
- resource "aws_ecs_task_definition" "ecs_task_definition" {
      - arn                      = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-cms-prod:1" -> null
      - arn_without_revision     = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-cms-prod" -> null
      - container_definitions    = jsonencode(
            [
              - {
                  - cpu              = 1024
                  - environment      = [
                      - {
                          - name  = "NODE_ENV"
                          - value = "production"
                        },
                      - {
                          - name  = "SERVICE_ENV"
                          - value = "prod"
                        },
                      - {
                          - name  = "SERVICE_NAME"
                          - value = "cms"
                        },
                    ]
                  - essential        = true
                  - image            = "410965620680.dkr.ecr.us-east-2.amazonaws.com/jfp-cms-prod:latest"
                  - logConfiguration = {
                      - logDriver     = "awsfirelens"
                      - options       = {
                          - Host        = "http-intake.logs.datadoghq.com"
                          - Name        = "datadog"
                          - TLS         = "on"
                          - compress    = "gzip"
                          - dd_service  = "cms"
                          - dd_source   = "strapi"
                          - dd_tags     = "env:prod"
                          - provider    = "ecs"
                          - retry_limit = "2"
                        }
                      - secretOptions = [
                          - {
                              - name      = "apikey"
                              - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                            },
                        ]
                    }
                  - memory           = 2048
                  - mountPoints      = []
                  - name             = "jfp-cms-prod-app"
                  - portMappings     = [
                      - {
                          - containerPort = 1337
                          - hostPort      = 1337
                          - protocol      = "tcp"
                        },
                    ]
                  - secrets          = [
                      - {
                          - name      = "ADMIN_JWT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/ADMIN_JWT_SECRET"
                        },
                      - {
                          - name      = "API_TOKEN_SALT"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/API_TOKEN_SALT"
                        },
                      - {
                          - name      = "APP_KEYS"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/APP_KEYS"
                        },
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                      - {
                          - name      = "ENCRYPTION_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/ENCRYPTION_KEY"
                        },
                      - {
                          - name      = "MUX_ACCESS_TOKEN_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/MUX_ACCESS_TOKEN_ID"
                        },
                      - {
                          - name      = "MUX_PLAYBACK_SIGNING_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/MUX_PLAYBACK_SIGNING_ID"
                        },
                      - {
                          - name      = "MUX_PLAYBACK_SIGNING_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/MUX_PLAYBACK_SIGNING_SECRET"
                        },
                      - {
                          - name      = "MUX_SECRET_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/MUX_SECRET_KEY"
                        },
                      - {
                          - name      = "MUX_WEBHOOK_SIGNING_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/MUX_WEBHOOK_SIGNING_SECRET"
                        },
                      - {
                          - name      = "PG_DATABASE_URL_CMS"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/PG_DATABASE_URL_CMS"
                        },
                      - {
                          - name      = "TRANSFER_TOKEN_SALT"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/TRANSFER_TOKEN_SALT"
                        },
                    ]
                  - systemControls   = []
                  - volumesFrom      = []
                },
              - {
                  - environment       = [
                      - {
                          - name  = "DD_APM_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_APM_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_DOGSTATSD_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_LOGS_INJECTION"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT"
                          - value = "0.0.0.0:4317"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT"
                          - value = "0.0.0.0:4318"
                        },
                      - {
                          - name  = "DD_PROCESS_AGENT_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_PROFILING_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_RUNTIME_METRICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_TAGS"
                          - value = "env:prod app:cms"
                        },
                      - {
                          - name  = "DD_TRACE_ANALYTICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "ECS_FARGATE"
                          - value = "true"
                        },
                    ]
                  - essential         = true
                  - image             = "public.ecr.aws/datadog/agent:latest"
                  - logConfiguration  = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "cms-prod-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation = 128
                  - mountPoints       = []
                  - name              = "jfp-cms-prod-datadog-agent"
                  - portMappings      = [
                      - {
                          - containerPort = 4317
                          - hostPort      = 4317
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 4318
                          - hostPort      = 4318
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 8125
                          - hostPort      = 8125
                          - protocol      = "udp"
                        },
                    ]
                  - secrets           = [
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                    ]
                  - systemControls    = []
                  - volumesFrom       = []
                },
              - {
                  - environment           = []
                  - essential             = true
                  - firelensConfiguration = {
                      - options = {
                          - config-file-type        = "file"
                          - config-file-value       = "/fluent-bit/configs/parse-json.conf"
                          - enable-ecs-log-metadata = "true"
                        }
                      - type    = "fluentbit"
                    }
                  - image                 = "amazon/aws-for-fluent-bit:stable"
                  - logConfiguration      = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "cms-prod-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation     = 100
                  - mountPoints           = []
                  - name                  = "jfp-cms-prod-log-router"
                  - portMappings          = []
                  - systemControls        = []
                  - user                  = "0"
                  - volumesFrom           = []
                },
            ]
        ) -> null
      - cpu                      = "1024" -> null
      - enable_fault_injection   = false -> null
      - execution_role_arn       = "arn:aws:iam::410965620680:role/jfp-ecs-task-execution-role" -> null
      - family                   = "jfp-cms-prod" -> null
      - id                       = "jfp-cms-prod" -> null
      - memory                   = "2048" -> null
      - network_mode             = "awsvpc" -> null
      - region                   = "us-east-2" -> null
      - requires_compatibilities = [
          - "FARGATE",
        ] -> null
      - revision                 = 1 -> null
      - skip_destroy             = false -> null
      - tags                     = {} -> null
      - tags_all                 = {} -> null
      - task_role_arn            = "arn:aws:iam::410965620680:role/terraform-ecs-task-role-prod" -> null
      - track_latest             = false -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_route53_record.record will be destroyed
  # (because aws_route53_record.record is not in configuration)
- resource "aws_route53_record" "record" {
      - fqdn                             = "cms.central.jesusfilm.org" -> null
      - id                               = "Z06687872LMUIKS0Y291P_cms_CNAME" -> null
      - multivalue_answer_routing_policy = false -> null
      - name                             = "cms" -> null
      - records                          = [
          - "jfp-public-alb-prod-13771523.us-east-2.elb.amazonaws.com",
        ] -> null
      - ttl                              = 300 -> null
      - type                             = "CNAME" -> null
      - zone_id                          = "Z06687872LMUIKS0Y291P" -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_ssm_parameter.parameters["ADMIN_JWT_SECRET"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/ADMIN_JWT_SECRET" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/prod/ADMIN_JWT_SECRET" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/prod/ADMIN_JWT_SECRET" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "ADMIN_JWT_SECRET"
        } -> null
      - tags_all        = {
          - "name" = "ADMIN_JWT_SECRET"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_ssm_parameter.parameters["API_TOKEN_SALT"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/API_TOKEN_SALT" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/prod/API_TOKEN_SALT" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/prod/API_TOKEN_SALT" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "API_TOKEN_SALT"
        } -> null
      - tags_all        = {
          - "name" = "API_TOKEN_SALT"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_ssm_parameter.parameters["APP_KEYS"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/APP_KEYS" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/prod/APP_KEYS" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/prod/APP_KEYS" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "APP_KEYS"
        } -> null
      - tags_all        = {
          - "name" = "APP_KEYS"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_ssm_parameter.parameters["ENCRYPTION_KEY"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/ENCRYPTION_KEY" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/prod/ENCRYPTION_KEY" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/prod/ENCRYPTION_KEY" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "ENCRYPTION_KEY"
        } -> null
      - tags_all        = {
          - "name" = "ENCRYPTION_KEY"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_ssm_parameter.parameters["MUX_ACCESS_TOKEN_ID"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/MUX_ACCESS_TOKEN_ID" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/prod/MUX_ACCESS_TOKEN_ID" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/prod/MUX_ACCESS_TOKEN_ID" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "MUX_ACCESS_TOKEN_ID"
        } -> null
      - tags_all        = {
          - "name" = "MUX_ACCESS_TOKEN_ID"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_ssm_parameter.parameters["MUX_PLAYBACK_SIGNING_ID"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/MUX_PLAYBACK_SIGNING_ID" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/prod/MUX_PLAYBACK_SIGNING_ID" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/prod/MUX_PLAYBACK_SIGNING_ID" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "MUX_PLAYBACK_SIGNING_ID"
        } -> null
      - tags_all        = {
          - "name" = "MUX_PLAYBACK_SIGNING_ID"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_ssm_parameter.parameters["MUX_PLAYBACK_SIGNING_SECRET"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/MUX_PLAYBACK_SIGNING_SECRET" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/prod/MUX_PLAYBACK_SIGNING_SECRET" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/prod/MUX_PLAYBACK_SIGNING_SECRET" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "MUX_PLAYBACK_SIGNING_SECRET"
        } -> null
      - tags_all        = {
          - "name" = "MUX_PLAYBACK_SIGNING_SECRET"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_ssm_parameter.parameters["MUX_SECRET_KEY"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/MUX_SECRET_KEY" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/prod/MUX_SECRET_KEY" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/prod/MUX_SECRET_KEY" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "MUX_SECRET_KEY"
        } -> null
      - tags_all        = {
          - "name" = "MUX_SECRET_KEY"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_ssm_parameter.parameters["MUX_WEBHOOK_SIGNING_SECRET"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/MUX_WEBHOOK_SIGNING_SECRET" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/prod/MUX_WEBHOOK_SIGNING_SECRET" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/prod/MUX_WEBHOOK_SIGNING_SECRET" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "MUX_WEBHOOK_SIGNING_SECRET"
        } -> null
      - tags_all        = {
          - "name" = "MUX_WEBHOOK_SIGNING_SECRET"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_ssm_parameter.parameters["PG_DATABASE_URL_CMS"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/PG_DATABASE_URL_CMS" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/prod/PG_DATABASE_URL_CMS" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/prod/PG_DATABASE_URL_CMS" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "PG_DATABASE_URL_CMS"
        } -> null
      - tags_all        = {
          - "name" = "PG_DATABASE_URL_CMS"
        } -> null
      - ti

Warning: Output length greater than max comment size. Continued in next comment.

@jesus-film-bot
Copy link

Continued plan output from previous comment.

Show Output
er            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 3 -> null
        # (2 unchanged attributes hidden)
    }

  # module.prod.module.cms.module.ecs-task.aws_ssm_parameter.parameters["TRANSFER_TOKEN_SALT"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/prod/TRANSFER_TOKEN_SALT" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/prod/TRANSFER_TOKEN_SALT" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/prod/TRANSFER_TOKEN_SALT" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "TRANSFER_TOKEN_SALT"
        } -> null
      - tags_all        = {
          - "name" = "TRANSFER_TOKEN_SALT"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.api-journeys-modern.module.ecs-task.aws_ecs_service.ecs_service will be updated in-place
~ resource "aws_ecs_service" "ecs_service" {
        id                                 = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-stage/api-journeys-modern-stage-service"
        name                               = "api-journeys-modern-stage-service"
        tags                               = {}
      ~ task_definition                    = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-stage:17" -> (known after apply)
        # (18 unchanged attributes hidden)

        # (4 unchanged blocks hidden)
    }

  # module.stage.module.api-journeys-modern.module.ecs-task.aws_ecs_task_definition.ecs_task_definition must be replaced
+/- resource "aws_ecs_task_definition" "ecs_task_definition" {
      ~ arn                      = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-stage:17" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-stage" -> (known after apply)
      ~ container_definitions    = jsonencode(
            [
              - {
                  - cpu              = 1024
                  - environment      = [
                      - {
                          - name  = "NODE_ENV"
                          - value = "production"
                        },
                      - {
                          - name  = "SERVICE_ENV"
                          - value = "stage"
                        },
                      - {
                          - name  = "SERVICE_NAME"
                          - value = "api-journeys-modern"
                        },
                    ]
                  - essential        = true
                  - image            = "410965620680.dkr.ecr.us-east-2.amazonaws.com/jfp-api-journeys-modern-stage:latest"
                  - logConfiguration = {
                      - logDriver     = "awsfirelens"
                      - options       = {
                          - Host        = "http-intake.logs.datadoghq.com"
                          - Name        = "datadog"
                          - TLS         = "on"
                          - compress    = "gzip"
                          - dd_service  = "api-journeys-modern"
                          - dd_source   = "graphql-yoga"
                          - dd_tags     = "env:stage"
                          - provider    = "ecs"
                          - retry_limit = "2"
                        }
                      - secretOptions = [
                          - {
                              - name      = "apikey"
                              - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                            },
                        ]
                    }
                  - memory           = 2048
                  - mountPoints      = []
                  - name             = "jfp-api-journeys-modern-stage-app"
                  - portMappings     = [
                      - {
                          - containerPort = 4004
                          - hostPort      = 4004
                          - protocol      = "tcp"
                        },
                    ]
                  - secrets          = [
                      - {
                          - name      = "AWS_ACCESS_KEY_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/AWS_ACCESS_KEY_ID"
                        },
                      - {
                          - name      = "AWS_SECRET_ACCESS_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/AWS_SECRET_ACCESS_KEY"
                        },
                      - {
                          - name      = "CLOUDFLARE_UPLOAD_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/CLOUDFLARE_UPLOAD_KEY"
                        },
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                      - {
                          - name      = "FACEBOOK_APP_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/FACEBOOK_APP_ID"
                        },
                      - {
                          - name      = "FACEBOOK_APP_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/FACEBOOK_APP_SECRET"
                        },
                      - {
                          - name      = "FIREBASE_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/FIREBASE_API_KEY"
                        },
                      - {
                          - name      = "GATEWAY_HMAC_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GATEWAY_HMAC_SECRET"
                        },
                      - {
                          - name      = "GATEWAY_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GATEWAY_URL"
                        },
                      - {
                          - name      = "GIT_BRANCH"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GIT_BRANCH"
                        },
                      - {
                          - name      = "GOOGLE_APPLICATION_JSON"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GOOGLE_APPLICATION_JSON"
                        },
                      - {
                          - name      = "GOOGLE_CLIENT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GOOGLE_CLIENT_ID"
                        },
                      - {
                          - name      = "GOOGLE_CLIENT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GOOGLE_CLIENT_SECRET"
                        },
                      - {
                          - name      = "GOOGLE_GENERATIVE_AI_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GOOGLE_GENERATIVE_AI_API_KEY"
                        },
                      - {
                          - name      = "GROWTH_SPACES_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GROWTH_SPACES_URL"
                        },
                      - {
                          - name      = "INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET"
                        },
                      - {
                          - name      = "INTEROP_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/INTEROP_TOKEN"
                        },
                      - {
                          - name      = "JOURNEYS_ADMIN_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/JOURNEYS_ADMIN_URL"
                        },
                      - {
                          - name      = "JOURNEYS_REVALIDATE_ACCESS_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/JOURNEYS_REVALIDATE_ACCESS_TOKEN"
                        },
                      - {
                          - name      = "JOURNEYS_SHORTLINK_DOMAIN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/JOURNEYS_SHORTLINK_DOMAIN"
                        },
                      - {
                          - name      = "JOURNEYS_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/JOURNEYS_URL"
                        },
                      - {
                          - name      = "MAILCHIMP_AUDIENCE_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/MAILCHIMP_AUDIENCE_ID"
                        },
                      - {
                          - name      = "MAILCHIMP_MARKETING_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/MAILCHIMP_MARKETING_API_KEY"
                        },
                      - {
                          - name      = "MAILCHIMP_MARKETING_API_SERVER_PREFIX"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/MAILCHIMP_MARKETING_API_SERVER_PREFIX"
                        },
                      - {
                          - name      = "NAT_ADDRESSES"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/NAT_ADDRESSES"
                        },
                      - {
                          - name      = "OPEN_AI_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/OPEN_AI_API_KEY"
                        },
                      - {
                          - name      = "PG_DATABASE_URL_JOURNEYS"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PG_DATABASE_URL_JOURNEYS"
                        },
                      - {
                          - name      = "PLAUSIBLE_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAUSIBLE_API_KEY"
                        },
                      - {
                          - name      = "PLAUSIBLE_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAUSIBLE_URL"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_2"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_2"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_3"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_3"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_4"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_4"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_5"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_5"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_6"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_6"
                        },
                      - {
                          - name      = "POWER_BI_CLIENT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_CLIENT_ID"
                        },
                      - {
                          - name      = "POWER_BI_CLIENT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_CLIENT_SECRET"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_MULTIPLE_FULL_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_JOURNEYS_MULTIPLE_FULL_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_MULTIPLE_SUMMARY_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_JOURNEYS_MULTIPLE_SUMMARY_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_SINGLE_FULL_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_JOURNEYS_SINGLE_FULL_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_SINGLE_SUMMARY_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_JOURNEYS_SINGLE_SUMMARY_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_TENANT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_TENANT_ID"
                        },
                      - {
                          - name      = "POWER_BI_WORKSPACE_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_WORKSPACE_ID"
                        },
                      - {
                          - name      = "REDIS_PORT"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/REDIS_PORT"
                        },
                      - {
                          - name      = "REDIS_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/REDIS_URL"
                        },
                      - {
                          - name      = "SMTP_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/SMTP_URL"
                        },
                      - {
                          - name      = "VERCEL_JOURNEYS_PROJECT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/VERCEL_JOURNEYS_PROJECT_ID"
                        },
                      - {
                          - name      = "VERCEL_TEAM_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/VERCEL_TEAM_ID"
                        },
                      - {
                          - name      = "VERCEL_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/VERCEL_TOKEN"
                        },
                    ]
                  - systemControls   = []
                  - volumesFrom      = []
                },
              - {
                  - environment       = [
                      - {
                          - name  = "DD_APM_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_APM_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_DOGSTATSD_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_LOGS_INJECTION"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT"
                          - value = "0.0.0.0:4317"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT"
                          - value = "0.0.0.0:4318"
                        },
                      - {
                          - name  = "DD_PROCESS_AGENT_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_PROFILING_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_RUNTIME_METRICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_TAGS"
                          - value = "env:stage app:api-journeys-modern"
                        },
                      - {
                          - name  = "DD_TRACE_ANALYTICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "ECS_FARGATE"
                          - value = "true"
                        },
                    ]
                  - essential         = true
                  - image             = "public.ecr.aws/datadog/agent:latest"
                  - logConfiguration  = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "api-journeys-modern-stage-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation = 128
                  - mountPoints       = []
                  - name              = "jfp-api-journeys-modern-stage-datadog-agent"
                  - portMappings      = [
                      - {
                          - containerPort = 4317
                          - hostPort      = 4317
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 4318
                          - hostPort      = 4318
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 8125
                          - hostPort      = 8125
                          - protocol      = "udp"
                        },
                    ]
                  - secrets           = [
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                    ]
                  - systemControls    = []
                  - volumesFrom       = []
                },
              - {
                  - environment           = []
                  - essential             = true
                  - firelensConfiguration = {
                      - options = {
                          - config-file-type        = "file"
                          - config-file-value       = "/fluent-bit/configs/parse-json.conf"
                          - enable-ecs-log-metadata = "true"
                        }
                      - type    = "fluentbit"
                    }
                  - image                 = "amazon/aws-for-fluent-bit:stable"
                  - logConfiguration      = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "api-journeys-modern-stage-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation     = 100
                  - mountPoints           = []
                  - name                  = "jfp-api-journeys-modern-stage-log-router"
                  - portMappings          = []
                  - systemControls        = []
                  - user                  = "0"
                  - volumesFrom           = []
                },
            ]
        ) -> (known after apply) # forces replacement
      ~ enable_fault_injection   = false -> (known after apply)
      ~ id                       = "jfp-api-journeys-modern-stage" -> (known after apply)
      ~ revision                 = 17 -> (known after apply)
      - tags                     = {} -> null
      ~ tags_all                 = {} -> (known after apply)
        # (12 unchanged attributes hidden)
    }

  # module.stage.module.api-journeys-modern.module.ecs-task.aws_ssm_parameter.parameters["PG_DATABASE_URL_USERS"] will be created
+ resource "aws_ssm_parameter" "parameters" {
      + arn            = (known after apply)
      + data_type      = (known after apply)
      + has_value_wo   = (known after apply)
      + id             = (known after apply)
      + insecure_value = (known after apply)
      + key_id         = (known after apply)
      + name           = "/ecs/api-journeys/stage/PG_DATABASE_URL_USERS"
      + overwrite      = true
      + region         = "us-east-2"
      + tags           = {
          + "name" = "PG_DATABASE_URL_USERS"
        }
      + tags_all       = {
          + "name" = "PG_DATABASE_URL_USERS"
        }
      + tier           = (known after apply)
      + type           = "SecureString"
      + value          = (sensitive value)
      + value_wo       = (write-only attribute)
      + version        = (known after apply)
    }

  # module.stage.module.cms.module.ecs-task.aws_alb_listener_rule.alb_listener_rule will be destroyed
  # (because aws_alb_listener_rule.alb_listener_rule is not in configuration)
- resource "aws_alb_listener_rule" "alb_listener_rule" {
      - arn          = "arn:aws:elasticloadbalancing:us-east-2:410965620680:listener-rule/app/jfp-public-alb-stage/27d94355c709eb16/e976ba0cdd6d17a6/78b1efc27e185d01" -> null
      - id           = "arn:aws:elasticloadbalancing:us-east-2:410965620680:listener-rule/app/jfp-public-alb-stage/27d94355c709eb16/e976ba0cdd6d17a6/78b1efc27e185d01" -> null
      - listener_arn = "arn:aws:elasticloadbalancing:us-east-2:410965620680:listener/app/jfp-public-alb-stage/27d94355c709eb16/e976ba0cdd6d17a6" -> null
      - priority     = 4 -> null
      - region       = "us-east-2" -> null
      - tags         = {} -> null
      - tags_all     = {} -> null

      - action {
          - order            = 1 -> null
          - target_group_arn = "arn:aws:elasticloadbalancing:us-east-2:410965620680:targetgroup/cms-stage-tg/3253bc770843fe67" -> null
          - type             = "forward" -> null
        }

      - condition {
          - host_header {
              - values = [
                  - "cms-stage.jesusfilm.org",
                ] -> null
            }
        }
    }

  # module.stage.module.cms.module.ecs-task.aws_alb_target_group.alb_target_group will be destroyed
  # (because aws_alb_target_group.alb_target_group is not in configuration)
- resource "aws_alb_target_group" "alb_target_group" {
      - arn                                = "arn:aws:elasticloadbalancing:us-east-2:410965620680:targetgroup/cms-stage-tg/3253bc770843fe67" -> null
      - arn_suffix                         = "targetgroup/cms-stage-tg/3253bc770843fe67" -> null
      - deregistration_delay               = "300" -> null
      - id                                 = "arn:aws:elasticloadbalancing:us-east-2:410965620680:targetgroup/cms-stage-tg/3253bc770843fe67" -> null
      - ip_address_type                    = "ipv4" -> null
      - lambda_multi_value_headers_enabled = false -> null
      - load_balancer_arns                 = [
          - "arn:aws:elasticloadbalancing:us-east-2:410965620680:loadbalancer/app/jfp-public-alb-stage/27d94355c709eb16",
        ] -> null
      - load_balancing_algorithm_type      = "round_robin" -> null
      - load_balancing_anomaly_mitigation  = "off" -> null
      - load_balancing_cross_zone_enabled  = "use_load_balancer_configuration" -> null
      - name                               = "cms-stage-tg" -> null
      - port                               = 1337 -> null
      - protocol                           = "HTTP" -> null
      - protocol_version                   = "HTTP1" -> null
      - proxy_protocol_v2                  = false -> null
      - region                             = "us-east-2" -> null
      - slow_start                         = 0 -> null
      - tags                               = {} -> null
      - tags_all                           = {} -> null
      - target_type                        = "ip" -> null
      - vpc_id                             = "vpc-08eeff0fe23f23079" -> null
        # (1 unchanged attribute hidden)

      - health_check {
          - enabled             = true -> null
          - healthy_threshold   = 2 -> null
          - interval            = 10 -> null
          - matcher             = "200" -> null
          - path                = "/_health" -> null
          - port                = "1337" -> null
          - protocol            = "HTTP" -> null
          - timeout             = 4 -> null
          - unhealthy_threshold = 4 -> null
        }

      - stickiness {
          - cookie_duration = 86400 -> null
          - enabled         = false -> null
          - type            = "lb_cookie" -> null
            # (1 unchanged attribute hidden)
        }

      - target_failover {}

      - target_group_health {
          - dns_failover {
              - minimum_healthy_targets_count      = "1" -> null
              - minimum_healthy_targets_percentage = "off" -> null
            }
          - unhealthy_state_routing {
              - minimum_healthy_targets_count      = 1 -> null
              - minimum_healthy_targets_percentage = "off" -> null
            }
        }

      - target_health_state {}
    }

  # module.stage.module.cms.module.ecs-task.aws_appautoscaling_policy.ecs_policy_cpu will be destroyed
  # (because aws_appautoscaling_policy.ecs_policy_cpu is not in configuration)
- resource "aws_appautoscaling_policy" "ecs_policy_cpu" {
      - alarm_arns         = [
          - "arn:aws:cloudwatch:us-east-2:410965620680:alarm:TargetTracking-service/jfp-ecs-cluster-stage/cms-stage-service-AlarmHigh-904d80f7-842c-41a5-8f2c-b368a32acc42",
          - "arn:aws:cloudwatch:us-east-2:410965620680:alarm:TargetTracking-service/jfp-ecs-cluster-stage/cms-stage-service-AlarmLow-162ccf13-92d0-4db9-9cd8-19bfa7704d38",
        ] -> null
      - arn                = "arn:aws:autoscaling:us-east-2:410965620680:scalingPolicy:be7ab121-ae86-430c-a697-f5dd9043c727:resource/ecs/service/jfp-ecs-cluster-stage/cms-stage-service:policyName/jfp-cpu-autoscaling-stage" -> null
      - id                 = "jfp-cpu-autoscaling-stage" -> null
      - name               = "jfp-cpu-autoscaling-stage" -> null
      - policy_type        = "TargetTrackingScaling" -> null
      - region             = "us-east-2" -> null
      - resource_id        = "service/jfp-ecs-cluster-stage/cms-stage-service" -> null
      - scalable_dimension = "ecs:service:DesiredCount" -> null
      - service_namespace  = "ecs" -> null

      - target_tracking_scaling_policy_configuration {
          - disable_scale_in   = false -> null
          - scale_in_cooldown  = 0 -> null
          - scale_out_cooldown = 0 -> null
          - target_value       = 75 -> null

          - predefined_metric_specification {
              - predefined_metric_type = "ECSServiceAverageCPUUtilization" -> null
                # (1 unchanged attribute hidden)
            }
        }
    }

  # module.stage.module.cms.module.ecs-task.aws_appautoscaling_policy.ecs_policy_memory will be destroyed
  # (because aws_appautoscaling_policy.ecs_policy_memory is not in configuration)
- resource "aws_appautoscaling_policy" "ecs_policy_memory" {
      - alarm_arns         = [
          - "arn:aws:cloudwatch:us-east-2:410965620680:alarm:TargetTracking-service/jfp-ecs-cluster-stage/cms-stage-service-AlarmHigh-ec7ae986-6064-4c53-9000-b057b6b20000",
          - "arn:aws:cloudwatch:us-east-2:410965620680:alarm:TargetTracking-service/jfp-ecs-cluster-stage/cms-stage-service-AlarmLow-521e28fd-b2ce-4c28-b234-ebcbac5a0ec8",
        ] -> null
      - arn                = "arn:aws:autoscaling:us-east-2:410965620680:scalingPolicy:be7ab121-ae86-430c-a697-f5dd9043c727:resource/ecs/service/jfp-ecs-cluster-stage/cms-stage-service:policyName/jfp-memory-autoscaling-stage" -> null
      - id                 = "jfp-memory-autoscaling-stage" -> null
      - name               = "jfp-memory-autoscaling-stage" -> null
      - policy_type        = "TargetTrackingScaling" -> null
      - region             = "us-east-2" -> null
      - resource_id        = "service/jfp-ecs-cluster-stage/cms-stage-service" -> null
      - scalable_dimension = "ecs:service:DesiredCount" -> null
      - service_namespace  = "ecs" -> null

      - target_tracking_scaling_policy_configuration {
          - disable_scale_in   = false -> null
          - scale_in_cooldown  = 0 -> null
          - scale_out_cooldown = 0 -> null
          - target_value       = 75 -> null

          - predefined_metric_specification {
              - predefined_metric_type = "ECSServiceAverageMemoryUtilization" -> null
                # (1 unchanged attribute hidden)
            }
        }
    }

  # module.stage.module.cms.module.ecs-task.aws_appautoscaling_target.service_autoscaling will be destroyed
  # (because aws_appautoscaling_target.service_autoscaling is not in configuration)
- resource "aws_appautoscaling_target" "service_autoscaling" {
      - arn                = "arn:aws:application-autoscaling:us-east-2:410965620680:scalable-target/0ec5be7ab121ae86430ca697f5dd9043c727" -> null
      - id                 = "service/jfp-ecs-cluster-stage/cms-stage-service" -> null
      - max_capacity       = 4 -> null
      - min_capacity       = 1 -> null
      - region             = "us-east-2" -> null
      - resource_id        = "service/jfp-ecs-cluster-stage/cms-stage-service" -> null
      - role_arn           = "arn:aws:iam::410965620680:role/aws-service-role/ecs.application-autoscaling.amazonaws.com/AWSServiceRoleForApplicationAutoScaling_ECSService" -> null
      - scalable_dimension = "ecs:service:DesiredCount" -> null
      - service_namespace  = "ecs" -> null
      - tags               = {} -> null
      - tags_all           = {} -> null

      - suspended_state {
          - dynamic_scaling_in_suspended  = false -> null
          - dynamic_scaling_out_suspended = false -> null
          - scheduled_scaling_suspended   = false -> null
        }
    }

  # module.stage.module.cms.module.ecs-task.aws_cloudwatch_log_group.ecs_cw_log_group will be destroyed
  # (because aws_cloudwatch_log_group.ecs_cw_log_group is not in configuration)
- resource "aws_cloudwatch_log_group" "ecs_cw_log_group" {
      - arn               = "arn:aws:logs:us-east-2:410965620680:log-group:cms-stage-logs" -> null
      - id                = "cms-stage-logs" -> null
      - log_group_class   = "STANDARD" -> null
      - name              = "cms-stage-logs" -> null
      - region            = "us-east-2" -> null
      - retention_in_days = 0 -> null
      - skip_destroy      = false -> null
      - tags              = {} -> null
      - tags_all          = {} -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_ecr_lifecycle_policy.ecr_policy will be destroyed
  # (because aws_ecr_lifecycle_policy.ecr_policy is not in configuration)
- resource "aws_ecr_lifecycle_policy" "ecr_policy" {
      - id          = "jfp-cms-stage" -> null
      - policy      = jsonencode(
            {
              - rules = [
                  - {
                      - action       = {
                          - type = "expire"
                        }
                      - description  = "Expire more than 10 images"
                      - rulePriority = 1
                      - selection    = {
                          - countNumber = 10
                          - countType   = "imageCountMoreThan"
                          - tagStatus   = "any"
                        }
                    },
                ]
            }
        ) -> null
      - region      = "us-east-2" -> null
      - registry_id = "410965620680" -> null
      - repository  = "jfp-cms-stage" -> null
    }

  # module.stage.module.cms.module.ecs-task.aws_ecr_repository.ecr_repository will be destroyed
  # (because aws_ecr_repository.ecr_repository is not in configuration)
- resource "aws_ecr_repository" "ecr_repository" {
      - arn                  = "arn:aws:ecr:us-east-2:410965620680:repository/jfp-cms-stage" -> null
      - id                   = "jfp-cms-stage" -> null
      - image_tag_mutability = "MUTABLE" -> null
      - name                 = "jfp-cms-stage" -> null
      - region               = "us-east-2" -> null
      - registry_id          = "410965620680" -> null
      - repository_url       = "410965620680.dkr.ecr.us-east-2.amazonaws.com/jfp-cms-stage" -> null
      - tags                 = {} -> null
      - tags_all             = {} -> null

      - encryption_configuration {
          - encryption_type = "AES256" -> null
            # (1 unchanged attribute hidden)
        }

      - image_scanning_configuration {
          - scan_on_push = false -> null
        }
    }

  # module.stage.module.cms.module.ecs-task.aws_ecs_service.ecs_service will be destroyed
  # (because aws_ecs_service.ecs_service is not in configuration)
- resource "aws_ecs_service" "ecs_service" {
      - arn                                = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-stage/cms-stage-service" -> null
      - availability_zone_rebalancing      = "DISABLED" -> null
      - cluster                            = "arn:aws:ecs:us-east-2:410965620680:cluster/jfp-ecs-cluster-stage" -> null
      - deployment_maximum_percent         = 200 -> null
      - deployment_minimum_healthy_percent = 100 -> null
      - desired_count                      = 1 -> null
      - enable_ecs_managed_tags            = false -> null
      - enable_execute_command             = true -> null
      - health_check_grace_period_seconds  = 0 -> null
      - iam_role                           = "/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS" -> null
      - id                                 = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-stage/cms-stage-service" -> null
      - launch_type                        = "FARGATE" -> null
      - name                               = "cms-stage-service" -> null
      - platform_version                   = "LATEST" -> null
      - propagate_tags                     = "NONE" -> null
      - region                             = "us-east-2" -> null
      - scheduling_strategy                = "REPLICA" -> null
      - tags                               = {} -> null
      - tags_all                           = {} -> null
      - task_definition                    = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-cms-stage:1" -> null
      - triggers                           = {} -> null
      - wait_for_steady_state              = false -> null

      - deployment_circuit_breaker {
          - enable   = false -> null
          - rollback = false -> null
        }

      - deployment_controller {
          - type = "ECS" -> null
        }

      - load_balancer {
          - container_name   = "jfp-cms-stage-app" -> null
          - container_port   = 1337 -> null
          - target_group_arn = "arn:aws:elasticloadbalancing:us-east-2:410965620680:targetgroup/cms-stage-tg/3253bc770843fe67" -> null
            # (1 unchanged attribute hidden)
        }

      - network_configuration {
          - assign_public_ip = true -> null
          - security_groups  = [
              - "sg-0715e664d653ce89c",
            ] -> null
          - subnets          = [
              - "subnet-03bd7850c8bbe2ce9",
              - "subnet-0a609b33cdac65789",
              - "subnet-0c394639d255c3261",
            ] -> null
        }
    }

  # module.stage.module.cms.module.ecs-task.aws_ecs_task_definition.ecs_task_definition will be destroyed
  # (because aws_ecs_task_definition.ecs_task_definition is not in configuration)
- resource "aws_ecs_task_definition" "ecs_task_definition" {
      - arn                      = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-cms-stage:1" -> null
      - arn_without_revision     = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-cms-stage" -> null
      - container_definitions    = jsonencode(
            [
              - {
                  - cpu              = 1024
                  - environment      = [
                      - {
                          - name  = "NODE_ENV"
                          - value = "production"
                        },
                      - {
                          - name  = "SERVICE_ENV"
                          - value = "stage"
                        },
                      - {
                          - name  = "SERVICE_NAME"
                          - value = "cms"
                        },
                    ]
                  - essential        = true
                  - image            = "410965620680.dkr.ecr.us-east-2.amazonaws.com/jfp-cms-stage:latest"
                  - logConfiguration = {
                      - logDriver     = "awsfirelens"
                      - options       = {
                          - Host        = "http-intake.logs.datadoghq.com"
                          - Name        = "datadog"
                          - TLS         = "on"
                          - compress    = "gzip"
                          - dd_service  = "cms"
                          - dd_source   = "strapi"
                          - dd_tags     = "env:stage"
                          - provider    = "ecs"
                          - retry_limit = "2"
                        }
                      - secretOptions = [
                          - {
                              - name      = "apikey"
                              - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                            },
                        ]
                    }
                  - memory           = 2048
                  - mountPoints      = []
                  - name             = "jfp-cms-stage-app"
                  - portMappings     = [
                      - {
                          - containerPort = 1337
                          - hostPort      = 1337
                          - protocol      = "tcp"
                        },
                    ]
                  - secrets          = [
                      - {
                          - name      = "ADMIN_JWT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/ADMIN_JWT_SECRET"
                        },
                      - {
                          - name      = "API_TOKEN_SALT"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/API_TOKEN_SALT"
                        },
                      - {
                          - name      = "APP_KEYS"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/APP_KEYS"
                        },
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                      - {
                          - name      = "ENCRYPTION_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/ENCRYPTION_KEY"
                        },
                      - {
                          - name      = "MUX_ACCESS_TOKEN_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/MUX_ACCESS_TOKEN_ID"
                        },
                      - {
                          - name      = "MUX_PLAYBACK_SIGNING_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/MUX_PLAYBACK_SIGNING_ID"
                        },
                      - {
                          - name      = "MUX_PLAYBACK_SIGNING_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/MUX_PLAYBACK_SIGNING_SECRET"
                        },
                      - {
                          - name      = "MUX_SECRET_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/MUX_SECRET_KEY"
                        },
                      - {
                          - name      = "MUX_WEBHOOK_SIGNING_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/MUX_WEBHOOK_SIGNING_SECRET"
                        },
                      - {
                          - name      = "PG_DATABASE_URL_CMS"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/PG_DATABASE_URL_CMS"
                        },
                      - {
                          - name      = "TRANSFER_TOKEN_SALT"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/TRANSFER_TOKEN_SALT"
                        },
                    ]
                  - systemControls   = []
                  - volumesFrom      = []
                },
              - {
                  - environment       = [
                      - {
                          - name  = "DD_APM_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_APM_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_DOGSTATSD_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_LOGS_INJECTION"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT"
                          - value = "0.0.0.0:4317"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT"
                          - value = "0.0.0.0:4318"
                        },
                      - {
                          - name  = "DD_PROCESS_AGENT_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_PROFILING_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_RUNTIME_METRICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_TAGS"
                          - value = "env:stage app:cms"
                        },
                      - {
                          - name  = "DD_TRACE_ANALYTICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "ECS_FARGATE"
                          - value = "true"
                        },
                    ]
                  - essential         = true
                  - image             = "public.ecr.aws/datadog/agent:latest"
                  - logConfiguration  = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "cms-stage-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation = 128
                  - mountPoints       = []
                  - name              = "jfp-cms-stage-datadog-agent"
                  - portMappings      = [
                      - {
                          - containerPort = 4317
                          - hostPort      = 4317
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 4318
                          - hostPort      = 4318
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 8125
                          - hostPort      = 8125
                          - protocol      = "udp"
                        },
                    ]
                  - secrets           = [
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                    ]
                  - systemControls    = []
                  - volumesFrom       = []
                },
              - {
                  - environment           = []
                  - essential             = true
                  - firelensConfiguration = {
                      - options = {
                          - config-file-type        = "file"
                          - config-file-value       = "/fluent-bit/configs/parse-json.conf"
                          - enable-ecs-log-metadata = "true"
                        }
                      - type    = "fluentbit"
                    }
                  - image                 = "amazon/aws-for-fluent-bit:stable"
                  - logConfiguration      = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "cms-stage-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation     = 100
                  - mountPoints           = []
                  - name                  = "jfp-cms-stage-log-router"
                  - portMappings          = []
                  - systemControls        = []
                  - user                  = "0"
                  - volumesFrom           = []
                },
            ]
        ) -> null
      - cpu                      = "1024" -> null
      - enable_fault_injection   = false -> null
      - execution_role_arn       = "arn:aws:iam::410965620680:role/jfp-ecs-task-execution-role" -> null
      - family                   = "jfp-cms-stage" -> null
      - id                       = "jfp-cms-stage" -> null
      - memory                   = "2048" -> null
      - network_mode             = "awsvpc" -> null
      - region                   = "us-east-2" -> null
      - requires_compatibilities = [
          - "FARGATE",
        ] -> null
      - revision                 = 1 -> null
      - skip_destroy             = false -> null
      - tags                     = {} -> null
      - tags_all                 = {} -> null
      - task_role_arn            = "arn:aws:iam::410965620680:role/terraform-ecs-task-role-stage" -> null
      - track_latest             = false -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_route53_record.record will be destroyed
  # (because aws_route53_record.record is not in configuration)
- resource "aws_route53_record" "record" {
      - fqdn                             = "cms.stage.central.jesusfilm.org" -> null
      - id                               = "Z09188583TUYV562FI49B_cms_CNAME" -> null
      - multivalue_answer_routing_policy = false -> null
      - name                             = "cms" -> null
      - records                          = [
          - "jfp-public-alb-stage-1845039612.us-east-2.elb.amazonaws.com",
        ] -> null
      - ttl                              = 300 -> null
      - type                             = "CNAME" -> null
      - zone_id                          = "Z09188583TUYV562FI49B" -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_ssm_parameter.parameters["ADMIN_JWT_SECRET"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/ADMIN_JWT_SECRET" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/stage/ADMIN_JWT_SECRET" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/stage/ADMIN_JWT_SECRET" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "ADMIN_JWT_SECRET"
        } -> null
      - tags_all        = {
          - "name" = "ADMIN_JWT_SECRET"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_ssm_parameter.parameters["API_TOKEN_SALT"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/API_TOKEN_SALT" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/stage/API_TOKEN_SALT" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/stage/API_TOKEN_SALT" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "API_TOKEN_SALT"
        } -> null
      - tags_all        = {
          - "name" = "API_TOKEN_SALT"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_ssm_parameter.parameters["APP_KEYS"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/APP_KEYS" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/stage/APP_KEYS" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/stage/APP_KEYS" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "APP_KEYS"
        } -> null
      - tags_all        = {
          - "name" = "APP_KEYS"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_ssm_parameter.parameters["ENCRYPTION_KEY"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/ENCRYPTION_KEY" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/stage/ENCRYPTION_KEY" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/stage/ENCRYPTION_KEY" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "ENCRYPTION_KEY"
        } -> null
      - tags_all        = {
          - "name" = "ENCRYPTION_KEY"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_ssm_parameter.parameters["MUX_ACCESS_TOKEN_ID"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/MUX_ACCESS_TOKEN_ID" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/stage/MUX_ACCESS_TOKEN_ID" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/stage/MUX_ACCESS_TOKEN_ID" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "MUX_ACCESS_TOKEN_ID"
        } -> null
      - tags_all        = {
          - "name" = "MUX_ACCESS_TOKEN_ID"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_ssm_parameter.parameters["MUX_PLAYBACK_SIGNING_ID"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/MUX_PLAYBACK_SIGNING_ID" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/stage/MUX_PLAYBACK_SIGNING_ID" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/stage/MUX_PLAYBACK_SIGNING_ID" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "MUX_PLAYBACK_SIGNING_ID"
        } -> null
      - tags_all        = {
          - "name" = "MUX_PLAYBACK_SIGNING_ID"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_ssm_parameter.parameters["MUX_PLAYBACK_SIGNING_SECRET"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/MUX_PLAYBACK_SIGNING_SECRET" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/stage/MUX_PLAYBACK_SIGNING_SECRET" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/stage/MUX_PLAYBACK_SIGNING_SECRET" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "MUX_PLAYBACK_SIGNING_SECRET"
        } -> null
      - tags_all        = {
          - "name" = "MUX_PLAYBACK_SIGNING_SECRET"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_ssm_parameter.parameters["MUX_SECRET_KEY"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/MUX_SECRET_KEY" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/stage/MUX_SECRET_KEY" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/stage/MUX_SECRET_KEY" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "MUX_SECRET_KEY"
        } -> null
      - tags_all        = {
          - "name" = "MUX_SECRET_KEY"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_ssm_parameter.parameters["MUX_WEBHOOK_SIGNING_SECRET"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/MUX_WEBHOOK_SIGNING_SECRET" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/stage/MUX_WEBHOOK_SIGNING_SECRET" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/stage/MUX_WEBHOOK_SIGNING_SECRET" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "MUX_WEBHOOK_SIGNING_SECRET"
        } -> null
      - tags_all        = {
          - "name" = "MUX_WEBHOOK_SIGNING_SECRET"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_ssm_parameter.parameters["PG_DATABASE_URL_CMS"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/PG_DATABASE_URL_CMS" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/stage/PG_DATABASE_URL_CMS" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/stage/PG_DATABASE_URL_CMS" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "PG_DATABASE_URL_CMS"
        } -> null
      - tags_all        = {
          - "name" = "PG_DATABASE_URL_CMS"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 3 -> null
        # (2 unchanged attributes hidden)
    }

  # module.stage.module.cms.module.ecs-task.aws_ssm_parameter.parameters["TRANSFER_TOKEN_SALT"] will be destroyed
  # (because aws_ssm_parameter.parameters is not in configuration)
- resource "aws_ssm_parameter" "parameters" {
      - arn             = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/cms/stage/TRANSFER_TOKEN_SALT" -> null
      - data_type       = "text" -> null
      - has_value_wo    = false -> null
      - id              = "/ecs/cms/stage/TRANSFER_TOKEN_SALT" -> null
      - key_id          = "alias/aws/ssm" -> null
      - name            = "/ecs/cms/stage/TRANSFER_TOKEN_SALT" -> null
      - overwrite       = true -> null
      - region          = "us-east-2" -> null
      - tags            = {
          - "name" = "TRANSFER_TOKEN_SALT"
        } -> null
      - tags_all        = {
          - "name" = "TRANSFER_TOKEN_SALT"
        } -> null
      - tier            = "Standard" -> null
      - type            = "SecureString" -> null
      - value           = (sensitive value) -> null
      - value_wo        = (write-only attribute) -> null
      - version         = 2 -> null
        # (2 unchanged attributes hidden)
    }

Plan: 4 to add, 9 to change, 46 to destroy.
╷
│ Warning: Deprecated Resource
│ 
│   with module.datadog.datadog_integration_aws.sandbox,
│   on modules/aws/datadog/main.tf line 118, in resource "datadog_integration_aws" "sandbox":
│  118: resource "datadog_integration_aws" "sandbox" {
│ 
│ **This resource is deprecated - use the `datadog_integration_aws_account`
│ resource instead**:
│ https://registry.terraform.io/providers/DataDog/datadog/latest/docs/resources/integration_aws_account
╵
╷
│ Warning: Deprecated attribute
│ 
│   on .terraform/modules/datadog.datadog_log_forwarder/modules/log_forwarder/main.tf line 2, in locals:
│    2:   bucket_name = var.bucket_name != "" ? var.bucket_name : "datadog-forwarder-${data.aws_caller_identity.current.account_id}-${data.aws_region.current.name}"
│ 
│ The attribute "name" is deprecated. Refer to the provider documentation for
│ details.
│ 
│ (and 2 more similar warnings elsewhere)
╵
  • ▶️ To apply this plan, comment:
    atlantis apply -d infrastructure
  • 🚮 To delete this plan and lock, click here
  • 🔁 To plan this project again, comment:
    atlantis plan -d infrastructure

Plan: 4 to add, 9 to change, 46 to destroy.


  • ⏩ To apply all unapplied plans from this Pull Request, comment:
    atlantis apply
  • 🚮 To delete all plans and locks from this Pull Request, comment:
    atlantis unlock

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@apis/api-journeys-modern/src/workers/server.ts`:
- Around line 59-93: The server currently only executes run(await import(/*
webpackChunkName: "e2eCleanup" */ './e2eCleanup')) causing production workers to
be skipped; either re-enable the production jobs by restoring the run(await
import(...)) calls for './email', './emailEvents', './revalidate',
'./plausible', and './shortlinkUpdater' (matching the existing pattern and
webpackChunkName comments) so those modules are executed, or—if the change was
intentional—update this module to explicitly document and restrict scope to
e2eCleanup (and remove or refactor the unused imports) and ensure any main entry
point that imports this file (via run) is updated to reflect the new, limited
worker set.
📜 Review details

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 1d29920 and 35b4099.

📒 Files selected for processing (5)
  • apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts
  • apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts
  • apis/api-journeys-modern/src/workers/server.ts
  • libs/prisma/journeys/db/migrations/20260115213838_20260115213836/migration.sql
  • libs/prisma/journeys/db/schema.prisma
🚧 Files skipped from review as they are similar to previous changes (2)
  • apis/api-journeys-modern/src/workers/e2eCleanup/service/service.spec.ts
  • apis/api-journeys-modern/src/workers/e2eCleanup/service/service.ts
🧰 Additional context used
📓 Path-based instructions (2)
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (.cursor/rules/base.mdc)

**/*.{ts,tsx,js,jsx}: Use early returns whenever possible to make the code more readable.
Use descriptive variable and function/const names.
Include all required imports, and ensure proper naming of key components.

Files:

  • apis/api-journeys-modern/src/workers/server.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/base.mdc)

Define a type if possible.

Files:

  • apis/api-journeys-modern/src/workers/server.ts
🧠 Learnings (7)
📓 Common learnings
Learnt from: CR
Repo: JesusFilm/core PR: 0
File: apps/watch/AGENTS.md:0-0
Timestamp: 2025-12-19T04:58:24.460Z
Learning: Applies to apps/watch/apps/watch-e2e/**/*.{ts,tsx} : Reuse the workspace Playwright installation for E2E tests in `apps/watch-e2e`; never install Playwright globally or commit browser binaries.
Learnt from: CR
Repo: JesusFilm/core PR: 0
File: apps/watch/AGENTS.md:0-0
Timestamp: 2025-12-19T04:58:24.460Z
Learning: Reuse E2E coverage from `apps/watch-e2e` and its Playwright setup instead of creating new tooling.
📚 Learning: 2025-11-11T23:22:02.196Z
Learnt from: mikeallisonJS
Repo: JesusFilm/core PR: 8156
File: apis/api-journeys-modern/src/lib/google/googleAuth.ts:0-0
Timestamp: 2025-11-11T23:22:02.196Z
Learning: In apis/api-journeys-modern, use the validated `env` object from `../../env` instead of accessing `process.env` directly for environment variables that are defined in env.ts (e.g., GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET, INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET). This eliminates the need for runtime validation checks since Zod validates them at application startup.

Applied to files:

  • apis/api-journeys-modern/src/workers/server.ts
📚 Learning: 2025-09-29T23:03:36.840Z
Learnt from: mikeallisonJS
Repo: JesusFilm/core PR: 7629
File: apis/api-journeys-modern/src/schema/event/utils.ts:43-60
Timestamp: 2025-09-29T23:03:36.840Z
Learning: In the JesusFilm/core repository, do not recommend using Prisma's `upsert` operation for `JourneyVisitor` creation in `apis/api-journeys-modern/src/schema/event/utils.ts` as it is not race condition safe for this use case. The current `findUnique` then `create` pattern is the preferred approach.

Applied to files:

  • libs/prisma/journeys/db/schema.prisma
  • libs/prisma/journeys/db/migrations/20260115213838_20260115213836/migration.sql
📚 Learning: 2025-09-08T22:56:21.606Z
Learnt from: mikeallisonJS
Repo: JesusFilm/core PR: 7498
File: apis/api-journeys-modern/src/schema/action/emailAction/blockUpdateEmailAction.mutation.ts:26-36
Timestamp: 2025-09-08T22:56:21.606Z
Learning: In the action mutations migration (PR `#7498`), the `journeyId` parameter is intentionally kept in blockUpdate*Action mutations even when unused in the resolver, to maintain API compatibility during the migration from the old "api-journeys" endpoint to the modern "api-journeys-modern" endpoint.

Applied to files:

  • libs/prisma/journeys/db/schema.prisma
  • libs/prisma/journeys/db/migrations/20260115213838_20260115213836/migration.sql
📚 Learning: 2025-08-20T21:51:25.797Z
Learnt from: mikeallisonJS
Repo: JesusFilm/core PR: 7486
File: apis/api-journeys-modern/schema.graphql:1068-1074
Timestamp: 2025-08-20T21:51:25.797Z
Learning: Before suggesting type changes during API migrations, always verify the existing implementation to ensure consistency is maintained. The migration to api-journeys-modern should preserve the same field types as the original api-journeys schema.

Applied to files:

  • libs/prisma/journeys/db/schema.prisma
  • libs/prisma/journeys/db/migrations/20260115213838_20260115213836/migration.sql
📚 Learning: 2025-08-06T23:30:51.611Z
Learnt from: Kneesal
Repo: JesusFilm/core PR: 7362
File: apis/api-journeys/db/migrations/20250806231541_20250806231536/migration.sql:23-24
Timestamp: 2025-08-06T23:30:51.611Z
Learning: In the JourneyCustomizationField table (apis/api-journeys/db/migrations), the unique index on (journeyId, key, value) intentionally allows multiple rows with the same journeyId and key when value is NULL. This supports the business logic where multiple template/default customization fields can exist before being filled in with actual values.

Applied to files:

  • libs/prisma/journeys/db/schema.prisma
  • libs/prisma/journeys/db/migrations/20260115213838_20260115213836/migration.sql
📚 Learning: 2025-08-20T21:51:25.797Z
Learnt from: mikeallisonJS
Repo: JesusFilm/core PR: 7486
File: apis/api-journeys-modern/schema.graphql:1068-1074
Timestamp: 2025-08-20T21:51:25.797Z
Learning: During the refactor to migrate types to modern, maintain consistency with existing api-journeys schema types, including PlausibleStatsAggregateValue.change as Int to match the original implementation.

Applied to files:

  • libs/prisma/journeys/db/migrations/20260115213838_20260115213836/migration.sql
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (7)
  • GitHub Check: test (22, 2/3)
  • GitHub Check: test (22, 3/3)
  • GitHub Check: test (22, 1/3)
  • GitHub Check: lint (22)
  • GitHub Check: affected (22)
  • GitHub Check: lint (22)
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (5)
libs/prisma/journeys/db/schema.prisma (4)

151-151: Cascade delete on Event → Journey aligns with cleanup intent.


372-372: Cascade delete on JourneyTag → Journey is consistent with cleanup.


728-728: Cascade delete on QrCode → Journey looks correct for cleanup.


739-739: Cascade delete on JourneyEventsExportLog → Journey is appropriate for cleanup.

libs/prisma/journeys/db/migrations/20260115213838_20260115213836/migration.sql (1)

1-23: FK replacement to enable cascade behavior looks consistent with schema updates.

✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.

@mikeallisonJS
Copy link
Collaborator Author

atlantis unlock

@jesus-film-bot
Copy link

All Atlantis locks for this PR have been unlocked and plans discarded

@jesus-film-bot
Copy link

Ran Plan for dir: infrastructure workspace: default

Plan Error

Show Output
running 'sh -c' '/usr/local/bin/terraform init -input=false' in '/home/atlantis/.atlantis/repos/JesusFilm/core/6780/default/infrastructure': exit status 1
Initializing the backend...

Successfully configured the backend "s3"! Terraform will automatically
use this backend unless the backend configuration changes.
Initializing modules...
- acm_central_jesusfilm_org in modules/aws/acm
- datadog in modules/aws/datadog
Downloading registry.terraform.io/terraform-aws-modules/datadog-forwarders/aws 5.1.0 for datadog.datadog_log_forwarder...
Downloading registry.terraform.io/terraform-aws-modules/datadog-forwarders/aws 5.1.0 for datadog.datadog_rds_enhanced_monitoring_forwarder...
╷
│ Error: Unreadable module directory
- iam in
- prod in
│ 
│ Unable to evaluate directory symlink: lstat modules: no such file or
- route53_central_jesusfilm_org in
- route53_jesusfilm_org_zone in
│ directory
╵
- stage in
╷
│ Error: Unreadable module directory
│ 
│ The directory  could not be read for module "iam" at main.tf:1.
╵
╷
│ Error: Unreadable module directory
│ 
│ Unable to evaluate directory symlink: lstat environments: no such file or
│ directory
╵
╷
│ Error: Unreadable module directory
│ 
│ The directory  could not be read for module "prod" at main.tf:22.
╵
╷
│ Error: Unreadable module directory
│ 
│ Unable to evaluate directory symlink: lstat modules: no such file or
│ directory
╵
╷
│ Error: Unreadable module directory
│ 
│ The directory  could not be read for module "route53_central_jesusfilm_org"
│ at main.tf:10.
╵
╷
│ Error: Unreadable module directory
│ 
│ Unable to evaluate directory symlink: lstat modules: no such file or
│ directory
╵
╷
│ Error: Unreadable module directory
│ 
│ The directory  could not be read for module "route53_jesusfilm_org_zone" at
│ main.tf:5.
╵
╷
│ Error: Unreadable module directory
│ 
│ Unable to evaluate directory symlink: lstat environments: no such file or
│ directory
╵
╷
│ Error: Unreadable module directory
│ 
│ The directory  could not be read for module "stage" at main.tf:27.
╵
╷
│ Error: Failed to update module manifest
│ 
│ Unable to write the module manifest file: open
│ .terraform/modules/modules.json: no such file or directory
╵
╷
│ Error: Failed to download module
│ 
│   on modules/aws/datadog/main.tf line 123:
│  123: module "datadog_log_forwarder" {
│ 
│ Could not download module "datadog_log_forwarder"
│ (modules/aws/datadog/main.tf:123) source code from
│ "git::https://github.com/terraform-aws-modules/terraform-aws-datadog-forwarders?ref=c8286161d59fd5cc6f42b9c500217a3d09535cde":
│ error downloading
│ 'https://github.com/terraform-aws-modules/terraform-aws-datadog-forwarders?ref=c8286161d59fd5cc6f42b9c500217a3d09535cde':
│ /usr/bin/git exited with 128: Cloning into
│ '.terraform/modules/datadog.datadog_log_forwarder'...
│ error: could not lock config file
│ /home/atlantis/.atlantis/repos/JesusFilm/core/6780/default/infrastructure/.terraform/modules/datadog.datadog_log_forwarder/.git/config:
│ No such file or directory
│ fatal: could not set 'core.repositoryformatversion' to '0'
│ .
╵
╷
│ Error: Failed to download module
│ 
│   on modules/aws/datadog/main.tf line 130:
│  130: module "datadog_rds_enhanced_monitoring_forwarder" {
│ 
│ Could not download module "datadog_rds_enhanced_monitoring_forwarder"
│ (modules/aws/datadog/main.tf:130) source code from
│ "git::https://github.com/terraform-aws-modules/terraform-aws-datadog-forwarders?ref=c8286161d59fd5cc6f42b9c500217a3d09535cde":
│ error downloading
│ 'https://github.com/terraform-aws-modules/terraform-aws-datadog-forwarders?ref=c8286161d59fd5cc6f42b9c500217a3d09535cde':
│ /usr/bin/git exited with 128: fatal: could not create leading directories
│ of '.terraform/modules/datadog.datadog_rds_enhanced_monitoring_forwarder':
│ No such file or directory
│ .
╵

@jesus-film-bot
Copy link

Ran Plan for dir: infrastructure workspace: default

Plan Error

cannot run "plan": the default workspace at path infrastructure is currently locked for this pull request by "plan".
Wait until the previous command is complete and try again

@jesus-film-bot
Copy link

Ran Plan for dir: infrastructure workspace: default

Show Output
Terraform used the selected providers to generate the following execution
plan. Resource actions are indicated with the following symbols:
+ create
~ update in-place
+/- create replacement and then destroy

Terraform will perform the following actions:

  # module.prod.module.api-journeys-modern.module.ecs-task.aws_ecs_service.ecs_service will be updated in-place
~ resource "aws_ecs_service" "ecs_service" {
        id                                 = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-prod/api-journeys-modern-prod-service"
        name                               = "api-journeys-modern-prod-service"
        tags                               = {}
      ~ task_definition                    = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-prod:17" -> (known after apply)
        # (18 unchanged attributes hidden)

        # (4 unchanged blocks hidden)
    }

  # module.prod.module.api-journeys-modern.module.ecs-task.aws_ecs_task_definition.ecs_task_definition must be replaced
+/- resource "aws_ecs_task_definition" "ecs_task_definition" {
      ~ arn                      = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-prod:17" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-prod" -> (known after apply)
      ~ container_definitions    = jsonencode(
            [
              - {
                  - cpu              = 1024
                  - environment      = [
                      - {
                          - name  = "NODE_ENV"
                          - value = "production"
                        },
                      - {
                          - name  = "SERVICE_ENV"
                          - value = "prod"
                        },
                      - {
                          - name  = "SERVICE_NAME"
                          - value = "api-journeys-modern"
                        },
                    ]
                  - essential        = true
                  - image            = "410965620680.dkr.ecr.us-east-2.amazonaws.com/jfp-api-journeys-modern-prod:latest"
                  - logConfiguration = {
                      - logDriver     = "awsfirelens"
                      - options       = {
                          - Host        = "http-intake.logs.datadoghq.com"
                          - Name        = "datadog"
                          - TLS         = "on"
                          - compress    = "gzip"
                          - dd_service  = "api-journeys-modern"
                          - dd_source   = "graphql-yoga"
                          - dd_tags     = "env:prod"
                          - provider    = "ecs"
                          - retry_limit = "2"
                        }
                      - secretOptions = [
                          - {
                              - name      = "apikey"
                              - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                            },
                        ]
                    }
                  - memory           = 2048
                  - mountPoints      = []
                  - name             = "jfp-api-journeys-modern-prod-app"
                  - portMappings     = [
                      - {
                          - containerPort = 4004
                          - hostPort      = 4004
                          - protocol      = "tcp"
                        },
                    ]
                  - secrets          = [
                      - {
                          - name      = "AWS_ACCESS_KEY_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/AWS_ACCESS_KEY_ID"
                        },
                      - {
                          - name      = "AWS_SECRET_ACCESS_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/AWS_SECRET_ACCESS_KEY"
                        },
                      - {
                          - name      = "CLOUDFLARE_UPLOAD_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/CLOUDFLARE_UPLOAD_KEY"
                        },
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                      - {
                          - name      = "FACEBOOK_APP_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/FACEBOOK_APP_ID"
                        },
                      - {
                          - name      = "FACEBOOK_APP_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/FACEBOOK_APP_SECRET"
                        },
                      - {
                          - name      = "FIREBASE_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/FIREBASE_API_KEY"
                        },
                      - {
                          - name      = "GATEWAY_HMAC_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GATEWAY_HMAC_SECRET"
                        },
                      - {
                          - name      = "GATEWAY_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GATEWAY_URL"
                        },
                      - {
                          - name      = "GIT_BRANCH"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GIT_BRANCH"
                        },
                      - {
                          - name      = "GOOGLE_APPLICATION_JSON"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GOOGLE_APPLICATION_JSON"
                        },
                      - {
                          - name      = "GOOGLE_CLIENT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GOOGLE_CLIENT_ID"
                        },
                      - {
                          - name      = "GOOGLE_CLIENT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GOOGLE_CLIENT_SECRET"
                        },
                      - {
                          - name      = "GOOGLE_GENERATIVE_AI_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GOOGLE_GENERATIVE_AI_API_KEY"
                        },
                      - {
                          - name      = "GROWTH_SPACES_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/GROWTH_SPACES_URL"
                        },
                      - {
                          - name      = "INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET"
                        },
                      - {
                          - name      = "INTEROP_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/INTEROP_TOKEN"
                        },
                      - {
                          - name      = "JOURNEYS_ADMIN_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/JOURNEYS_ADMIN_URL"
                        },
                      - {
                          - name      = "JOURNEYS_REVALIDATE_ACCESS_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/JOURNEYS_REVALIDATE_ACCESS_TOKEN"
                        },
                      - {
                          - name      = "JOURNEYS_SHORTLINK_DOMAIN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/JOURNEYS_SHORTLINK_DOMAIN"
                        },
                      - {
                          - name      = "JOURNEYS_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/JOURNEYS_URL"
                        },
                      - {
                          - name      = "MAILCHIMP_AUDIENCE_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/MAILCHIMP_AUDIENCE_ID"
                        },
                      - {
                          - name      = "MAILCHIMP_MARKETING_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/MAILCHIMP_MARKETING_API_KEY"
                        },
                      - {
                          - name      = "MAILCHIMP_MARKETING_API_SERVER_PREFIX"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/MAILCHIMP_MARKETING_API_SERVER_PREFIX"
                        },
                      - {
                          - name      = "NAT_ADDRESSES"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/NAT_ADDRESSES"
                        },
                      - {
                          - name      = "OPEN_AI_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/OPEN_AI_API_KEY"
                        },
                      - {
                          - name      = "PG_DATABASE_URL_JOURNEYS"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PG_DATABASE_URL_JOURNEYS"
                        },
                      - {
                          - name      = "PLAUSIBLE_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAUSIBLE_API_KEY"
                        },
                      - {
                          - name      = "PLAUSIBLE_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAUSIBLE_URL"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_2"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_2"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_3"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_3"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_4"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_4"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_5"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_5"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_6"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/PLAYWRIGHT_USER_ID_6"
                        },
                      - {
                          - name      = "POWER_BI_CLIENT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_CLIENT_ID"
                        },
                      - {
                          - name      = "POWER_BI_CLIENT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_CLIENT_SECRET"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_MULTIPLE_FULL_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_JOURNEYS_MULTIPLE_FULL_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_MULTIPLE_SUMMARY_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_JOURNEYS_MULTIPLE_SUMMARY_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_SINGLE_FULL_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_JOURNEYS_SINGLE_FULL_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_SINGLE_SUMMARY_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_JOURNEYS_SINGLE_SUMMARY_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_TENANT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_TENANT_ID"
                        },
                      - {
                          - name      = "POWER_BI_WORKSPACE_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/POWER_BI_WORKSPACE_ID"
                        },
                      - {
                          - name      = "REDIS_PORT"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/REDIS_PORT"
                        },
                      - {
                          - name      = "REDIS_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/REDIS_URL"
                        },
                      - {
                          - name      = "SMTP_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/SMTP_URL"
                        },
                      - {
                          - name      = "VERCEL_JOURNEYS_PROJECT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/VERCEL_JOURNEYS_PROJECT_ID"
                        },
                      - {
                          - name      = "VERCEL_TEAM_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/VERCEL_TEAM_ID"
                        },
                      - {
                          - name      = "VERCEL_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/prod/VERCEL_TOKEN"
                        },
                    ]
                  - systemControls   = []
                  - volumesFrom      = []
                },
              - {
                  - environment       = [
                      - {
                          - name  = "DD_APM_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_APM_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_DOGSTATSD_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_LOGS_INJECTION"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT"
                          - value = "0.0.0.0:4317"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT"
                          - value = "0.0.0.0:4318"
                        },
                      - {
                          - name  = "DD_PROCESS_AGENT_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_PROFILING_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_RUNTIME_METRICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_TAGS"
                          - value = "env:prod app:api-journeys-modern"
                        },
                      - {
                          - name  = "DD_TRACE_ANALYTICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "ECS_FARGATE"
                          - value = "true"
                        },
                    ]
                  - essential         = true
                  - image             = "public.ecr.aws/datadog/agent:latest"
                  - logConfiguration  = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "api-journeys-modern-prod-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation = 128
                  - mountPoints       = []
                  - name              = "jfp-api-journeys-modern-prod-datadog-agent"
                  - portMappings      = [
                      - {
                          - containerPort = 4317
                          - hostPort      = 4317
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 4318
                          - hostPort      = 4318
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 8125
                          - hostPort      = 8125
                          - protocol      = "udp"
                        },
                    ]
                  - secrets           = [
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                    ]
                  - systemControls    = []
                  - volumesFrom       = []
                },
              - {
                  - environment           = []
                  - essential             = true
                  - firelensConfiguration = {
                      - options = {
                          - config-file-type        = "file"
                          - config-file-value       = "/fluent-bit/configs/parse-json.conf"
                          - enable-ecs-log-metadata = "true"
                        }
                      - type    = "fluentbit"
                    }
                  - image                 = "amazon/aws-for-fluent-bit:stable"
                  - logConfiguration      = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "api-journeys-modern-prod-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation     = 100
                  - mountPoints           = []
                  - name                  = "jfp-api-journeys-modern-prod-log-router"
                  - portMappings          = []
                  - systemControls        = []
                  - user                  = "0"
                  - volumesFrom           = []
                },
            ]
        ) -> (known after apply) # forces replacement
      ~ enable_fault_injection   = false -> (known after apply)
      ~ id                       = "jfp-api-journeys-modern-prod" -> (known after apply)
      ~ revision                 = 17 -> (known after apply)
      - tags                     = {} -> null
      ~ tags_all                 = {} -> (known after apply)
        # (12 unchanged attributes hidden)
    }

  # module.prod.module.api-journeys-modern.module.ecs-task.aws_ssm_parameter.parameters["PG_DATABASE_URL_USERS"] will be created
+ resource "aws_ssm_parameter" "parameters" {
      + arn            = (known after apply)
      + data_type      = (known after apply)
      + has_value_wo   = (known after apply)
      + id             = (known after apply)
      + insecure_value = (known after apply)
      + key_id         = (known after apply)
      + name           = "/ecs/api-journeys/prod/PG_DATABASE_URL_USERS"
      + overwrite      = true
      + region         = "us-east-2"
      + tags           = {
          + "name" = "PG_DATABASE_URL_USERS"
        }
      + tags_all       = {
          + "name" = "PG_DATABASE_URL_USERS"
        }
      + tier           = (known after apply)
      + type           = "SecureString"
      + value          = (sensitive value)
      + value_wo       = (write-only attribute)
      + version        = (known after apply)
    }

  # module.prod.module.arclight.module.ecs-task.aws_ecs_service.ecs_service will be updated in-place
~ resource "aws_ecs_service" "ecs_service" {
      ~ desired_count                      = 2 -> 4
        id                                 = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-prod/arclight-prod-service"
        name                               = "arclight-prod-service"
        tags                               = {}
        # (18 unchanged attributes hidden)

        # (4 unchanged blocks hidden)
    }

  # module.stage.module.api-journeys-modern.module.ecs-task.aws_ecs_service.ecs_service will be updated in-place
~ resource "aws_ecs_service" "ecs_service" {
        id                                 = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-stage/api-journeys-modern-stage-service"
        name                               = "api-journeys-modern-stage-service"
        tags                               = {}
      ~ task_definition                    = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-stage:17" -> (known after apply)
        # (18 unchanged attributes hidden)

        # (4 unchanged blocks hidden)
    }

  # module.stage.module.api-journeys-modern.module.ecs-task.aws_ecs_task_definition.ecs_task_definition must be replaced
+/- resource "aws_ecs_task_definition" "ecs_task_definition" {
      ~ arn                      = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-stage:17" -> (known after apply)
      ~ arn_without_revision     = "arn:aws:ecs:us-east-2:410965620680:task-definition/jfp-api-journeys-modern-stage" -> (known after apply)
      ~ container_definitions    = jsonencode(
            [
              - {
                  - cpu              = 1024
                  - environment      = [
                      - {
                          - name  = "NODE_ENV"
                          - value = "production"
                        },
                      - {
                          - name  = "SERVICE_ENV"
                          - value = "stage"
                        },
                      - {
                          - name  = "SERVICE_NAME"
                          - value = "api-journeys-modern"
                        },
                    ]
                  - essential        = true
                  - image            = "410965620680.dkr.ecr.us-east-2.amazonaws.com/jfp-api-journeys-modern-stage:latest"
                  - logConfiguration = {
                      - logDriver     = "awsfirelens"
                      - options       = {
                          - Host        = "http-intake.logs.datadoghq.com"
                          - Name        = "datadog"
                          - TLS         = "on"
                          - compress    = "gzip"
                          - dd_service  = "api-journeys-modern"
                          - dd_source   = "graphql-yoga"
                          - dd_tags     = "env:stage"
                          - provider    = "ecs"
                          - retry_limit = "2"
                        }
                      - secretOptions = [
                          - {
                              - name      = "apikey"
                              - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                            },
                        ]
                    }
                  - memory           = 2048
                  - mountPoints      = []
                  - name             = "jfp-api-journeys-modern-stage-app"
                  - portMappings     = [
                      - {
                          - containerPort = 4004
                          - hostPort      = 4004
                          - protocol      = "tcp"
                        },
                    ]
                  - secrets          = [
                      - {
                          - name      = "AWS_ACCESS_KEY_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/AWS_ACCESS_KEY_ID"
                        },
                      - {
                          - name      = "AWS_SECRET_ACCESS_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/AWS_SECRET_ACCESS_KEY"
                        },
                      - {
                          - name      = "CLOUDFLARE_UPLOAD_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/CLOUDFLARE_UPLOAD_KEY"
                        },
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                      - {
                          - name      = "FACEBOOK_APP_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/FACEBOOK_APP_ID"
                        },
                      - {
                          - name      = "FACEBOOK_APP_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/FACEBOOK_APP_SECRET"
                        },
                      - {
                          - name      = "FIREBASE_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/FIREBASE_API_KEY"
                        },
                      - {
                          - name      = "GATEWAY_HMAC_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GATEWAY_HMAC_SECRET"
                        },
                      - {
                          - name      = "GATEWAY_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GATEWAY_URL"
                        },
                      - {
                          - name      = "GIT_BRANCH"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GIT_BRANCH"
                        },
                      - {
                          - name      = "GOOGLE_APPLICATION_JSON"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GOOGLE_APPLICATION_JSON"
                        },
                      - {
                          - name      = "GOOGLE_CLIENT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GOOGLE_CLIENT_ID"
                        },
                      - {
                          - name      = "GOOGLE_CLIENT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GOOGLE_CLIENT_SECRET"
                        },
                      - {
                          - name      = "GOOGLE_GENERATIVE_AI_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GOOGLE_GENERATIVE_AI_API_KEY"
                        },
                      - {
                          - name      = "GROWTH_SPACES_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/GROWTH_SPACES_URL"
                        },
                      - {
                          - name      = "INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/INTEGRATION_ACCESS_KEY_ENCRYPTION_SECRET"
                        },
                      - {
                          - name      = "INTEROP_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/INTEROP_TOKEN"
                        },
                      - {
                          - name      = "JOURNEYS_ADMIN_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/JOURNEYS_ADMIN_URL"
                        },
                      - {
                          - name      = "JOURNEYS_REVALIDATE_ACCESS_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/JOURNEYS_REVALIDATE_ACCESS_TOKEN"
                        },
                      - {
                          - name      = "JOURNEYS_SHORTLINK_DOMAIN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/JOURNEYS_SHORTLINK_DOMAIN"
                        },
                      - {
                          - name      = "JOURNEYS_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/JOURNEYS_URL"
                        },
                      - {
                          - name      = "MAILCHIMP_AUDIENCE_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/MAILCHIMP_AUDIENCE_ID"
                        },
                      - {
                          - name      = "MAILCHIMP_MARKETING_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/MAILCHIMP_MARKETING_API_KEY"
                        },
                      - {
                          - name      = "MAILCHIMP_MARKETING_API_SERVER_PREFIX"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/MAILCHIMP_MARKETING_API_SERVER_PREFIX"
                        },
                      - {
                          - name      = "NAT_ADDRESSES"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/NAT_ADDRESSES"
                        },
                      - {
                          - name      = "OPEN_AI_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/OPEN_AI_API_KEY"
                        },
                      - {
                          - name      = "PG_DATABASE_URL_JOURNEYS"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PG_DATABASE_URL_JOURNEYS"
                        },
                      - {
                          - name      = "PLAUSIBLE_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAUSIBLE_API_KEY"
                        },
                      - {
                          - name      = "PLAUSIBLE_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAUSIBLE_URL"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_2"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_2"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_3"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_3"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_4"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_4"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_5"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_5"
                        },
                      - {
                          - name      = "PLAYWRIGHT_USER_ID_6"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/PLAYWRIGHT_USER_ID_6"
                        },
                      - {
                          - name      = "POWER_BI_CLIENT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_CLIENT_ID"
                        },
                      - {
                          - name      = "POWER_BI_CLIENT_SECRET"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_CLIENT_SECRET"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_MULTIPLE_FULL_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_JOURNEYS_MULTIPLE_FULL_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_MULTIPLE_SUMMARY_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_JOURNEYS_MULTIPLE_SUMMARY_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_SINGLE_FULL_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_JOURNEYS_SINGLE_FULL_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_JOURNEYS_SINGLE_SUMMARY_REPORT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_JOURNEYS_SINGLE_SUMMARY_REPORT_ID"
                        },
                      - {
                          - name      = "POWER_BI_TENANT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_TENANT_ID"
                        },
                      - {
                          - name      = "POWER_BI_WORKSPACE_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/POWER_BI_WORKSPACE_ID"
                        },
                      - {
                          - name      = "REDIS_PORT"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/REDIS_PORT"
                        },
                      - {
                          - name      = "REDIS_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/REDIS_URL"
                        },
                      - {
                          - name      = "SMTP_URL"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/SMTP_URL"
                        },
                      - {
                          - name      = "VERCEL_JOURNEYS_PROJECT_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/VERCEL_JOURNEYS_PROJECT_ID"
                        },
                      - {
                          - name      = "VERCEL_TEAM_ID"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/VERCEL_TEAM_ID"
                        },
                      - {
                          - name      = "VERCEL_TOKEN"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/ecs/api-journeys/stage/VERCEL_TOKEN"
                        },
                    ]
                  - systemControls   = []
                  - volumesFrom      = []
                },
              - {
                  - environment       = [
                      - {
                          - name  = "DD_APM_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_APM_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_DOGSTATSD_NON_LOCAL_TRAFFIC"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_LOGS_INJECTION"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_GRPC_ENDPOINT"
                          - value = "0.0.0.0:4317"
                        },
                      - {
                          - name  = "DD_OTLP_CONFIG_RECEIVER_PROTOCOLS_HTTP_ENDPOINT"
                          - value = "0.0.0.0:4318"
                        },
                      - {
                          - name  = "DD_PROCESS_AGENT_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_PROFILING_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_RUNTIME_METRICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "DD_TAGS"
                          - value = "env:stage app:api-journeys-modern"
                        },
                      - {
                          - name  = "DD_TRACE_ANALYTICS_ENABLED"
                          - value = "true"
                        },
                      - {
                          - name  = "ECS_FARGATE"
                          - value = "true"
                        },
                    ]
                  - essential         = true
                  - image             = "public.ecr.aws/datadog/agent:latest"
                  - logConfiguration  = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "api-journeys-modern-stage-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation = 128
                  - mountPoints       = []
                  - name              = "jfp-api-journeys-modern-stage-datadog-agent"
                  - portMappings      = [
                      - {
                          - containerPort = 4317
                          - hostPort      = 4317
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 4318
                          - hostPort      = 4318
                          - protocol      = "tcp"
                        },
                      - {
                          - containerPort = 8125
                          - hostPort      = 8125
                          - protocol      = "udp"
                        },
                    ]
                  - secrets           = [
                      - {
                          - name      = "DD_API_KEY"
                          - valueFrom = "arn:aws:ssm:us-east-2:410965620680:parameter/terraform/prd/DATADOG_API_KEY"
                        },
                    ]
                  - systemControls    = []
                  - volumesFrom       = []
                },
              - {
                  - environment           = []
                  - essential             = true
                  - firelensConfiguration = {
                      - options = {
                          - config-file-type        = "file"
                          - config-file-value       = "/fluent-bit/configs/parse-json.conf"
                          - enable-ecs-log-metadata = "true"
                        }
                      - type    = "fluentbit"
                    }
                  - image                 = "amazon/aws-for-fluent-bit:stable"
                  - logConfiguration      = {
                      - logDriver = "awslogs"
                      - options   = {
                          - awslogs-group         = "api-journeys-modern-stage-logs"
                          - awslogs-region        = "us-east-2"
                          - awslogs-stream-prefix = "core"
                        }
                    }
                  - memoryReservation     = 100
                  - mountPoints           = []
                  - name                  = "jfp-api-journeys-modern-stage-log-router"
                  - portMappings          = []
                  - systemControls        = []
                  - user                  = "0"
                  - volumesFrom           = []
                },
            ]
        ) -> (known after apply) # forces replacement
      ~ enable_fault_injection   = false -> (known after apply)
      ~ id                       = "jfp-api-journeys-modern-stage" -> (known after apply)
      ~ revision                 = 17 -> (known after apply)
      - tags                     = {} -> null
      ~ tags_all                 = {} -> (known after apply)
        # (12 unchanged attributes hidden)
    }

  # module.stage.module.api-journeys-modern.module.ecs-task.aws_ssm_parameter.parameters["PG_DATABASE_URL_USERS"] will be created
+ resource "aws_ssm_parameter" "parameters" {
      + arn            = (known after apply)
      + data_type      = (known after apply)
      + has_value_wo   = (known after apply)
      + id             = (known after apply)
      + insecure_value = (known after apply)
      + key_id         = (known after apply)
      + name           = "/ecs/api-journeys/stage/PG_DATABASE_URL_USERS"
      + overwrite      = true
      + region         = "us-east-2"
      + tags           = {
          + "name" = "PG_DATABASE_URL_USERS"
        }
      + tags_all       = {
          + "name" = "PG_DATABASE_URL_USERS"
        }
      + tier           = (known after apply)
      + type           = "SecureString"
      + value          = (sensitive value)
      + value_wo       = (write-only attribute)
      + version        = (known after apply)
    }

  # module.stage.module.arclight.module.ecs-task.aws_ecs_service.ecs_service will be updated in-place
~ resource "aws_ecs_service" "ecs_service" {
      ~ desired_count                      = 1 -> 4
        id                                 = "arn:aws:ecs:us-east-2:410965620680:service/jfp-ecs-cluster-stage/arclight-stage-service"
        name                               = "arclight-stage-service"
        tags                               = {}
        # (18 unchanged attributes hidden)

        # (4 unchanged blocks hidden)
    }

Plan: 4 to add, 4 to change, 2 to destroy.
╷
│ Warning: Deprecated Resource
│ 
│   with module.datadog.datadog_integration_aws.sandbox,
│   on modules/aws/datadog/main.tf line 118, in resource "datadog_integration_aws" "sandbox":
│  118: resource "datadog_integration_aws" "sandbox" {
│ 
│ **This resource is deprecated - use the `datadog_integration_aws_account`
│ resource instead**:
│ https://registry.terraform.io/providers/DataDog/datadog/latest/docs/resources/integration_aws_account
╵
╷
│ Warning: Deprecated attribute
│ 
│   on .terraform/modules/datadog.datadog_log_forwarder/modules/log_forwarder/main.tf line 2, in locals:
│    2:   bucket_name = var.bucket_name != "" ? var.bucket_name : "datadog-forwarder-${data.aws_caller_identity.current.account_id}-${data.aws_region.current.name}"
│ 
│ The attribute "name" is deprecated. Refer to the provider documentation for
│ details.
│ 
│ (and 2 more similar warnings elsewhere)
╵
  • ▶️ To apply this plan, comment:
    atlantis apply -d infrastructure
  • 🚮 To delete this plan and lock, click here
  • 🔁 To plan this project again, comment:
    atlantis plan -d infrastructure

Plan: 4 to add, 4 to change, 2 to destroy.


  • ⏩ To apply all unapplied plans from this Pull Request, comment:
    atlantis apply
  • 🚮 To delete all plans and locks from this Pull Request, comment:
    atlantis unlock

@stage-branch-merger
Copy link

I see you added the "on stage" label, I'll get this merged to the stage branch!

@jesus-film-bot
Copy link

Ran Plan for dir: infrastructure workspace: default

Plan Failed: This project is currently locked by an unapplied plan from pull #8604. To continue, delete the lock from #8604 or apply that plan and merge the pull request.

Once the lock is released, comment atlantis plan here to re-plan.

@jesus-film-bot
Copy link

Ran Plan for dir: infrastructure workspace: default

Plan Failed: This project is currently locked by an unapplied plan from pull #8604. To continue, delete the lock from #8604 or apply that plan and merge the pull request.

Once the lock is released, comment atlantis plan here to re-plan.

@mikeallisonJS mikeallisonJS merged commit 8c30680 into main Jan 16, 2026
23 checks passed
@mikeallisonJS mikeallisonJS deleted the mikeallison/prj-2784-playwright-cleanup-worker branch January 16, 2026 19:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants