​efs_iam_authorizationboolean · Ravion Docs

Type: rvn-ecs-web · Latest version: 1.1.0

Dependencies and consumers

Every dependency input can be specified manually to reference existing external infrastructure rather than a Ravion module.

Readme

Web server ECS service for running an HTTP application behind an ECS cluster load balancer.

Overview

The ECS Web Server module creates an ECS service for HTTP traffic in an existing Ravion ECS cluster. Select an ECS cluster, choose how the container image is built or supplied, configure routing and health checks, and Ravion provisions the service, target group, listener rule, IAM roles, security group, ECR repository when needed, and autoscaling settings. The module is intentionally focused on web services behind an Application Load Balancer. It uses the selected ECS cluster to inherit AWS account, region, VPC, subnets, capacity providers, load balancer listeners, and load balancer security groups. Terraform source: ravionhq/modules/compute/ecs_service

Use cases

ScenarioECS Web Server helps by…
Deploying a public web appRouting host or path traffic through the public cluster ALB
Hosting an internal HTTP serviceRouting private traffic through the private cluster ALB
Building from sourceCreating images with Railpack or a Dockerfile and pushing to ECR
Bringing an existing imageDeploying a public or private registry image by tag or digest
Tuning production capacityCombining Fargate, Fargate Spot, or EC2 with autoscaling
Running release tasksRunning pre-deploy or post-deploy ECS tasks with the app image
Debugging running tasksEnabling ECS Exec when shell access is needed

Cluster and networking

An ECS cluster is required. The cluster reference supplies the cluster ARN, VPC ID, public and private subnet IDs, load balancer listeners, load balancer security groups, capacity provider names, AWS account, region, and execution environment. Use Public web service when the service should be reachable through the public Application Load Balancer. Turn it off for internal services that should use the private Application Load Balancer. Use Run in private subnets for most production services. Private subnets keep tasks off the public internet and route outbound traffic through NAT or equivalent egress. Turning it off runs tasks in public subnets and assigns public IPs.

Build and image options

Build sourceWhen to use it
RailpackLet Ravion detect the app stack and build an image from source with Railpack
DockerfileBuild from a Dockerfile in the selected repository
Pull from image registryDeploy an existing image from Docker Hub, GHCR, ECR, or registry

For Railpack and Dockerfile builds, provide Git repository, Git branch, and optionally Base path. Ravion pushes built images to the service ECR repository and deploys by image digest. Railpack settings let you optionally pin the Railpack version and override install, build, and start commands. Leave them blank to use Railpack defaults and autodetection. For Pull from image registry, provide the image repository without the tag. At deploy time, provide the tag to use. Use Registry credentials secret ARN for private registries that require ECS repository credentials. Use Start command to override the image default CMD when the image needs a different service command.

Routing and health checks

The service always attaches to an Application Load Balancer target group. Route traffic with Domain host rules, Path rules, or both. If both host and path rules are empty, Ravion creates a default /* path rule so the listener rule has a valid condition. Use Listener rule priority only when you need a specific ALB rule order; otherwise AWS assigns the next available priority. Health check settings control when the load balancer considers tasks healthy:

FieldDefaultDescription
Container port80Port the container listens on; PORT is added automatically
Health check path/Lightweight HTTP endpoint the load balancer checks
Success codes200-399Status codes treated as healthy
Interval (secs)5Seconds between checks
Timeout (secs)4Seconds to wait for a response
Healthy threshold2Successful checks needed to mark a target healthy
Unhealthy threshold2Failed checks needed to mark a target unhealthy
Health check grace period (secs)0Startup window where ECS ignores load balancer health failures

Increase the grace period for apps with slow boot times. Keep health check endpoints lightweight and unauthenticated.

Capacity and runtime

Choose one primary Capacity provider:

Capacity providerBest for
FargateSimple serverless containers and predictable web services
Fargate spotLower-cost services that can tolerate task interruption
EC2Workloads that need cluster EC2 capacity or host-level control

You can add secondary providers with Also use Fargate, Also use Fargate spot, and Also use EC2. Mixed strategies can reduce cost or increase placement flexibility, but each enabled provider must exist on the selected cluster. For Fargate and Fargate Spot, App size defaults to 2 vCPU and 4 GB memory. App ephemeral storage uses the AWS default of 20 GiB unless you increase it to 21-200 GiB. For EC2 capacity, App vCPU defaults to 1.5 and App memory in GB defaults to 3.5; leave spare CPU and memory on each EC2 instance for the ECS agent and system processes. CPU architecture defaults to x86_64 for broad compatibility. Choose ARM64 only when the image and native dependencies support it.

Autoscaling

Autoscaling is enabled by default with one minimum task and three maximum tasks. For production, start with at least two minimum tasks when availability matters. When autoscaling is disabled, Desired tasks controls how many web tasks the ECS service keeps running.

FieldDefaultDescription
AutoscalingtrueEnables ECS service target tracking
Minimum tasks1Lower bound for running tasks
Maximum tasks3Upper bound for running tasks
Desired tasks1Running tasks when autoscaling is disabled
CPU target (%)70Average CPU utilization target
Memory target (%)80Average memory utilization target
Scale-in cooldown (secs)300Delay before another scale-in action
Scale-out cooldown (secs)300Delay before another scale-out action
Scale-in disabledfalsePrevents autoscaling from reducing task count

Application configuration

Use Runtime environment variables for plain container environment values. Ravion also sets PORT from Container port. Use Runtime secrets for sensitive values. Secrets are injected into the ECS task from SSM Parameter Store or Secrets Manager using name and value_from objects. Use Build environment variables for values needed during image builds. Values can be plain strings or references loaded from Parameter Store or Secrets Manager. For Dockerfile builds, enable Inject environment variables in Dockerfile to pass those values as Docker build arguments.

Persistent storage

Enable the EFS file system setting, select a Ravion EFS module, and set the EFS mount path. Ravion adds the task volume, mounts it into the app container, attaches the file system’s client security group to the service so NFS traffic is allowed, and mounts through the file system’s access point when one is enabled. Sidecars mount the same file system through their Mount points setting with efs as the source volume. EFS volumes work with Fargate and EC2 Linux tasks and keep data across task replacement. Transit encryption is enabled by default. Enable EFS IAM authorization to authorize file system access with the task role; the task role must allow elasticfilesystem:ClientMount, plus elasticfilesystem:ClientWrite or elasticfilesystem:ClientRootAccess as needed.

Deployment

Deployment strategy defaults to Rolling. Blue/green, Linear, and Canary use the native ECS traffic-shift controller with production and alternate target groups. The deployment strategy can change between deploys without changing Terraform infrastructure. Deployments update the ECS service task definition with the selected image, generated container definition, awslogs configuration, runtime platform, environment variables, secrets, and capacity-provider-compatible task settings. The deploy-time Image value depends on the build source:

Build sourceDeploy image value
Railpack or DockerfileImage digest such as sha256:…
Pull from image registryTag for the configured repository, such as latest
DisabledFull image URI, ideally pinned by digest

Run pre-deploy command and Run post-deploy command start optional one-off ECS tasks before or after each deployment. These commands use the deployed app image, the app container name, the configured task role and execution role, the selected capacity provider strategy, service subnets, service security groups, runtime environment variables, and runtime secrets. Leave either toggle disabled to skip that hook and hide its settings. Use pre-deploy commands for work that must complete before the service updates, such as database migrations. Use post-deploy commands for work that should happen after a successful deployment, such as cache warming. Commands are ECS command argument arrays. For shell behavior, use /bin/sh, -lc, and your shell command as separate arguments. Hook-specific environment variables are appended to the app container override for the one-off task. Optional hook CPU, memory, ephemeral storage, and timeout settings let release tasks use different resources from the web service without changing the steady-state app task.

Standby validation traffic

For Blue/green, Linear, and Canary deployments, Ravion creates a test listener rule on the same Application Load Balancer listener as the production rule. During the test traffic stage, requests that match the service’s normal Domain host rules and Path rules and include the standby selector route to the standby, or green, task set on the alternate target group. By default, the standby selector is the query parameter __x-rvn-test__=1. For example, if production traffic uses https://app.example.com/health, validate the standby service with:

The alternate target group only has registered targets while ECS is running a traffic-shift deployment. Outside that window, the standby route may have no healthy targets. Use Advanced Terraform variables to override the standby selector. Values in Advanced Terraform variables override the generated Terraform variables for the service. To use a different query parameter:

Then validate standby traffic with ?preview=green. To use an HTTP header instead of a query parameter:

Then send requests with X-Ravion-Test: 1. A service can use either the query-string selector or the header selector, not both at once.

Sticky sessions and traffic shifts

The module definition sets Sticky sessions to true by default. When that setting is enabled, Ravion configures target-group stickiness for the service’s production and alternate target groups, so the load balancer keeps repeat requests on the same task when possible. With the default Load balancer cookie stickiness type, the target-level cookie is AWSALB; AWS may also set AWSALBCORS for CORS support. With Application cookie stickiness, the target-level cookie is the configured Application cookie name, and AWS may also set AWSALBAPP-* cookies. During Blue/green, Linear, and Canary deployments, Ravion also enables ALB group stickiness on the production and standby listener rule forward actions when Sticky sessions is enabled. A client that first reaches the production target group or the alternate target group keeps using that same group for the stickiness cookie duration, even while the deployment’s weighted traffic shift changes for new clients. The ALB group stickiness cookie is AWSALBTG. For CORS requests, AWS may also set AWSALBTGCORS. Application cookie name applies only to app_cookie stickiness inside the selected target group; the ALB group stickiness cookie name is managed by AWS and cannot be changed. To clear stickiness for a browser, open the browser developer tools, go to Application or Storage > Cookies for the service domain, and delete the relevant cookies: AWSALBTG and AWSALBTGCORS for ALB group stickiness; AWSALB and AWSALBCORS for the default target-level stickiness; and the configured Application cookie name plus any AWSALBAPP-* cookies when Application cookie stickiness is selected. For API clients, remove those cookie names from the cookie jar or stop sending them in the Cookie header. The next request can then enter the current traffic split like a new client. If Sticky sessions is turned off, Ravion does not enable target-group stickiness or ALB group stickiness for this behavior.

Builder settings

Builder settings apply to Railpack and Dockerfile builds.

FieldDefaultDescription
Builder instance typeec2Use EC2 for normal builds or EC2 spot for lower cost
Builder instance sizec7a.4xlargeEC2 instance size used for builds
Builder execution environmentCluster valueOptional override for where image builds run
Builder AMIDefault imageOptional AMI override for build runners

Start with the default builder size, then adjust based on build duration and resource usage.

Configuration

FieldRequiredDefaultDescription
Public web serviceNotrueUse the public ALB; turn off for the private ALB
Run in private subnetsNotrueRun tasks in private subnets without public IPs
Service nameYes{project}-{env}-{module}Name for the ECS service and related resources
ECS clusterYes-Existing rvn-ecs-cluster module instance
Build sourceYesdockerfileDockerfile, Railpack, Pull from image registry, or Disabled
Git repositoryYes*-Required for Railpack and Dockerfile builds
Git branchYes*-Required for Railpack and Dockerfile builds
Source base pathNo.Path from repository root to source code
Railpack versionNoRavion defaultOptional version for Railpack builds
Image repositoryYes*nginxRequired for image registry deployments
Start commandNo[]Command arguments that override an image default CMD
Container portYes80Port exposed by the app container
Health check pathYes/HTTP path used by the target group health check
Sticky sessionsNotrueKeep clients on the same task, and on the same traffic-shift target group when enabled
Domain host rulesNo-Hostnames such as app.example.com or *.example.com
Path rulesNo-Path patterns such as /, /api/, or /app/*
Capacity providerYesfargatePrimary service capacity provider
App sizeNo2 vCPU, 4 GBFargate task CPU and memory
App ephemeral storage (GiB)No20Fargate task ephemeral storage
App vCPUYes*1.5Required for EC2 capacity
App memory in GBYes*3.5Required for EC2 capacity
CPU architectureNoX86_64x86_64 compatibility or ARM64 cost optimization
ECS execNofalseEnable ECS Exec for debugging containers
Run pre-deploy commandNofalseEnable a task before each deployment
Pre-deploy command argumentsYes*[]Command arguments run before each deployment
Pre-deploy environment variablesNo[]Extra environment variables for the pre-deploy task
Pre-deploy CPU unitsNoApp task CPUCPU override for the pre-deploy task
Pre-deploy memory (MiB)NoApp task memoryMemory override for the pre-deploy task
Pre-deploy ephemeral storageNoTask definition defaultEphemeral storage override for the pre-deploy task
Pre-deploy timeout (secs)No1800Maximum pre-deploy task wait time
Run post-deploy commandNofalseEnable a task after each successful deployment
Post-deploy command argumentsYes*[]Command arguments run after each successful deployment
Post-deploy environment variablesNo[]Extra environment variables for the post-deploy task
Post-deploy CPU unitsNoApp task CPUCPU override for the post-deploy task
Post-deploy memory (MiB)NoApp task memoryMemory override for the post-deploy task
Post-deploy ephemeral storageNoTask definition defaultEphemeral storage override for the post-deploy task
Post-deploy timeout (secs)No1800Maximum post-deploy task wait time
AutoscalingNotrueEnable CPU and optional memory target tracking
Desired tasksYes*1Number of web tasks when autoscaling is disabled
Deployment strategyYesrollingRolling, Blue/green, Linear, or Canary
EFS file systemNofalseMount an EFS file system into the app container
EFS mount pathYes*/mnt/efsApp container path for the referenced file system
TagsNoStandard Ravion tagsAdditional tags applied to resources
Advanced Terraform variablesNo{}Raw lower-level overrides for exceptional cases
OpenTofu version overrideNoRavion defaultOverride the OpenTofu version for the stack
Ravion Terraform workspace nameNo{project}-{env}-{module}Override the state backend workspace name

*Conditionally required based on the selected build source or capacity provider.

Design decisions

  • The module always models an HTTP web service behind an Application Load Balancer. NLB, worker, and service discovery patterns are intentionally outside this module definition.
  • Tasks default to private subnets even for public web services. The ALB is public; the tasks remain private when the VPC has NAT or equivalent egress.
  • Built images are pushed to an ECR repository created with the service stack. Pull from image registry lets teams bring their own image pipeline.
  • Desired count uses the autoscaling minimum when autoscaling is enabled and the Desired tasks input when autoscaling is disabled.
  • Advanced Terraform variables exist for exceptional lower-level overrides. Prefer the typed Ravion fields whenever possible.

Learn more

Inputs reference

All inputs for rvn-ecs-web version 1.1.0. Use the name shown for each field as the input key in module config.

ECS cluster

$ref:rvn-ecs-cluster

required

ECS cluster.

  • Immutable after creation

Web service

string

required

Service name. Name for the ECS service and related resources.

  • Default: <<project.given_id>>-<<environment.given_id>>-<<module.given_id>>
  • Immutable after creation
  • Pattern: ^[A-Za-z0-9][A-Za-z0-9_-]{0,254}$ — Use 1-255 letters, numbers, underscores, or hyphens, starting with a letter or number.

boolean

Public web service. Expose this service through the public ALB. Turn off to use the private ALB.

  • Default: true

boolean

Run in private subnets. Recommended. Requires a NAT gateway or equivalent for internet access and a static IP.

  • Default: true

Build config

string

required

Build source.

  • Default: dockerfile
  • Allowed values: dockerfile (Dockerfile), railpack (Railpack), image_registry (Pull from image registry)

gitrepo

required

Git repository. Repository containing the application source for Dockerfile or Railpack builds.

  • Shown when: {"build_source":["dockerfile","railpack"]}

string

Source base path. Repository-relative source and build root.

  • Default: .
  • Shown when: {"build_source":["dockerfile","railpack"]}

string

required

Image repository. Image repository without a tag or digest, such as nginx, ghcr.io/org/app, or 123456789012.dkr.ecr.us-east-1.amazonaws.com/app.

  • Shown when: {"build_source":"image_registry"}

string

Registry credentials secret ARN. Secrets Manager secret ARN for private registries such as GHCR or Docker Hub. The secret must use the ECS repository credentials JSON format. Not needed for public images or normal same-account ECR.

  • Shown when: {"build_source":"image_registry"}

string_array

Start command. Optional command arguments that override the image default command. For shell behavior, use /bin/sh, -lc, and your command string as separate arguments.

  • Default: []
  • Shown when: {"build_source":"image_registry"}

Docker

string

Dockerfile path. Path to the Dockerfile to use for the build, relative to the repository root or configured source base path.

  • Shown when: {"build_source":"dockerfile"}

string

Docker build context path. Directory to use as the Docker build context, relative to the repository root or configured source base path.

  • Shown when: {"build_source":"dockerfile"}

Railpack

string

Railpack version. Optional Railpack version to use for the build. Leave blank to use the Ravion default.

  • Pattern: ^(|latest|v?[0-9]+\.[0-9]+\.[0-9]+(?:[-+][0-9A-Za-z.-]+)?)$ — Leave blank, use latest, a semantic version like 0.29.0, or a v-prefixed version like v0.29.0.
  • Shown when: {"build_source":"railpack"}

string

Install command. Optional dependency installation command. Leave blank to use Railpack detection.

  • Shown when: {"build_source":"railpack"}

string

Build command. Optional application build command. Leave blank to use Railpack detection.

  • Shown when: {"build_source":"railpack"}

string

Start command.

  • Shown when: {"build_source":"railpack"}

Deployment

string

required

Deployment strategy. Choose how traffic moves from the current deployment to the new deployment.

  • Default: rolling
  • Allowed values: rolling (Rolling), blue_green (Blue/green), linear (Linear), canary (Canary)

number

Bake time in minutes. Minutes to keep the current and new deployments running after production traffic has fully shifted, before the old deployment is removed.

  • Default: 10
  • Min: 0
  • Max: 1440
  • Shown when: {"deployment_strategy":["blue_green","linear","canary"]}

number

Linear step percentage. Percentage of production traffic to move to the new deployment at each linear step.

  • Default: 20
  • Min: 1
  • Max: 100
  • Shown when: {"deployment_strategy":"linear"}

number

Linear step bake time in minutes. Minutes to wait between linear traffic steps before shifting the next percentage.

  • Default: 5
  • Min: 0
  • Max: 1440
  • Shown when: {"deployment_strategy":"linear"}

number

Canary percent. Percentage of production traffic to send to the new deployment during the canary phase.

  • Default: 5
  • Min: 1
  • Max: 100
  • Shown when: {"deployment_strategy":"canary"}

number

Canary bake time in minutes. Minutes to hold canary traffic before shifting the remaining production traffic to the new deployment.

  • Default: 10
  • Min: 0
  • Max: 1440
  • Shown when: {"deployment_strategy":"canary"}

object_array

Manual approval gates. Optional gates that pause the deployment at chosen lifecycle stages until you approve it. Applies only to the blue/green, linear, and canary strategies.

  • Default: [{"stage":"POST_TEST_TRAFFIC_SHIFT","timeout_action":"ROLLBACK","timeout_in_minutes":1440}]
  • Shown when: {"deployment_strategy":["blue_green","linear","canary"]}

Show item fields

string

Stage. Deployment lifecycle stage at which to pause and wait for manual approval.

  • Default: POST_TEST_TRAFFIC_SHIFT
  • Allowed values: RECONCILE_SERVICE (Reconcile service), PRE_SCALE_UP (Pre scale up), POST_SCALE_UP (Post scale up), POST_TEST_TRAFFIC_SHIFT (Post test traffic shift), PRE_PRODUCTION_TRAFFIC_SHIFT (Pre production traffic shift), POST_PRODUCTION_TRAFFIC_SHIFT (Post production traffic shift)

number

required

Timeout (minutes). Minutes to wait for manual approval before the timeout action runs. Matches the AWS default of 1,440 minutes (24 hours).

  • Default: 1440
  • Min: 1
  • Max: 20160

string

required

On timeout. Action to take if approval is not given before the timeout elapses. Defaults to rolling back.

  • Default: ROLLBACK
  • Allowed values: ROLLBACK (Roll back), CONTINUE (Continue)

Health check

number

required

Container port. Port the web container listens on.

  • Default: 80
  • Min: 1
  • Max: 65535
  • Immutable after creation

string

required

Health check path. HTTP path the load balancer calls to verify the web server is healthy. Use a lightweight endpoint that does not require authentication.

  • Default: /

string

required

Success codes. HTTP status code matcher for successful health checks. Defaults to 200-399 so redirects and common successful responses are accepted.

  • Default: 200-399

number

Interval (secs). Seconds between load balancer health checks. Lower values detect failures faster but send more health-check traffic.

  • Default: 5
  • Min: 5
  • Max: 300

number

Timeout (secs). Seconds to wait for the health-check response before marking that check as failed. Must be lower than the interval.

  • Default: 4
  • Min: 2
  • Max: 120

number

Healthy threshold. Number of consecutive successful checks required before an unhealthy target is considered healthy.

  • Default: 2
  • Min: 2
  • Max: 10

number

Unhealthy threshold. Number of consecutive failed checks required before a target is considered unhealthy.

  • Default: 2
  • Min: 2
  • Max: 10

number

Health check grace period (secs). Seconds ECS ignores failing load balancer health checks after a task starts. Increase this for apps with slow boot times.

  • Default: 0
  • Min: 0

number

Slow start duration (secs). Gradually ramps traffic to newly registered targets. Use 0 to disable.

  • Default: 0
  • Min: 0
  • Max: 900

boolean

Sticky sessions. Enable load balancer cookie stickiness so repeat requests are routed to the same task when possible. When enabled, traffic-shift deployments also keep clients on the first production or alternate target group they reach.

  • Default: true

string

Stickiness type.

  • Default: lb_cookie
  • Allowed values: lb_cookie (Load balancer cookie), app_cookie (Application cookie)
  • Shown when: {"target_group_stickiness_enabled":true}

number

Stickiness cookie duration (secs).

  • Default: 86400
  • Min: 1
  • Max: 604800
  • Shown when: {"target_group_stickiness_enabled":true}

string

Application cookie name.

  • Shown when: {"target_group_stickiness_type":"app_cookie"}

HTTP listener rules

Domain host rules. Hostnames that should route to this service, such as app.example.com or *.example.com. Leave empty to use path-based routing.

string_array

Path rules. Path patterns that should route to this service, such as /, /api/, or /app/. If both domain host rules and path rules are empty, the service routes all paths with /.

number

Listener rule priority. Optional ALB listener rule priority. Leave blank to let AWS assign the next available priority.

  • Min: 1
  • Max: 50000

Container resources

string

required

Capacity provider. Choose the primary capacity provider. Most services should use only one provider.

  • Default: fargate
  • Allowed values: fargate (Fargate), fargate_spot (Fargate spot), ec2 (EC2)

boolean

Also use Fargate. Add Fargate to the capacity provider strategy in addition to the primary provider.

  • Default: false
  • Shown when: {"capacity_provider":{"not":"fargate"}}

boolean

Also use Fargate spot. Add lower-cost interruptible Fargate spot capacity in addition to the primary provider.

  • Default: false
  • Shown when: {"capacity_provider":{"not":"fargate_spot"}}

boolean

Also use EC2. Add EC2 capacity from the selected cluster in addition to the primary provider.

  • Default: false
  • Shown when: {"capacity_provider":{"not":"ec2"}}

compound

required

App size. CPU and memory for Fargate tasks. Prices are estimated from AWS Fargate pricing for the selected region, architecture, and capacity provider.

  • Default: {"memory_gb":4,"vcpu":2}
  • Shown when: {"capacity_provider":["fargate","fargate_spot"]}

number

App ephemeral storage (GiB). Optional ephemeral storage size for each Fargate app task, from 21 to 200 GiB. Leave blank to use the AWS default of 20 GiB.

  • Min: 21
  • Max: 200
  • Shown when: {"capacity_provider":["fargate","fargate_spot"]}

string

required

App vCPU. vCPU reserved for each app task on EC2 capacity. Leave at least 0.25 vCPU unreserved on each EC2 instance for the ECS agent and system processes.

  • Default: 1.5
  • Pattern: ^(?:0|[1-9][0-9]*)(?:\.[0-9]+)?$ — Enter a vCPU value, such as 0.5, 1, or 2.
  • Shown when: {"capacity_provider":"ec2"}

string

required

App memory in GB. Memory reserved for each app task on EC2 capacity. Leave at least 0.5 GB unreserved on each EC2 instance for the ECS agent and system processes.

  • Default: 3.5
  • Pattern: ^(?:0|[1-9][0-9]*)(?:\.[0-9]+)?$ — Enter a memory value in GB, such as 0.5, 1, or 4.
  • Shown when: {"capacity_provider":"ec2"}

string

CPU architecture. Use x86_64 for broad compatibility; use ARM64 for lower cost when your image and dependencies support it.

  • Default: X86_64
  • Allowed values: X86_64 (x86_64 - widest compatibility), ARM64 (ARM64 - lower cost)

boolean

ECS exec. Enable ECS Exec for interactive debugging in running containers. Leave off by default for tighter access control; turn on when operators need shell/debug access through AWS Systems Manager.

  • Default: false

Autoscaling

boolean

Autoscaling.

  • Default: true

number

Minimum tasks. Recommend at least 2 for production.

  • Default: 1
  • Min: 0
  • Shown when: {"auto_scaling_enabled":true}

number

Maximum tasks.

  • Default: 3
  • Min: 1
  • Shown when: {"auto_scaling_enabled":true}

number

Desired tasks. Number of tasks to keep running when autoscaling is disabled.

  • Default: 1
  • Min: 1
  • Shown when: {"auto_scaling_enabled":false}

number

CPU target (%).

  • Default: 70
  • Min: 1
  • Max: 100
  • Shown when: {"auto_scaling_enabled":true}

number

Memory target (%). Target average memory utilization for memory-based autoscaling. Leave blank to disable memory autoscaling.

  • Default: 80
  • Min: 1
  • Max: 100
  • Shown when: {"auto_scaling_enabled":true}

number

Scale-in cooldown (secs). Time after a scale-in activity before another scale-in can happen. AWS defaults ECS target tracking cooldowns to 300 secs; start here for production and tune if needed.

  • Default: 300
  • Min: 0
  • Shown when: {"auto_scaling_enabled":true}

number

Scale-out cooldown (secs). Time after a scale-out activity before another scale-out can happen. AWS defaults ECS target tracking cooldowns to 300 secs; start here for production and tune if needed.

  • Default: 300
  • Min: 0
  • Shown when: {"auto_scaling_enabled":true}

boolean

Scale in. Allow autoscaling to reduce task count automatically.

  • Default: true
  • Shown when: {"auto_scaling_enabled":true}

object_array

Scheduled scaling actions. Optional Application Auto Scaling scheduled actions for the ECS service desired count. Each action sets a recurring, one-time, or rate-based schedule and may update the minimum capacity, maximum capacity, or both.

  • Default: []
  • Shown when: {"auto_scaling_enabled":true}

Show item fields

string

required

Action name. Unique scheduled action name for this ECS service scalable target. AWS allows 1-256 characters and rejects leading/trailing spaces, control characters, colon, slash, and pipe.

  • Pattern: ^(?! )(?!.* $)(?!.*[\x00-\x1F\x7F-\x9F:/|]).{1,256}$ — Use 1-256 characters with no leading/trailing spaces and no control characters, colon, slash, or pipe.

string

required

Schedule expression. Application Auto Scaling schedule expression: at(yyyy-mm-ddThh:mm:ss), rate(value unit), or cron(fields). Cron normally uses six fields: minutes, hours, day-of-month, month, day-of-week, year.

  • Pattern: ^(at\(.+\)|rate\([1-9][0-9]* (minute|minutes|hour|hours|day|days)\)|cron\(.+\))$ — Use at(…), rate(value minute|minutes|hour|hours|day|days), or cron(…).

number

Minimum capacity. Optional desired-count floor to apply when this action runs. Set minimum capacity, maximum capacity, or both.

  • Min: 0

number

Maximum capacity. Optional desired-count ceiling to apply when this action runs. Set maximum capacity, minimum capacity, or both.

  • Min: 0

string

Time zone. IANA/Joda-Time canonical time zone used for at() and cron() expressions. Defaults to UTC. Does not affect start_time or end_time.

  • Default: UTC
  • Pattern: ^[A-Za-z_+-]+(?:/[A-Za-z0-9_+.-]+)*$ — Use a canonical IANA/Joda-Time time zone such as UTC, America/New_York, Etc/GMT+9, or Pacific/Tahiti.

string

Start time. Optional UTC boundary for when a recurring scheduled action starts. Terraform expects RFC 3339 format and this value is not affected by timezone.

  • Pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$ — Use UTC RFC 3339 format, for example 2026-01-02T15:04:05Z.

string

End time. Optional UTC boundary for when a recurring scheduled action stops. Terraform expects RFC 3339 format and this value is not affected by timezone.

  • Pattern: ^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?Z$ — Use UTC RFC 3339 format, for example 2026-01-02T23:04:05Z.

object_array

Custom metric scaling policies. Additional target tracking scaling policies using custom CloudWatch metrics. Each policy must use a metric that changes proportionally with ECS service capacity.

  • Default: []
  • Shown when: {"auto_scaling_enabled":true}

Show item fields

string

required

Policy name. Application Auto Scaling policy name. Terraform/AWS require 1-255 characters and this name must be unique for the scalable target.

  • Pattern: ^.{1,255}$ — Use 1-255 characters.

number

required

Target value. Target value for the custom metric. Choose a value appropriate for the CloudWatch metric, such as desired average queue depth per task.

object

required

Custom metric. CloudWatch customized metric specification supported by this Terraform module: metric_name, namespace, statistic, and optional dimensions map. Statistic must be Average, Minimum, Maximum, SampleCount, or Sum.

  • Default: {"dimensions":{}}

number

Scale-in cooldown seconds. Seconds after a scale-in activity completes before another scale-in activity can start.

  • Default: 300
  • Min: 0

number

Scale-out cooldown seconds. Seconds to wait for a previous scale-out activity to take effect.

  • Default: 300
  • Min: 0

boolean

Scale in. Allow this target tracking policy to remove running tasks automatically.

  • Default: true

Environment variables

object

Build environment variables. Environment variables available during builds. Values can be plain strings or references loaded from Parameter Store or Secrets Manager.

boolean

Inject environment variables in Dockerfile. Pass build environment variables into Dockerfile builds as build arguments.

  • Default: false
  • Shown when: {"build_source":"dockerfile"}

array

Runtime environment variables. Runtime environment variables passed to the app container. PORT is added automatically from the container port setting.

array

Runtime secrets. Secrets injected into the ECS task at runtime as an array of {name, value_from} objects. value_from can be an SSM parameter or Secrets Manager ARN.

Pre and post deploy

boolean

Run pre-deploy command. Run a one-off ECS task before updating the ECS service.

  • Default: false

string_array

required

Pre-deploy command. Command arguments to run before updating the ECS service. For shell behavior, use /bin/sh, -lc, and your command string as separate arguments.

  • Default: []
  • Shown when: {"pre_deploy_enabled":true}

array

Pre-deploy environment variables. Additional environment variables for the pre-deploy task. Runtime environment variables and secrets are already inherited from the app container.

  • Default: []
  • Shown when: {"pre_deploy_enabled":true}

number

Pre-deploy CPU units. Optional CPU units for the pre-deploy task. Leave blank to use the app task CPU setting.

  • Min: 1
  • Shown when: {"pre_deploy_enabled":true}

number

Pre-deploy memory (MiB). Optional memory in MiB for the pre-deploy task. Leave blank to use the app task memory setting.

  • Min: 1
  • Shown when: {"pre_deploy_enabled":true}

number

Pre-deploy ephemeral storage (GiB). Optional ephemeral storage size for the pre-deploy task. Leave blank to use the task definition default.

  • Min: 21
  • Max: 200
  • Shown when: {"pre_deploy_enabled":true}

number

Pre-deploy timeout (secs). Maximum time to wait for the pre-deploy task to finish.

  • Default: 1800
  • Min: 1
  • Shown when: {"pre_deploy_enabled":true}

boolean

Run post-deploy command. Run a one-off ECS task after the ECS service deployment succeeds.

  • Default: false

string_array

required

Post-deploy command. Command arguments to run after the ECS service deployment succeeds. For shell behavior, use /bin/sh, -lc, and your command string as separate arguments.

  • Default: []
  • Shown when: {"post_deploy_enabled":true}

array

Post-deploy environment variables. Additional environment variables for the post-deploy task. Runtime environment variables and secrets are already inherited from the app container.

  • Default: []
  • Shown when: {"post_deploy_enabled":true}

number

Post-deploy CPU units. Optional CPU units for the post-deploy task. Leave blank to use the app task CPU setting.

  • Min: 1
  • Shown when: {"post_deploy_enabled":true}

number

Post-deploy memory (MiB). Optional memory in MiB for the post-deploy task. Leave blank to use the app task memory setting.

  • Min: 1
  • Shown when: {"post_deploy_enabled":true}

number

Post-deploy ephemeral storage (GiB). Optional ephemeral storage size for the post-deploy task. Leave blank to use the task definition default.

  • Min: 21
  • Max: 200
  • Shown when: {"post_deploy_enabled":true}

number

Post-deploy timeout (secs). Maximum time to wait for the post-deploy task to finish.

  • Default: 1800
  • Min: 1
  • Shown when: {"post_deploy_enabled":true}

Logging

boolean

FireLens log routing. Routes the app container logs through a Fluent Bit sidecar. CloudWatch output stays enabled by default so Ravion runtime logs continue to work.

  • Default: false

string

required

FireLens image. Container image for the Fluent Bit log router sidecar.

  • Default: public.ecr.aws/aws-observability/aws-for-fluent-bit:stable
  • Shown when: {"firelens_enabled":true}

text

Additional Fluent Bit config. Optional Fluent Bit config appended after the generated [SERVICE] block. Add [OUTPUT] blocks here for destinations such as Datadog, Splunk, Firehose, OpenSearch, or S3.

  • Shown when: {"firelens_enabled":true}

boolean

Keep CloudWatch output enabled. Recommended. Sends FireLens-routed app logs to the service CloudWatch log group so Ravion runtime logs continue to work. Disable only if all app logs should go exclusively to external destinations.

  • Default: true
  • Shown when: {"firelens_enabled":true}

boolean

Add ECS log metadata. Adds ECS cluster, task, and container metadata to FireLens log records.

  • Default: true
  • Shown when: {"firelens_enabled":true}

array

FireLens environment variables. Environment variables passed to the log router sidecar. Use these for non-secret destination options.

  • Default: []
  • Shown when: {"firelens_enabled":true}

array

FireLens secrets. Secrets injected into the log router sidecar as an array of {name, value_from} objects. Use these for API keys or tokens stored in SSM Parameter Store or Secrets Manager.

  • Default: []
  • Shown when: {"firelens_enabled":true}

IAM roles and policies

string

Execution role ARN override. Optional existing ECS task execution role ARN. Leave blank to let the module create and manage the execution role used for pulling images and writing logs.

string

Task role ARN override. Optional existing ECS task role ARN for application AWS permissions. Leave blank to let the module create a task role and attach the policies configured below.

string_array

Task role policy ARNs. Additional managed IAM policy ARNs to attach to the generated task role. Only used when task role ARN override is blank.

  • Default: []

object

Task role inline policies. Inline IAM policy documents keyed by policy name.

  • Default: {}

string_array

Execution role policy ARNs. Additional managed IAM policy ARNs to attach to the generated execution role. Only used when execution role ARN override is blank.

  • Default: []

Networking and deployment

number

Minimum healthy percent. Minimum percentage of desired tasks that must stay healthy during rolling deployments. Keep 100 for zero-downtime deploys. Lower it only when the cluster does not have enough spare capacity to start replacement tasks first, since lowering it can reduce availability during deploys.

  • Default: 100
  • Min: 0
  • Max: 200

number

Maximum percent. Maximum temporary task count during rolling deployments. Keep 200 for fast replacement capacity. Lower it when cluster capacity, IP availability, or burst cost should limit how many extra tasks ECS can start.

  • Default: 200
  • Min: 100
  • Max: 400

string_array

Additional security groups. Additional security group IDs to attach to ECS tasks.

  • Default: []

string_array

Allowed CIDR blocks. CIDR blocks allowed direct access to the service in addition to load balancer traffic.

  • Default: []

object_array

Sidecars. Optional containers that run in the same ECS task as the app container. Use sidecars for agents, local proxies, lightweight workers, or helper processes that should share task networking and lifecycle with the app.

  • Default: []

Show item fields

string

required

Container name. Unique name for this sidecar container within the task.

  • Pattern: ^[A-Za-z0-9_-]{1,255}$ — Use 1-255 characters: letters, numbers, hyphens, and underscores only.

string

required

Container image. Container image URI or registry reference for the sidecar.

boolean

Essential container. When enabled, ECS stops the whole task if this sidecar exits. Leave disabled for optional agents or helpers that should not take down the app.

  • Default: false

number

CPU units. Optional CPU units reserved for this sidecar. Increase the task size if sidecars need dedicated CPU.

  • Min: 0

number

Memory limit in MiB. Optional hard memory limit for this sidecar. ECS stops the container if it exceeds this limit.

  • Min: 0

number

Memory reservation in MiB. Optional soft memory reservation for this sidecar. Useful for agents that can burst above their normal memory use.

  • Min: 0

object_array

Environment variables. Environment variables passed to this sidecar container.

  • Default: []

Show item fields

string

required

Name. Environment variable name.

  • Pattern: ^[A-Za-z_][A-Za-z0-9_]*$ — Use a valid environment variable name.

string

required

Value. Environment variable value.

object_array

Secrets. Secrets injected into this sidecar from SSM Parameter Store or Secrets Manager.

  • Default: []

Show item fields

string

required

Name. Environment variable name exposed to the sidecar.

  • Pattern: ^[A-Za-z_][A-Za-z0-9_]*$ — Use a valid environment variable name.

string

required

Value from. SSM parameter or Secrets Manager ARN containing the secret value.

object_array

Port mappings. Optional ports exposed by this sidecar inside the task. Most helper sidecars do not need port mappings.

  • Default: []

Show item fields

number

required

Container port. Port exposed by the sidecar container.

  • Min: 1
  • Max: 65535

number

Host port. Optional host port for EC2 networking modes. Leave empty for awsvpc tasks unless you need a fixed host port.

  • Min: 1
  • Max: 65535

string

Protocol. Network protocol for this port mapping.

  • Default: tcp
  • Allowed values: tcp (TCP), udp (UDP)

string

Application protocol. Optional application protocol used by service connect integrations.

  • Allowed values: http (HTTP), http2 (HTTP/2), grpc (gRPC)

object_array

Mount points. Optional task volume mounts for this sidecar. Use the volume name efs to mount the EFS file system when the EFS file system setting is enabled.

  • Default: []

Show item fields

string

required

Source volume. Task volume name to mount into the sidecar. Use efs for the EFS file system volume.

string

required

Container path. Path inside the sidecar container where the volume is mounted.

  • Pattern: ^/ — Use an absolute container path.

boolean

Read only. Mount the volume as read-only inside the sidecar.

  • Default: false

object_array

Container dependencies. Optional startup dependencies for this sidecar. Use this when the sidecar should wait for another container to start or become healthy.

  • Default: []

Show item fields

string

required

Container name. Container this sidecar depends on.

string

required

Condition. Startup condition to wait for before starting this sidecar.

  • Default: START
  • Allowed values: START (Start), HEALTHY (Healthy), COMPLETE (Complete), SUCCESS (Success)

string_array

Command. Optional command arguments that override the image default command.

  • Default: []

string_array

Entry point. Optional entry point arguments that override the image default entry point.

  • Default: []

string

Working directory. Optional working directory inside the sidecar container.

Persistent storage

boolean

EFS file system. Mount an EFS file system into the app container. The service attaches the file system’s client security group and adds the volume and mount point automatically.

  • Default: false

$ref:rvn-efs

required

EFS file system.

  • Shown when: {"efs_enabled":true}

string

required

EFS mount path. Path inside the app container where the file system is mounted.

  • Default: /mnt/efs
  • Pattern: ^/ — Use an absolute container path.
  • Shown when: {"efs_enabled":true}

boolean

EFS read only. Mount the file system as read-only inside the app container.

  • Default: false
  • Shown when: {"efs_enabled":true}

EFS IAM authorization. Use the task role to authorize file system access. The task role must allow elasticfilesystem:ClientMount, plus elasticfilesystem:ClientWrite or elasticfilesystem:ClientRootAccess as needed.

  • Default: false
  • Shown when: {"efs_enabled":true}

Builder config

string

required

Builder instance type. Use on-demand EC2 for predictable availability or EC2 Spot for lower cost with possible capacity delays or interruption.

  • Default: ec2
  • Allowed values: ec2 (EC2), ec2-spot (EC2 spot)
  • Shown when: {"build_source":["dockerfile","railpack","nixpacks"]}

string

required

Builder instance size. EC2 instance type for builds. Start with the default value, then increase or decrease it based on the resource usage report at the end of builds.

  • Default: c7a.4xlarge
  • Shown when: {"build_source":["dockerfile","railpack","nixpacks"]}

string

Builder execution environment. Optional execution environment ID or given ID for builds. Defaults to the module Terraform execution environment.

  • Shown when: {"build_source":["dockerfile","railpack","nixpacks"]}

string

Builder AMI. Optional AMI ID for build runners. Leave empty to use the default runner image.

  • Shown when: {"build_source":["dockerfile","railpack","nixpacks"]}

boolean

Include default build policies. The step’s built-in policies (ECR/S3 access, CloudWatch agent) stay attached alongside your Builder IAM policies. Turn off to run the build with only the policies listed below.

  • Default: true
  • Shown when: {"build_source":["dockerfile","railpack","nixpacks"]}

string_array

Builder IAM policies. IAM managed policy ARNs for the EC2 build runner role, applied for the duration of each build.

  • Default: []
  • Shown when: {"build_source":["dockerfile","railpack","nixpacks"]}

Image registry lifecycle

boolean

Scan images on push. Ask ECR to run its basic vulnerability scan whenever a new image is pushed. Keep this on for early dependency and OS package findings; disable only if another scanner owns image scanning or duplicate findings are noisy.

  • Default: true
  • Shown when: {"build_source":["dockerfile","railpack","nixpacks"]}

boolean

Force delete image repository. Allow the ECR repository to be deleted even when it contains images. Use with care.

  • Default: false
  • Shown when: {"build_source":["dockerfile","railpack","nixpacks"]}

Misc

boolean

Force new deployment. Force ECS to start a new deployment when applying service configuration, even if the task definition did not change.

  • Default: true

keyvalue

Tags. A map of tags to assign to all resources. Default tags are Owner, ProjectGivenId, EnvironmentGivenId, ModuleGivenId, ModuleId

Terraform settings

string

OpenTofu version override. Override the environment’s default version for this module

string

Ravion Terraform workspace name. Override Terraform state backend workspace name. Defaults to project + environment + module given ids.

  • Immutable after creation

object

Advanced Terraform variables. Optional raw Terraform variable overrides for advanced module inputs or one-off overrides. Values here override the generated variables above.

  • Default: {}

Read the original on ravion.com ↗