Code Monkey home page Code Monkey logo

terraform-aws-ecs-alb-service-task's Introduction

Project Banner

Latest ReleaseLast UpdatedSlack Community

Terraform module to create an ECS Service for a web app (task), and an ALB target group to route requests.

Tip

๐Ÿ‘ฝ Use Atmos with Terraform

Cloud Posse uses atmos to easily orchestrate multiple environments using Terraform.
Works with Github Actions, Atlantis, or Spacelift.

Watch demo of using Atmos with Terraform
Example of running atmos to manage infrastructure from our Quick Start tutorial.

Usage

For a complete example, see examples/complete.

For automated test of the complete example using bats and Terratest, see test.

provider "aws" {
  region = var.region
}

module "label" {
  source     = "git::https://github.com/cloudposse/terraform-null-label.git?ref=tags/0.15.0"
  namespace  = var.namespace
  name       = var.name
  stage      = var.stage
  delimiter  = var.delimiter
  attributes = var.attributes
  tags       = var.tags
}

module "vpc" {
  source     = "git::https://github.com/cloudposse/terraform-aws-vpc.git?ref=tags/0.8.1"
  namespace  = var.namespace
  stage      = var.stage
  name       = var.name
  delimiter  = var.delimiter
  attributes = var.attributes
  cidr_block = var.vpc_cidr_block
  tags       = var.tags
}

module "subnets" {
  source               = "git::https://github.com/cloudposse/terraform-aws-dynamic-subnets.git?ref=tags/0.16.1"
  availability_zones   = var.availability_zones
  namespace            = var.namespace
  stage                = var.stage
  name                 = var.name
  attributes           = var.attributes
  delimiter            = var.delimiter
  vpc_id               = module.vpc.vpc_id
  igw_id               = module.vpc.igw_id
  cidr_block           = module.vpc.vpc_cidr_block
  nat_gateway_enabled  = true
  nat_instance_enabled = false
  tags                 = var.tags
}

resource "aws_ecs_cluster" "default" {
  name = module.label.id
  tags = module.label.tags
}

module "container_definition" {
  source                       = "git::https://github.com/cloudposse/terraform-aws-ecs-container-definition.git?ref=tags/0.21.0"
  container_name               = var.container_name
  container_image              = var.container_image
  container_memory             = var.container_memory
  container_memory_reservation = var.container_memory_reservation
  container_cpu                = var.container_cpu
  essential                    = var.container_essential
  readonly_root_filesystem     = var.container_readonly_root_filesystem
  environment                  = var.container_environment
  port_mappings                = var.container_port_mappings
  log_configuration            = var.container_log_configuration
}

module "ecs_alb_service_task" {
  source = "cloudposse/ecs-alb-service-task/aws"
  # Cloud Posse recommends pinning every module to a specific version
  # version = "x.x.x"
  namespace                          = var.namespace
  stage                              = var.stage
  name                               = var.name
  attributes                         = var.attributes
  delimiter                          = var.delimiter
  alb_security_group                 = module.vpc.vpc_default_security_group_id
  container_definition_json          = module.container_definition.json
  ecs_cluster_arn                    = aws_ecs_cluster.default.arn
  launch_type                        = var.ecs_launch_type
  vpc_id                             = module.vpc.vpc_id
  security_group_ids                 = [module.vpc.vpc_default_security_group_id]
  subnet_ids                         = module.subnets.public_subnet_ids
  tags                               = var.tags
  ignore_changes_task_definition     = var.ignore_changes_task_definition
  network_mode                       = var.network_mode
  assign_public_ip                   = var.assign_public_ip
  propagate_tags                     = var.propagate_tags
  health_check_grace_period_seconds  = var.health_check_grace_period_seconds
  deployment_minimum_healthy_percent = var.deployment_minimum_healthy_percent
  deployment_maximum_percent         = var.deployment_maximum_percent
  deployment_controller_type         = var.deployment_controller_type
  desired_count                      = var.desired_count
  task_memory                        = var.task_memory
  task_cpu                           = var.task_cpu
}

The container_image in the container_definition module is the Docker image used to start a container.

The container_definition is a string of JSON-encoded container definitions. Normally, you would place only one container definition here as the example above demonstrates. However, there might be situations where more than one container per task is more appropriate such as optionally in Fargate or in other cases where sidecars may be required. With cloudposse/terraform-aws-ecs-container-definition multi-container task definitions can be created using:

module "ecs_alb_service_task" {
  ...
  container_definition_json = jsonencode([
    module.first_container.json_map_object,
    module.second_container.json_map_object,
  ])
  ...
}

Refer to the multiple definitions example in cloudposse/terraform-aws-ecs-container-definition for details on defining multiple definitions.

This string is passed directly to the Docker daemon. Images in the Docker Hub registry are available by default. Other repositories are specified with either repository-url/image:tag or repository-url/image@digest. Up to 255 letters (uppercase and lowercase), numbers, hyphens, underscores, colons, periods, forward slashes, and number signs are allowed. This parameter maps to Image in the Create a container section of the Docker Remote API and the IMAGE parameter of docker run.

When a new task starts, the Amazon ECS container agent pulls the latest version of the specified image and tag for the container to use. However, subsequent updates to a repository image are not propagated to already running tasks.

Images in Amazon ECR repositories can be specified by either using the full registry/repository:tag or registry/repository@digest. For example, 012345678910.dkr.ecr.<region-name>.amazonaws.com/<repository-name>:latest or 012345678910.dkr.ecr.<region-name>.amazonaws.com/<repository-name>@sha256:94afd1f2e64d908bc90dbca0035a5b567EXAMPLE.

Images in official repositories on Docker Hub use a single name (for example, ubuntu or mongo).

Images in other repositories on Docker Hub are qualified with an organization name (for example, amazon/amazon-ecs-agent).

Images in other online repositories are qualified further by a domain name (for example, quay.io/assemblyline/ubuntu).

For more info, see Container Definition.

Important

In Cloud Posse's examples, we avoid pinning modules to specific versions to prevent discrepancies between the documentation and the latest released versions. However, for your own projects, we strongly advise pinning each module to the exact version you're using. This practice ensures the stability of your infrastructure. Additionally, we recommend implementing a systematic approach for updating versions to avoid unexpected changes.

Makefile Targets

Available targets:

  help                                Help screen
  help/all                            Display help for all targets
  help/short                          This help short screen

Requirements

Name Version
terraform >= 0.14.0
aws >= 4.59

Providers

Name Version
aws >= 4.59

Modules

Name Source Version
exec_label cloudposse/label/null 0.25.0
service_connect_label cloudposse/label/null 0.25.0
service_label cloudposse/label/null 0.25.0
task_label cloudposse/label/null 0.25.0
this cloudposse/label/null 0.25.0

Resources

Name Type
aws_ecs_service.default resource
aws_ecs_service.ignore_changes_desired_count resource
aws_ecs_service.ignore_changes_task_definition resource
aws_ecs_service.ignore_changes_task_definition_and_desired_count resource
aws_ecs_task_definition.default resource
aws_iam_role.ecs_exec resource
aws_iam_role.ecs_service resource
aws_iam_role.ecs_service_connect_tls resource
aws_iam_role.ecs_task resource
aws_iam_role_policy.ecs_exec resource
aws_iam_role_policy.ecs_service resource
aws_iam_role_policy.ecs_ssm_exec resource
aws_iam_role_policy_attachment.ecs_exec resource
aws_iam_role_policy_attachment.ecs_service_connect_tls resource
aws_iam_role_policy_attachment.ecs_task resource
aws_security_group.ecs_service resource
aws_security_group_rule.alb resource
aws_security_group_rule.allow_all_egress resource
aws_security_group_rule.allow_icmp_ingress resource
aws_security_group_rule.nlb resource
aws_iam_policy_document.ecs_exec data source
aws_iam_policy_document.ecs_service data source
aws_iam_policy_document.ecs_service_connect_tls data source
aws_iam_policy_document.ecs_service_policy data source
aws_iam_policy_document.ecs_ssm_exec data source
aws_iam_policy_document.ecs_task data source
aws_iam_policy_document.ecs_task_exec data source

Inputs

Name Description Type Default Required
additional_tag_map Additional key-value pairs to add to each map in tags_as_list_of_maps. Not added to tags or id.
This is for some rare cases where resources want additional configuration of tags
and therefore take a list of maps with tag key, value, and additional configuration.
map(string) {} no
alb_security_group Security group of the ALB string "" no
assign_public_ip Assign a public IP address to the ENI (Fargate launch type only). Valid values are true or false. Default false bool false no
attributes ID element. Additional attributes (e.g. workers or cluster) to add to id,
in the order they appear in the list. New attributes are appended to the
end of the list. The elements of the list are joined by the delimiter
and treated as a single ID element.
list(string) [] no
bind_mount_volumes Task bind mount volume definitions as list of configuration objects. You can define multiple bind mount volumes on the same task definition. Requires name and optionally host_path list(any) [] no
capacity_provider_strategies The capacity provider strategies to use for the service. See capacity_provider_strategy configuration block: https://www.terraform.io/docs/providers/aws/r/ecs_service.html#capacity_provider_strategy
list(object({
capacity_provider = string
weight = number
base = number
}))
[] no
circuit_breaker_deployment_enabled If true, enable the deployment circuit breaker logic for the service. If using CODE_DEPLOY for deployment_controller_type, this value will be ignored bool false no
circuit_breaker_rollback_enabled If true, Amazon ECS will roll back the service if a service deployment fails. If using CODE_DEPLOY for deployment_controller_type, this value will be ignored bool false no
container_definition_json A string containing a JSON-encoded array of container definitions
("[{ "name": "container1", ... }, { "name": "container2", ... }]").
See API_ContainerDefinition,
cloudposse/terraform-aws-ecs-container-definition, or
ecs_task_definition#container_definitions
string n/a yes
container_port The port on the container to allow traffic from the ALB security group number 80 no
context Single object for setting entire context at once.
See description of individual variables for details.
Leave string and numeric variables as null to use default value.
Individual variable settings (non-null) override settings in context object,
except for attributes, tags, and additional_tag_map, which are merged.
any
{
"additional_tag_map": {},
"attributes": [],
"delimiter": null,
"descriptor_formats": {},
"enabled": true,
"environment": null,
"id_length_limit": null,
"label_key_case": null,
"label_order": [],
"label_value_case": null,
"labels_as_tags": [
"unset"
],
"name": null,
"namespace": null,
"regex_replace_chars": null,
"stage": null,
"tags": {},
"tenant": null
}
no
delimiter Delimiter to be used between ID elements.
Defaults to - (hyphen). Set to "" to use no delimiter at all.
string null no
deployment_controller_type Type of deployment controller. Valid values are CODE_DEPLOY and ECS string "ECS" no
deployment_maximum_percent The upper limit of the number of tasks (as a percentage of desired_count) that can be running in a service during a deployment number 200 no
deployment_minimum_healthy_percent The lower limit (as a percentage of desired_count) of the number of tasks that must remain running and healthy in a service during a deployment number 100 no
descriptor_formats Describe additional descriptors to be output in the descriptors output map.
Map of maps. Keys are names of descriptors. Values are maps of the form
{<br> format = string<br> labels = list(string)<br>}
(Type is any so the map values can later be enhanced to provide additional options.)
format is a Terraform format string to be passed to the format() function.
labels is a list of labels, in order, to pass to format() function.
Label values will be normalized before being passed to format() so they will be
identical to how they appear in id.
Default is {} (descriptors output will be empty).
any {} no
desired_count The number of instances of the task definition to place and keep running number 1 no
docker_volumes Task docker volume definitions as list of configuration objects. You can define multiple Docker volumes on the same task definition, but a single volume can only have one docker_volume_configuration.
list(object({
host_path = string
name = string
docker_volume_configuration = list(object({
autoprovision = bool
driver = string
driver_opts = map(string)
labels = map(string)
scope = string
}))
}))
[] no
ecs_cluster_arn The ARN of the ECS cluster where service will be provisioned string n/a yes
ecs_load_balancers A list of load balancer config objects for the ECS service; see ecs_service#load_balancer docs
list(object({
container_name = string
container_port = number
elb_name = optional(string)
target_group_arn = string
}))
[] no
ecs_service_enabled Whether or not to create the aws_ecs_service resource bool true no
efs_volumes Task EFS volume definitions as list of configuration objects. You can define multiple EFS volumes on the same task definition, but a single volume can only have one efs_volume_configuration.
list(object({
host_path = string
name = string
efs_volume_configuration = list(object({
file_system_id = string
root_directory = string
transit_encryption = string
transit_encryption_port = string
authorization_config = list(object({
access_point_id = string
iam = string
}))
}))
}))
[] no
enable_all_egress_rule A flag to enable/disable adding the all ports egress rule to the service security group bool true no
enable_ecs_managed_tags Specifies whether to enable Amazon ECS managed tags for the tasks within the service bool false no
enable_icmp_rule Specifies whether to enable ICMP on the service security group bool false no
enabled Set to false to prevent the module from creating any resources bool null no
environment ID element. Usually used for region e.g. 'uw2', 'us-west-2', OR role 'prod', 'staging', 'dev', 'UAT' string null no
ephemeral_storage_size The number of GBs to provision for ephemeral storage on Fargate tasks. Must be greater than or equal to 21 and less than or equal to 200 number 0 no
exec_enabled Specifies whether to enable Amazon ECS Exec for the tasks within the service bool false no
force_new_deployment Enable to force a new task deployment of the service. bool false no
fsx_volumes Task FSx volume definitions as list of configuration objects. You can define multiple FSx volumes on the same task definition, but a single volume can only have one fsx_windows_file_server_volume_configuration.
list(object({
host_path = string
name = string
fsx_windows_file_server_volume_configuration = list(object({
file_system_id = string
root_directory = string
authorization_config = list(object({
credentials_parameter = string
domain = string
}))
}))
}))
[] no
health_check_grace_period_seconds Seconds to ignore failing load balancer health checks on newly instantiated tasks to prevent premature shutdown, up to 7200. Only valid for services configured to use load balancers number 0 no
id_length_limit Limit id to this many characters (minimum 6).
Set to 0 for unlimited length.
Set to null for keep the existing setting, which defaults to 0.
Does not affect id_full.
number null no
ignore_changes_desired_count Whether to ignore changes for desired count in the ECS service bool false no
ignore_changes_task_definition Whether to ignore changes in container definition and task definition in the ECS service bool true no
ipc_mode The IPC resource namespace to be used for the containers in the task.
The valid values are host, task, and none. If host is specified,
then all containers within the tasks that specified the host IPC mode on
the same container instance share the same IPC resources with the host
Amazon EC2 instance. If task is specified, all containers within the
specified task share the same IPC resources. If none is specified, then
IPC resources within the containers of a task are private and not shared
with other containers in a task or on the container instance. If no value
is specified, then the IPC resource namespace sharing depends on the
Docker daemon setting on the container instance. For more information, see
IPC settings in the Docker documentation."
string null no
label_key_case Controls the letter case of the tags keys (label names) for tags generated by this module.
Does not affect keys of tags passed in via the tags input.
Possible values: lower, title, upper.
Default value: title.
string null no
label_order The order in which the labels (ID elements) appear in the id.
Defaults to ["namespace", "environment", "stage", "name", "attributes"].
You can omit any of the 6 labels ("tenant" is the 6th), but at least one must be present.
list(string) null no
label_value_case Controls the letter case of ID elements (labels) as included in id,
set as tag values, and output by this module individually.
Does not affect values of tags passed in via the tags input.
Possible values: lower, title, upper and none (no transformation).
Set this to title and set delimiter to "" to yield Pascal Case IDs.
Default value: lower.
string null no
labels_as_tags Set of labels (ID elements) to include as tags in the tags output.
Default is to include all labels.
Tags with empty values will not be included in the tags output.
Set to [] to suppress all generated tags.
Notes:
The value of the name tag, if included, will be the id, not the name.
Unlike other null-label inputs, the initial setting of labels_as_tags cannot be
changed in later chained modules. Attempts to change it will be silently ignored.
set(string)
[
"default"
]
no
launch_type The launch type on which to run your service. Valid values are EC2 and FARGATE string "FARGATE" no
name ID element. Usually the component or solution name, e.g. 'app' or 'jenkins'.
This is the only ID element not also included as a tag.
The "name" tag is set to the full id string. There is no tag with the value of the name input.
string null no
namespace ID element. Usually an abbreviation of your organization name, e.g. 'eg' or 'cp', to help ensure generated IDs are globally unique string null no
network_mode The network mode to use for the task. This is required to be awsvpc for FARGATE launch_type or null for EC2 launch_type string "awsvpc" no
nlb_cidr_blocks A list of CIDR blocks to add to the ingress rule for the NLB container port list(string) [] no
nlb_container_port The port on the container to allow traffic from the NLB number 80 no
ordered_placement_strategy Service level strategy rules that are taken into consideration during task placement.
List from top to bottom in order of precedence. The maximum number of ordered_placement_strategy blocks is 5.
See ordered_placement_strategy
list(object({
type = string
field = string
}))
[] no
permissions_boundary A permissions boundary ARN to apply to the 3 roles that are created. string "" no
pid_mode The process namespace to use for the containers in the task. The valid
values are host and task. If host is specified, then all containers
within the tasks that specified the host PID mode on the same container
instance share the same process namespace with the host Amazon EC2 instanc
. If task is specified, all containers within the specified task share
the same process namespace. If no value is specified, then the process
namespace sharing depends on the Docker daemon setting on the container
instance. For more information, see PID settings in the Docker documentation.
string null no
platform_version The platform version on which to run your service. Only applicable for launch_type set to FARGATE.
More information about Fargate platform versions can be found in the AWS ECS User Guide.
string "LATEST" no
propagate_tags Specifies whether to propagate the tags from the task definition or the service to the tasks. The valid values are SERVICE and TASK_DEFINITION string null no
proxy_configuration The proxy configuration details for the App Mesh proxy. See proxy_configuration docs https://www.terraform.io/docs/providers/aws/r/ecs_task_definition.html#proxy-configuration-arguments
object({
type = string
container_name = string
properties = map(string)
})
null no
redeploy_on_apply Updates the service to the latest task definition on each apply bool false no
regex_replace_chars Terraform regular expression (regex) string.
Characters matching the regex will be removed from the ID elements.
If not set, "/[^a-zA-Z0-9-]/" is used to remove all characters other than hyphens, letters and digits.
string null no
role_tags_enabled Whether or not to create tags on ECS roles bool true no
runtime_platform Zero or one runtime platform configurations that containers in your task may use.
Map of strings with optional keys operating_system_family and cpu_architecture.
See runtime_platform docs https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_task_definition#runtime_platform
list(map(string)) [] no
scheduling_strategy The scheduling strategy to use for the service. The valid values are REPLICA and DAEMON.
Note that Fargate tasks do not support the DAEMON scheduling strategy.
string "REPLICA" no
security_group_description The description to assign to the service security group.
Warning: Changing the description causes the security group to be replaced.
string "Allow ALL egress from ECS service" no
security_group_enabled Whether to create a security group for the service. bool true no
security_group_ids Security group IDs to allow in Service network_configuration if var.network_mode = "awsvpc" list(string) [] no
service_connect_configurations The list of Service Connect configurations.
See service_connect_configuration docs https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_service#service_connect_configuration
list(object({
enabled = bool
namespace = optional(string, null)
log_configuration = optional(object({
log_driver = string
options = optional(map(string), null)
secret_option = optional(list(object({
name = string
value_from = string
})), [])
}), null)
service = optional(list(object({
client_alias = list(object({
dns_name = string
port = number
}))
timeout = optional(list(object({
idle_timeout_seconds = optional(number, null)
per_request_timeout_seconds = optional(number, null)
})), [])
tls = optional(list(object({
kms_key = optional(string, null)
role_arn = optional(string, null)
issuer_cert_authority = object({
aws_pca_authority_arn = string
})
})), [])
discovery_name = optional(string, null)
ingress_port_override = optional(number, null)
port_name = string
})), [])
}))
[] no
service_placement_constraints The rules that are taken into consideration during task placement. Maximum number of placement_constraints is 10. See placement_constraints docs
list(object({
type = string
expression = string
}))
[] no
service_registries Zero or one service discovery registries for the service.
The currently supported service registry is Amazon Route 53 Auto Naming Service - aws_service_discovery_service;
see service_registries docs https://www.terraform.io/docs/providers/aws/r/ecs_service.html#service_registries-1"
Service registry is object with required key registry_arn = string and optional keys
port = number
container_name = string
container_port = number
list(any) [] no
service_role_arn ARN of the IAM role that allows Amazon ECS to make calls to your load balancer on your behalf. This parameter is required if you are using a load balancer with your service, but only if your task definition does not use the awsvpc network mode. If using awsvpc network mode, do not specify this role. If your account has already created the Amazon ECS service-linked role, that role is used by default for your service unless you specify a role here. string null no
stage ID element. Usually used to indicate role, e.g. 'prod', 'staging', 'source', 'build', 'test', 'deploy', 'release' string null no
subnet_ids Subnet IDs used in Service network_configuration if var.network_mode = "awsvpc" list(string) null no
tags Additional tags (e.g. {'BusinessUnit': 'XYZ'}).
Neither the tag keys nor the tag values will be modified by this module.
map(string) {} no
task_cpu The number of CPU units used by the task. If using FARGATE launch type task_cpu must match supported memory values number 256 no
task_definition A list(string) of zero or one ARNs of task definitions, to reuse
reuse an existing task definition family and revision for the ecs
service instead of creating one
DEPRECATED: you can also pass a string with the ARN, but that
string must be known a "plan" time.
any [] no
task_exec_policy_arns A list of IAM Policy ARNs to attach to the generated task execution role.
Changes to the list will have ripple effects, so use task_exec_policy_arns_map if possible.
list(string) [] no
task_exec_policy_arns_map A map of name to IAM Policy ARNs to attach to the generated task execution role.
The names are arbitrary, but must be known at plan time. The purpose of the name
is so that changes to one ARN do not cause a ripple effect on the other ARNs.
If you cannot provide unique names known at plan time, use task_exec_policy_arns instead.
map(string) {} no
task_exec_role_arn A list(string) of zero or one ARNs of IAM roles that allows the
ECS/Fargate agent to make calls to the ECS API on your behalf.
If the list is empty, a role will be created for you.
DEPRECATED: you can also pass a string with the ARN, but that
string must be known a "plan" time.
any [] no
task_memory The amount of memory (in MiB) used by the task. If using Fargate launch type task_memory must match supported cpu value number 512 no
task_placement_constraints A set of placement constraints rules that are taken into consideration during task placement.
Maximum number of placement_constraints is 10. See placement_constraints
list(object({
type = string
expression = string
}))
[] no
task_policy_arns A list of IAM Policy ARNs to attach to the generated task role.
Changes to the list will have ripple effects, so use task_policy_arns_map if possible.
list(string) [] no
task_policy_arns_map A map of name to IAM Policy ARNs to attach to the generated task role.
The names are arbitrary, but must be known at plan time. The purpose of the name
is so that changes to one ARN do not cause a ripple effect on the other ARNs.
If you cannot provide unique names known at plan time, use task_policy_arns instead.
map(string) {} no
task_role_arn A list(string) of zero or one ARNs of IAM roles that allows
your Amazon ECS container task to make calls to other AWS services.
If the list is empty, a role will be created for you.
DEPRECATED: you can also pass a string with the ARN, but that
string must be known a "plan" time.
any [] no
tenant ID element _(Rarely used, not included by default)_. A customer identifier, indicating who this instance of a resource is for string null no
use_alb_security_group A flag to enable/disable allowing traffic from the ALB security group to the service security group bool false no
use_nlb_cidr_blocks A flag to enable/disable adding the NLB ingress rule to the service security group bool false no
use_old_arn A flag to enable/disable tagging the ecs resources that require the new arn format bool false no
vpc_id The VPC ID where resources are created string n/a yes
wait_for_steady_state If true, it will wait for the service to reach a steady state (like aws ecs wait services-stable) before continuing bool false no

Outputs

Name Description
ecs_exec_role_policy_id The ECS service role policy ID, in the form of role_name:role_policy_name
ecs_exec_role_policy_name ECS service role name
service_arn ECS Service ARN
service_name ECS Service name
service_role_arn ECS Service role ARN
service_security_group_id Security Group ID of the ECS task
task_definition_arn ECS task definition ARN
task_definition_arn_without_revision ECS task definition ARN without revision
task_definition_family ECS task definition family
task_definition_revision ECS task definition revision
task_exec_role_arn ECS Task exec role ARN
task_exec_role_id ECS Task exec role id
task_exec_role_name ECS Task role name
task_role_arn ECS Task role ARN
task_role_id ECS Task role id
task_role_name ECS Task role name

Related Projects

Check out these related projects.

Tip

Use Terraform Reference Architectures for AWS

Use Cloud Posse's ready-to-go terraform architecture blueprints for AWS to get up and running quickly.

โœ… We build it together with your team.
โœ… Your team owns everything.
โœ… 100% Open Source and backed by fanatical support.

Request Quote

๐Ÿ“š Learn More

Cloud Posse is the leading DevOps Accelerator for funded startups and enterprises.

Your team can operate like a pro today.

Ensure that your team succeeds by using Cloud Posse's proven process and turnkey blueprints. Plus, we stick around until you succeed.

Day-0: Your Foundation for Success

  • Reference Architecture. You'll get everything you need from the ground up built using 100% infrastructure as code.
  • Deployment Strategy. Adopt a proven deployment strategy with GitHub Actions, enabling automated, repeatable, and reliable software releases.
  • Site Reliability Engineering. Gain total visibility into your applications and services with Datadog, ensuring high availability and performance.
  • Security Baseline. Establish a secure environment from the start, with built-in governance, accountability, and comprehensive audit logs, safeguarding your operations.
  • GitOps. Empower your team to manage infrastructure changes confidently and efficiently through Pull Requests, leveraging the full power of GitHub Actions.

Request Quote

Day-2: Your Operational Mastery

  • Training. Equip your team with the knowledge and skills to confidently manage the infrastructure, ensuring long-term success and self-sufficiency.
  • Support. Benefit from a seamless communication over Slack with our experts, ensuring you have the support you need, whenever you need it.
  • Troubleshooting. Access expert assistance to quickly resolve any operational challenges, minimizing downtime and maintaining business continuity.
  • Code Reviews. Enhance your teamโ€™s code quality with our expert feedback, fostering continuous improvement and collaboration.
  • Bug Fixes. Rely on our team to troubleshoot and resolve any issues, ensuring your systems run smoothly.
  • Migration Assistance. Accelerate your migration process with our dedicated support, minimizing disruption and speeding up time-to-value.
  • Customer Workshops. Engage with our team in weekly workshops, gaining insights and strategies to continuously improve and innovate.

Request Quote

โœจ Contributing

This project is under active development, and we encourage contributions from our community.

Many thanks to our outstanding contributors:

For ๐Ÿ› bug reports & feature requests, please use the issue tracker.

In general, PRs are welcome. We follow the typical "fork-and-pull" Git workflow.

  1. Review our Code of Conduct and Contributor Guidelines.
  2. Fork the repo on GitHub
  3. Clone the project to your own machine
  4. Commit changes to your own branch
  5. Push your work back up to your fork
  6. Submit a Pull Request so that we can review your changes

NOTE: Be sure to merge the latest changes from "upstream" before making a pull request!

๐ŸŒŽ Slack Community

Join our Open Source Community on Slack. It's FREE for everyone! Our "SweetOps" community is where you get to talk with others who share a similar vision for how to rollout and manage infrastructure. This is the best place to talk shop, ask questions, solicit feedback, and work together as a community to build totally sweet infrastructure.

๐Ÿ“ฐ Newsletter

Sign up for our newsletter and join 3,000+ DevOps engineers, CTOs, and founders who get insider access to the latest DevOps trends, so you can always stay in the know. Dropped straight into your Inbox every week โ€” and usually a 5-minute read.

๐Ÿ“† Office Hours

Join us every Wednesday via Zoom for your weekly dose of insider DevOps trends, AWS news and Terraform insights, all sourced from our SweetOps community, plus a live Q&A that you canโ€™t find anywhere else. It's FREE for everyone!

License

License

Preamble to the Apache License, Version 2.0

Complete license is available in the LICENSE file.

Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.

Trademarks

All other trademarks referenced herein are the property of their respective owners.


Copyright ยฉ 2017-2024 Cloud Posse, LLC

README footer

Beacon

terraform-aws-ecs-alb-service-task's People

Contributors

1david5 avatar ac-hibbert avatar actions-user avatar adamantike avatar aknysh avatar benbentwo avatar cloudpossebot avatar dependabot[bot] avatar ento avatar gowiem avatar jamengual avatar joe-niland avatar johncblandii avatar lagerfeuer avatar lgants avatar max-lobur avatar maximmi avatar mikkelam avatar msmagoo87 avatar nitrocode avatar nuru avatar okgolove avatar osterman avatar renovate[bot] avatar rryke avatar sarkis avatar sblack4 avatar sodre avatar ssaarinen avatar vadim-hleif avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

terraform-aws-ecs-alb-service-task's Issues

Question: How To Integrate with ALB

The name here of plugin suggest application load balancer, but this module does not create it its just used to reference existing balancer to be used with services/tasks, right?

So I should first create balancer via other module?

Thanks.

Ladislav

Use name_prefix and create_before_destroy on security groups

Found a bug? Maybe our Slack Community can help.

Slack Community

Describe the Bug

It can be a pain when the security group name changes as it would not be able to destroy - potentially using this pattern would work - https://github.com/terraform-aws-modules/terraform-aws-security-group/blob/master/main.tf#L34

Expected Behavior

Able to create new security group and assign it prior to destroy

Steps to Reproduce

Steps to reproduce the behavior:

  1. Go to '...'
  2. Run '....'
  3. Enter '....'
  4. See error

Screenshots

If applicable, add screenshots or logs to help explain your problem.

Environment (please complete the following information):

Anything that will help us triage the bug will help. Here are some ideas:

  • OS: [e.g. Linux, OSX, WSL, etc]
  • Version [e.g. 10.15]

Additional Context

Add any other context about the problem here.

Disable icmp sg rule by default

It doesn't make sense to me why icmp is enabled by default. It should be enabled if it's needed.

I propose to set var.enable_icmp_rule to false by default unless explicitly needed.

#106

Policy only handles ELB permissions, not ALB permissions.

The current policy only adds permissions for adding and removing tasks from a classic elb.
However this should handle target group permissions as well, and have more specific permissions.

The code below resolves the policy to match the load balancer type.

data "aws_iam_policy_document" "ecs_service_policy" {

Update the policy to be:

locals {
  elbs    = [for elb in var.ecs_load_balancers : lookup(elb, "elb_name", null) if lookup(elb, "elb_name", null) != null]
  targetg = [for tg in var.ecs_load_balancers : lookup(tg, "target_group_arn", null) if lookup(tg, "target_group_arn", null) != null]
}

data "aws_iam_policy_document" "ecs_service_policy" {
  count = var.enabled && var.network_mode != "awsvpc" ? 1 : 0

  dynamic "statement" {
    iterator = el
    for_each = local.elbs
    content {
      effect    = "Allow"
      resources = ["arn:aws:elasticloadbalancing:*:*:loadbalancer/${local.elbs[el.key]}"]
      sid       = "elbResources"

      actions = [
        "elasticloadbalancing:Describe*",
        "elasticloadbalancing:DeregisterInstancesFromLoadBalancer",
        "elasticloadbalancing:RegisterInstancesWithLoadBalancer",
      ]
    }

  }

  dynamic "statement" {
    iterator = tg
    for_each = local.targetg
    content {
      effect    = "Allow"
      resources = ["${local.targetg[tg.key]}"]
      sid       = "elbv2Resources"

      actions = [
        "elasticloadbalancing:RegisterTargets",
        "elasticloadbalancing:DeregisterTargets",
      ]
    }
  }
  statement {
    effect    = "Allow"
    resources = ["*"]
    sid       = "ec2Resources"

    actions = [
      "ec2:Describe*",
      "ec2:AuthorizeSecurityGroupIngress"
    ]
  }
}

Allow using EC2 instance role

Describe the Feature

Task execution role should be optional

Expected Behavior

Task execution role can be disabled

Use Case

Usage of task execution role replaces EC2 instance role.
We would like to continue to be able to use instance roles

InvalidParameterException: The new ARN and resource ID format must be enabled to propagate tags. Opt in to the new format and try again.

I am getting this error with latest Terraform 0.12:

module.ecs_alb_service_task.aws_security_group_rule.allow_all_egress[0]: Creation complete after 8s [id=sgrule-3293011397]

Error: InvalidParameterException: The new ARN and resource ID format must be enabled to propagate tags. Opt in to the new format and try again.
        status code: 400, request id: ea7d2db5-1a84-4932-a4ad-89f5a826085b "eg-test-ecs-alb-service-task"

  on ..\..\..\modules\services\aws_ecs_alb_service_task\main.tf line 235, in resource "aws_ecs_service" "ignore_changes_task_definition":
 235: resource "aws_ecs_service" "ignore_changes_task_definition" {


A managed resource "aws_security_group" "ecs_service" has not been declared in module.ecs_alb_service_task.

Found a bug? Maybe our Slack Community can help.

Slack Community

Describe the Bug

  on .terraform/modules/ecs_alb_service_task/main.tf line 435, in resource "aws_ecs_service" "ignore_changes_task_definition_and_desired_count":
 435:       security_groups  = compact(concat(var.security_group_ids, aws_security_group.ecs_service.*.id))

A managed resource "aws_security_group" "ecs_service" has not been declared in
module.ecs_alb_service_task.

Releasing state lock. This may take a few moments...

Suggested change

#140 PR here.

security_groups = compact(concat(var.security_group_ids, aws_security_group.ecs_service.*.id))
find and replace with
security_groups = compact(concat(module.security_group.*.id, var.security_groups))

Why!!!?

Looks like there's a bug in the code if you use the ignore desired_count and task_definition flags! ๐Ÿ˜จ

Setting var.ignore_changes_task_definition or var.ignore_changes_desired_count or both(?) to true results in and error:

A managed resource "aws_security_group" "ecs_service" has not been declared in
module.ecs_alb_service_task.

I think that error makes sense as we don't have a aws_security_group.ecs_service resource in the module.

I took at look at the code further down at (the default)

and that (and this is what the tests use) references the module security_group: module.security_group.*.id

Which does exist ๐Ÿ‘

Multi-container task definition

Multi-container task definition

The current module implementation assumes one container per tast definition. AWS however allows multiple container definitions per single tast. terraform-aws-ecs-alb-service-task Module demonstrates how multiple container definitions can be combined to achieve this.

It is technically possible to use an array of definitions as the argument for container_definition_json. For example:

module "ecs_alb_service_task" {
    ...
    container_definition_json = "[${module.first_container.json_map_encoded},${module.second_container.json_map_encoded}]"
    ...
  }

This however seems more like a workaround rather than expected solution.

Expected Behavior

A clear and concise description of what you expected to happen.

Use Case

We are deploying an appilcation consisting of nginx, php-fpm, and nodejs (frontend api). All these containers composit one application and must behave as one and scale as one unit.

Describe Ideal Solution

Ideally module definition would accept container_definitions (emphasis trailing s) instead of container_definition. For example:

module "ecs_alb_service_task" {
    ...
    container_definitions_json = [module.first_container.json, module.second_container.json]
    ...
  }

Variable descriptions should reflect this ability and provide examples.

Alternatives Considered

The two alternatives considered are: 1) use multiple services (single container per task, service) 2) stuff multiple definitions into container_definition_json.

Solution (1) is not quite applicable to our use-case due to extreme additional complexity. Solution (2) would work, however it feels more like shoehorning.

Additional Context

I would be interested in working on a MR if this sounds like a reasonable project. Are there any issues in implementing this?

custom execution role cannot be set on module

Describe the Bug

Dear Team,

When I define a custom task execution role. Terraform returns the error below

Logs

Releasing state lock. This may take a few moments...

โ•ท
โ”‚ Error: Invalid count argument
โ”‚ 
โ”‚   on .terraform/modules/ecs_alb_service_task/main.tf line 225, in data "aws_iam_policy_document" "ecs_task_exec":
โ”‚  225:   count = local.create_exec_role ? 1 : 0
โ”‚ 
โ”‚ The "count" value depends on resource attributes that cannot be determined
โ”‚ until apply, so Terraform cannot predict how many instances will be
โ”‚ created. To work around this, use the -target argument to first apply only
โ”‚ the resources that the count depends on.
โ•ต
โ•ท
โ”‚ Error: Invalid count argument
โ”‚ 
โ”‚   on .terraform/modules/ecs_alb_service_task/main.tf line 246, in data "aws_iam_policy_document" "ecs_exec":
โ”‚  246:   count = local.create_exec_role ? 1 : 0
โ”‚ 
โ”‚ The "count" value depends on resource attributes that cannot be determined
โ”‚ until apply, so Terraform cannot predict how many instances will be
โ”‚ created. To work around this, use the -target argument to first apply only
โ”‚ the resources that the count depends on.

module example to reproduce the problem.

module "ecs_alb_service_task" {
source = "git::https://github.com/cloudposse/terraform-aws-ecs-alb-service-task.git?ref=tags/0.64.0"

enabled = true
environment = var.ecs_environment
namespace = var.namespace
name = var.name
task_cpu = var.ecs_task_cpu
task_memory = var.ecs_task_memory
launch_type = "FARGATE"
network_mode = "awsvpc"
vpc_id = var.vpc_id
platform_version = var.ecs_platform_version
scheduling_strategy = "REPLICA"
propagate_tags = "SERVICE"
assign_public_ip = "false"
task_exec_role_arn = aws_iam_role.fargate_execution.arn
subnet_ids = var.private_subnet_ids
security_group_ids = [aws_security_group.this.id]
alb_security_group = module.alb.security_group_id
tags = local.tags
attributes = local.attributes
container_port = var.container_port
delimiter = local.delimiter
deployment_controller_type = "ECS"
deployment_maximum_percent = var.deployment_maximum_percent
deployment_minimum_healthy_percent = var.deployment_minimum_healthy_percent
desired_count = var.desired_count
ecs_cluster_arn = aws_ecs_cluster.cluster.arn
health_check_grace_period_seconds = 10
ignore_changes_task_definition = "false"

ecs_load_balancers = [{
"elb_name" = "",
"container_name" = var.name,
"container_port" = var.container_port,
"target_group_arn" = module.alb.default_target_group_arn,
}]

container_definition_json = jsonencode([
module.webportal_task_definition.json_map_object,
module.webportal_middleware_task_definition.json_map_object,
])

thank you in advance

Vasilios Tzanoudakis

Dependency Dashboard

This issue provides visibility into Renovate updates and their statuses. Learn more

This repository currently has no open or pending branches.

Detected dependencies

terraform
main.tf
  • cloudposse/label/null 0.25.0
  • cloudposse/label/null 0.25.0
  • cloudposse/label/null 0.25.0
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
  • undefined no version found
versions.tf
  • hashicorp/terraform >= 0.13.0
  • aws >= 3.69
  • local >= 1.3
  • null >= 2.0

  • Check this box to trigger a request for Renovate to run again on this repository

Invalid Network Configuration for "Bridge" network type

I'm getting the following error when trying to setup a service task with network_mode = "bridge":

aws_ecs_service.default: InvalidParameterException: Network Configuration is not valid for the given networkMode of this task definition.

Per the terraform aws_ecs_service docs it looks like you can't specify a network_configuration block for ecs_services unless you are using the service in awsvpc networking mode.

I'm going to fork and modify to fit our needs, but would be great to get an update/example of how to use this with a bridge network configuration.

Add example to add iam policies to task role

Found a bug? Maybe our Slack Community can help.

Slack Community

Describe the Bug

When using secrets list in a container definition the container gets an permissions error trying to access SecretsManager when the task is instantiated

Expected Behavior

The container should be able to retrieve values from SecretsManager

Steps to Reproduce

Create a container definition with a valueFrom using an ARN in secretsmanager. When the task is run (in Fargate) by the service it will fail with a permissions error on the _exec role.

Screenshots

N/A

Environment (please complete the following information):

N/A

Additional Context

N/A

Terraform Cloud - module ecs_alb_service_task has a broken symlink

Found a bug? Maybe our Slack Community can help.

Slack Community

Describe the Bug

A clear and concise description of what the bug is.

When running in Terraform cloud the below error is a result:
failed pulling filesystem: ssh: failed parsing message: failed scanning message: expected integer๏ฟฝ

Running it locally on my laptop it works fine, only issue is VCS --> Terraform Cloud execution.

I was able to find that the module ecs_alb_service_task has a broken symlink:

vagrant@ubuntu:~/ticket58305/service-7$ find . -type l -exec ls -la {} ;
lrwxrwxrwx 1 vagrant vagrant 34 Oct 20 23:20 ./.terraform/modules/ecs_alb_service_task/terraform-aws-ecs-alb-service-task -> terraform-aws-ecs-alb-service-task

Expected Behavior

A clear and concise description of what you expected to happen.

Steps to Reproduce

Steps to reproduce the behavior:

  1. Go to https://app.terraform.io/
  2. Run terraform-aws-ecs-alb-service-task module with Remote build
  3. Enter '....'
  4. See error: failed pulling filesystem: ssh: failed parsing message: failed scanning message: expected integer๏ฟฝ

Screenshots

If applicable, add screenshots or logs to help explain your problem.
See Attached log file.

Environment (please complete the following information):

Anything that will help us triage the bug will help. Here are some ideas:

  • OS: Terraform v1.0.9--> linux_amd64
  • Version: "cloudposse/ecs-alb-service-task/aws" --> "0.58.0"

Additional Context

Add any other context about the problem here
run-kreVEvVqQPJMawqm-plan-log.txt
.

Creation of ECS service failed with enabled service discovery

Describe the Bug

Can't deploy ECS service with enabled service discovery

Expected Behavior

ECS service with enabled service discovery

Steps to Reproduce

Module are used in this way (ECS + ALB + EFS + Service Discovery)

module "service" {
  source = "git::https://github.com/cloudposse/terraform-aws-ecs-alb-service-task.git?ref=0.64.1"

  name                      = var.name
  environment               = var.environment
  container_definition_json = local.containers
  desired_count             = var.desired_count
  ecs_cluster_arn           = var.ecs_cluster_arn
  efs_volumes               = local.jenkins_volume
  ecs_load_balancers = [
    {
      container_name   = var.name
      container_port   = var.container_port
      elb_name         = ""
      target_group_arn = aws_lb_target_group.this.arn
    }
  ]
  launch_type                    = "EC2"
  network_mode                   = "bridge"
  subnet_ids                     = var.subnet_ids
  tags                           = var.common_tags
  task_cpu                       = null
  task_memory                    = null
  vpc_id                         = var.vpc_id
  ignore_changes_task_definition = false
  use_old_arn                    = false
  propagate_tags                 = "TASK_DEFINITION"
  service_registries              = [{
      registry_arn = aws_service_discovery_service.this.arn
      port         = 8080
      container_name = var.name
      container_port = 8080
    }]
}

Now ECS service won't deploy cause of this error:

module.service.aws_ecs_service.default[0]: Creating...
Error: failed creating ECS service (jenkins): InvalidParameterException: You cannot specify an IAM role for services that require a service linked role.
  on .terraform/modules/service/[main.tf](http://main.tf/) line 631, in resource "aws_ecs_service" "default":
 631: resource "aws_ecs_service" "default" {
Releasing state lock. This may take a few moments...
[terragrunt] 2022/09/30 10:54:48 Hit multiple errors:
exit status 1

When I am deleting service_registries, everything works fine.
Also switching network_mode to AWSVPC solves this problem too (due to lack of need for IAM policy in this case)

Environment:

  • Terraform = 0.14.11
  • Terragrunt = 0.25.3
  • AWS Provider = 3.75.2

Expose uniqueid of task_exec role

Describe the Feature

An output of the unique IDs for the two roles created for the service task:
task_exec_role_uniqueid

Expected Behavior

When using this module, I can access the uniqueid (https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role#unique_id) field on the task_exec role.

Use Case

We use the unique ids for permissions for secrets. Since I cannot access the uniqueid on the task_exec role, we have to do a chicken and an egg scenario of trying to access these fields through a data source:

# These are needed because the cloudposse module does not expose the roles unique ids
data "aws_iam_role" "task_exec_role" {
  name = module.ecs_alb_service_task.task_exec_role_name
}

Describe Ideal Solution

As stated above, just an output of the uniqueid for the task_exec role

failed creating ECS Task Definition with bind volume

Found a bug? Maybe our Slack Community can help.

Slack Community

Describe the Bug

Error: failed creating ECS Task Definition: ClientException: Fargate compatible task definitions do not support sourcePath
I do not have sourcePath value in my code. If

Expected Behavior

ECS service with bind volumes

Steps to Reproduce

module "container_definition_mysql" {
  source          = "registry.terraform.io/cloudposse/ecs-container-definition/aws"
  version         = "0.58.1"
  container_name  = "mysql"
....


module "ecs_core_service" {
  source             = "registry.terraform.io/cloudposse/ecs-alb-service-task/aws"
  version            = "0.66.2"
  name               = "taskname"
  container_definition_json =  module.container_definition_mysql.json_map_object
  runtime_platform = [{
    operating_system_family = "LINUX"
    cpu_architecture        = "X86_64"
  }]
  network_mode        = "awsvpc"
  launch_type         = "FARGATE"
  scheduling_strategy = "REPLICA"
  bind_mount_volumes = [{
    name      = "service-storage"
    host_path = "/var/logs"
  }]

Error

โ”‚ Error: failed creating ECS Task Definition (taskname): ClientException: Fargate compatible task definitions do not support sourcePath
โ”‚ 
โ”‚   with module.core-application.module.ecs_core_service.aws_ecs_task_definition.default[0],
โ”‚   on .terraform/modules/core-application.ecs_core_service/main.tf line 40, in resource "aws_ecs_task_definition" "default":
โ”‚   40: resource "aws_ecs_task_definition" "default" {
โ”‚ 

versions

aws provider 4.33
terraform 1.3.1
ecs fargate cluster 1.4.0

Need ability to customize ecs_execution_role with additional permissions

The task execution role may need additional customization to allow plans with additional security needs.

I achieved this (though I'm not sure this is the best approach) by doing:

In my main.tf calling terraform-aws-ecs-alb-service-task:

data "aws_iam_policy_document" "ecs_allow_ssm_access" {
  statement {
    sid       = "2"
    effect    = "Allow"
    resources = ["arn:aws:ssm:${var.aws_region}:${var.aws_account_id}:parameter/${var.stage}*"]
    actions   = [
      "ssm:List*",
      "ssm:Get*",
      "ssm:Describe*"
    ]
  }
}


module "ecs_alb_service_task" {
  ....
  custom_policy_document    = "${data.aws_iam_policy_document.ecs_allow_ssm_access.json}"`
}

And in main.tf inside this module:

data "aws_iam_policy_document" "ecs_execution_role" {
  source_json = "${var.custom_policy_document}"

  statement {
    sid       = "vLMpjauEwiCGsAJ9tJKsbSgn"
    effect    = "Allow"
    resources = ["*"]

    actions = [
      "ecr:GetAuthorizationToken",
      "ecr:BatchCheckLayerAvailability",
      "ecr:GetDownloadUrlForLayer",
      "ecr:BatchGetImage",
      "logs:CreateLogStream",
      "logs:PutLogEvents",
    ]
  }
}

Error when adding EFS volumes: When the volume parameter is specified, only one volume configuration type should be used.

Error: failed creating ECS Task Definition: ClientException: When the volume parameter is specified, only one volume configuration type should be used.

Terraform plan generates a change to the task definition which adds this:


      volume {

          host_path = "/test123"

          name      = "test123-efs"

 

          efs_volume_configuration {

              file_system_id          = "fs-123123123"

              root_directory          = "/test123"

              transit_encryption      = "ENABLED"

              transit_encryption_port = 2999

 

              authorization_config {

                  access_point_id = "fsap-123123123"

                  iam             = "DISABLED"

                }

            }

What actually works in AWS (by directly editing the JSON of a task), is this:


 

    "volumes": [

    {

      "fsxWindowsFileServerVolumeConfiguration": null,

      "efsVolumeConfiguration": {

        "transitEncryptionPort": null,

        "fileSystemId": "fs-123123123",

        "authorizationConfig": {

          "iam": "DISABLED",

          "accessPointId": "fsap-123123123"

        },

        "transitEncryption": "ENABLED",

        "rootDirectory": "/"

      },

      "name": "efs2",

      "host": null,

      "dockerVolumeConfiguration": null

    }

  ]

You can see the attribute names are slightly different, I'm not sure how much of that terraform translates, and how much is pointing to a bug with the module?

Currently on version 0.66.2 of the module, with terraform 1.3.2. Pretty confused since we do only have one volume configuration type set.

Error when trying to use EFS volumes in task/container definition

Describe the Bug

I'm trying to use an EFS volume in an ECS service definition. The volumes variable is defined such that one has to supply a value for both the efs_volume_configuration and docker_volume_configuration parameters. This seems to be a Terraform syntax limitation having to do with a lack of optional arguments. However, the solution of passing an empty list doesn't work in this case, yielding the following error:

ClientException: When the volume parameter is specified, only one volume configuration type should be used.

Passing null for docker_volume_configuration doesn't work, either:

Error: Invalid dynamic for_each value

  on .terraform/modules/ecs-service/main.tf line 70, in resource "aws_ecs_task_definition" "default":
  70:         for_each = lookup(volume.value, "docker_volume_configuration", [])
    |----------------
    | volume.value is object with 4 attributes

Cannot use a null value in for_each.

Expected Behavior

To be able to use EFS volumes in an ECS service definition.

Steps to Reproduce

Update the example in examples/complete with the following added to main.tf:

  volumes = [{
    name = "html"
    host_path = "/usr/share/nginx/html"
    # docker_volume_configuration = null
    docker_volume_configuration = []
    efs_volume_configuration = [{
      file_system_id = "fs-8de214f2"
      root_directory          = "/home/user/www"
      transit_encryption      = "ENABLED"
      transit_encryption_port = 2999
      authorization_config = []
    }]
  }]

Environment (please complete the following information):

Terraform v0.14.10, MacOS 10.15.7

external task_role and task_exec_role must exist before first run.

Describe the Bug

When specifing either task_role or task_exec_role terraform fails with the infamous "count" error:

The "count" value depends on resource attributes that cannot be determined
until apply...

This is due to:

count = local.enabled && length(var.task_role_arn) == 0 ? 1 : 0

you can work around it by using -target ofc.

Expected Behavior

working without using -target.

How about solving this using a different variable such as:

use_external_task_role: bool
use_external_task_exec_role: bool 

To determine the creation of task_role / task_exec_role.
I assume this would fix it.

Changing `task_exec_policy_arns` or `task_policy_arns` cause recreations

Found a bug? Maybe our Slack Community can help.

Slack Community

Describe the Bug

The resource aws_iam_role_policy_attachment uses count logic instead of a for_each which causes deletions and creations of attachments when adding or removing policies.

resource "aws_iam_role_policy_attachment" "ecs_exec" {
count = local.create_exec_role ? length(var.task_exec_policy_arns) : 0
policy_arn = var.task_exec_policy_arns[count.index]
role = join("", aws_iam_role.ecs_exec.*.id)
}

resource "aws_iam_role_policy_attachment" "ecs_task" {
count = local.create_task_role ? length(var.task_policy_arns) : 0
policy_arn = var.task_policy_arns[count.index]
role = join("", aws_iam_role.ecs_task.*.id)
}

If a for_each is used instead, this will prevent deleting and recreating all the attachments.

ecs_load_balancers optional attributes

Describe the Bug

I am trying to provision an ECS service + ECS task using an ALB. To configure the options for load balancer, I am using this configuration:

locals {
  alb = [{
    container_name   = coalesce(var.alb_container_name, module.this.id)
    container_port   = var.container_port
    elb_name         = null
    target_group_arn = var.target_group_arn
  }]
}

Such local configuration goes directly to the module input like so:

module "ecs_alb_service_task" {
  source  = "cloudposse/ecs-alb-service-task/aws"
  version = "0.64.1"

  ...
  ecs_load_balancers                 = local.alb
...

  context = module.this.context
}

Both validation and plan runs as expected, but during the apply operation a TF error is returned:

module.ecs_alb_service_task.aws_ecs_service.ignore_changes_task_definition[0]: Creating...
โ•ท
โ”‚ Error: error creating ECS service (mcoins-sandbox-analytics-denormalizer): InvalidParameterException: Load Balancer Name can not be blank.
โ”‚
โ”‚   with module.ecs_alb_service_task.aws_ecs_service.ignore_changes_task_definition[0],
โ”‚   on .terraform/modules/ecs_alb_service_task/main.tf line 351, in resource "aws_ecs_service" "ignore_changes_task_definition":
โ”‚  351: resource "aws_ecs_service" "ignore_changes_task_definition" {
โ”‚
โ•ต

Which means I'm sending an empty string to AWS API and causing the issue. This led me to try getting rid of the elb_name value, and getting this other error:

โ”‚ Error: Invalid value for input variable
โ”‚
โ”‚   on main.tf line 110, in module "ecs_alb_service_task":
โ”‚  110:   ecs_load_balancers                 = local.alb
โ”‚
โ”‚ The given value is not suitable for
โ”‚ module.ecs_alb_service_task.var.ecs_load_balancers declared at
โ”‚ .terraform/modules/ecs_alb_service_task/variables.tf:11,1-30: element 0:
โ”‚ attribute "elb_name" is required.

I've looked into AWS API documentation and Terraform Provider and make sure that only container_port and container_name are required arguments so you can choose between classic ELB or ALB/NLB.

I suggest the option here is to add the optional keyword to both elb_name and target_group_arn arguments, so whenever values are supplied here it's not mandatory to supply both. I can also supply a PR with the suggested change if you're ok with it.

Expected Behavior

Terraform should be able to apply with either Classic or ALB/NLB values, but not require both.

Steps to Reproduce

Steps to reproduce the behavior:

  1. Run an example that supplies ecs_load_balancers value with either classic ELB name or ALB target group ARN.
  2. Run terraform init && terraform apply

Screenshots

Code snippets and errors above

Environment (please complete the following information):

  • OS: OSX, arm64
  • Version: Monterrey 12.4
  • Terraform version:
Terraform v1.2.4
on darwin_arm64
+ provider registry.terraform.io/hashicorp/aws v4.22.0
+ provider registry.terraform.io/hashicorp/local v2.2.3
+ provider registry.terraform.io/hashicorp/null v3.1.1

Additional Context

None.

Unable to use source_security_group_id with security_group_rules

Found a bug? Maybe our Slack Community can help.

Slack Community

Describe the Bug

The objects in security_group_rules must match one another perfectly or else Terraform complains: hashicorp/terraform#26265

Expected Behavior

Able to actually create security group rules.

Steps to Reproduce

Use anything but cidr_blocks in security_group_rules:

  security_group_rules = [
    {
      type                     = "egress"
      from_port                = 0
      to_port                  = 0
      protocol                 = -1
      cidr_blocks              = ["0.0.0.0/0"]
      description              = "Allow all outbound traffic"
    },
    {
      type                     = "ingress"
      from_port                = local.container_port
      to_port                  = local.container_port
      protocol                 = "tcp"
      source_security_group_id = local.alb_security_group
      description              = "Enables incoming ALB traffic."
    }
  ]

Screenshots

If applicable, add screenshots or logs to help explain your problem.

Environment (please complete the following information):

Terraform v1.0.1
on darwin_amd64
+ provider registry.terraform.io/hashicorp/aws v3.51.0
+ provider registry.terraform.io/hashicorp/external v2.1.0
+ provider registry.terraform.io/hashicorp/github v3.0.0
+ provider registry.terraform.io/hashicorp/local v2.1.0
+ provider registry.terraform.io/hashicorp/null v3.1.0
+ provider registry.terraform.io/hashicorp/random v3.1.0
+ provider registry.terraform.io/hashicorp/template v2.2.0

Additional Context

Add any other context about the problem here.

Support wait_for_steady_state

Have a question? Please checkout our Slack Community or visit our Slack Archive.

Slack Community

Describe the Feature

Support wait_for_steady_state in the ECS service: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_service#wait_for_steady_state

Expected Behavior

Setting this to true we will make terraform wait until the new containers are healthy in the service before continuing, or throw an error if the deployment fails.

Use Case

Throwing an error if the deployment is unsuccessful for fast feedback.

Describe Ideal Solution

A new variable wait_for_steady_state that directly maps to https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/ecs_service#wait_for_steady_state

Alternatives Considered

You can use the aws CLI to do this, but it makes sense to have this dealt with by terraform.

Additional Context

Add any other context or screenshots about the feature request here.

Add property to alter naming scheme for iam resources

Have a question? Please checkout our Slack Community or visit our Slack Archive.

Slack Community

Describe the Feature

I would like to be able to alter the label_order property of the labels used for iam resources.
That is to keep the names shorter.
While you can have a name generated like tenant-namespace-environment-stage-name-attributes, it may actually not be desirable when you split your environments e.g. by teams, specific workloads or other criteria.
The way i would like to do the naming is something like:
Cluster = name
Service = name
IAM Roles = environment-name-attributes

Expected Behavior

I would like to be able to specify either an iam_role_label_order or iam_task_role_label_order and iam_execution_role_label_order variable to satisfy my needs.

Use Case

See Describe the feature

Describe Ideal Solution

See Expected Behavior

Alternatives Considered

Using a different value for the name variable, but that would be ugly.

Additional Context

I'd be happy to implement this, should be easy and non-breaking.

Add Example Usage

what

  • Add example invocation

why

  • We need this so we can soon enable automated continuous integration testing of module

Allow reusing an ecs service IAM role

Have a question? Please checkout our Slack Community in the #geodesic channel or visit our Slack Archive.

Slack Community

Describe the Feature

I'd like to reuse an ecs service role instead of creating a new one

Expected Behavior

Reuse an ecs service role instead of creating a new one

Use Case

I have an ecs service role that can be reused so I'd like to use it instead of creating a new one

Describe Ideal Solution

Perhaps var.service_role_arn

Alternatives Considered

Doing nothing

Additional Context

N/A

Defining Multiple Host Volumes Paths

Terraform v 0.12.7

I am getting the following issue when trying to define multiple volumes for one service.

Error: Unsupported argument

on .terraform/modules/batch_environment-dev.workers.airflow-webserver.alb_service_task/main.tf line 51, in resource "aws_ecs_task_definition" "default":
51: volume = "${var.volumes}"

An argument named "volume" is not expected here. Did you mean to define a
block of type "volume"?


`  volumes = [ {
    name = "content1"
    host_path = "mnt/folder1"

  },
    {
      name = "content2"
      host_path = "mnt/folder2"
    }
  ]

module "alb_service_task" {

  source = "git::https://github.com/cloudposse/terraform-aws-ecs-alb-service-task.git?ref=master"
  namespace = "namespace"
  stage = var.environment_name
  name = local.service_name
  alb_security_group = var.alb_security_group_arn
  container_definition_json = module.container_definition.json
  ecs_cluster_arn = var.ecs_cluster_id
  launch_type = var.launch_type
  vpc_id = var.vpc_id
  security_group_ids = var.security_group_ids
  subnet_ids = var.subnet_ids
  volumes = var.volumes

}

The problem I see is coming from here

`
resource "aws_ecs_task_definition" "default" {
  family                   = "${module.default_label.id}"
  container_definitions    = "${var.container_definition_json}"
  requires_compatibilities = ["${var.launch_type}"]
  network_mode             = "${var.network_mode}"
  cpu                      = "${var.task_cpu}"
  memory                   = "${var.task_memory}"
  execution_role_arn       = "${aws_iam_role.ecs_exec.arn}"
  task_role_arn            = "${aws_iam_role.ecs_task.arn}"
  tags                     = "${module.default_label.tags}"
  volume                   = "${var.volumes}"
}`

In the terraform documentation for the module it only ever seems to show it with volumes individually defined as blocks and the concept of multiple volumes being joined doesn't seem to be mentioned. My use case is an airflow cluster where all nodes have access to a shared set of code and then seperate volumes for each engineering domain where they define their individual code bases.

I was actually having a go at using this module in addition to container definitions as I was wondering if you guys might have solved the issue I've with defining task/service volumes that the terraform api doesn't seem to play nicely with passing in a list of volumes maps rather than defining the volumes seperately. Is there something I'm missing or any ideas for workarounds to this?

authorization_config in efs_volume_configuration will never be referenced

Found a bug? Maybe our Slack Community can help.

Slack Community

Describe the Bug

authorization_config in efs_volume_configuration references the outer volume.value object rather than efs_volume_configuration.value

Expected Behavior

authorization_config should be referenced correctly

Steps to Reproduce

Create a Fargate task with EFS volume, access point, and IAM auth

Screenshots

N/A

Environment (please complete the following information):

N/A

Additional Context

variable "volumes" {
  type = list(object({
    host_path = string
    name      = string
    docker_volume_configuration = list(object({
      autoprovision = bool
      driver        = string
      driver_opts   = map(string)
      labels        = map(string)
      scope         = string
    }))
    efs_volume_configuration = list(object({
      file_system_id          = string
      root_directory          = string
      transit_encryption      = string
      transit_encryption_port = string
      authorization_config = list(object({
        access_point_id = string
        iam             = string
      }))
    }))
  }))
  description = "Task volume definitions as list of configuration objects"
  default     = []
}

authorization_config is a member of efs_volume_configuration which is a member of the list of volumes. However the module is looking for authorization_config within the parent volumes object:

      dynamic "efs_volume_configuration" {
        for_each = lookup(volume.value, "efs_volume_configuration", [])
        content {
          file_system_id          = lookup(efs_volume_configuration.value, "file_system_id", null)
          root_directory          = lookup(efs_volume_configuration.value, "root_directory", null)
          transit_encryption      = lookup(efs_volume_configuration.value, "transit_encryption", null)
          transit_encryption_port = lookup(efs_volume_configuration.value, "transit_encryption_port", null)
          dynamic "authorization_config" {
            for_each = lookup(volume.value, "authorization_config", [])
            content {
              access_point_id = lookup(authorization_config.value, "access_point_id", null)
              iam             = lookup(authorization_config.value, "iam", null)
            }
          }
        }
      }

Specifically: for_each = lookup(volume.value, "authorization_config", [])
Should be: for_each = lookup(efs_volume_configuration.value, "authorization_config", [])

Action Required: Fix Renovate Configuration

There is an error with this repository's Renovate configuration that needs to be fixed. As a precaution, Renovate will stop PRs until it is resolved.

Error type: undefined. Note: this is a nested preset so please contact the preset author if you are unable to fix it yourself.

make aws_ecs_service `name` configurable

Describe the Feature

It would be a benefit if you cloud change the label_order for all aws_ecs_service resources.

Expected Behavior

ECS service name should be independent.

Use Case

If you parse a lot of context down to your module it will bloat your service name very quickly and make it unfriendly to read (especially inside the AWS console). Modifying the whole context isn't a solution because it would change the other resource names and tags as well which is not ideal or even not possible if you have for example multiple environments with the same service name.

Describe Ideal Solution

I would like to have a variable that allows me to modify only the name of the ecs service name.

Alternatives Considered

Alternatives to #183 could be to just introduce a variable only for the aws_ecs_service name.

Additional Context

Scenario: You have one AWS account for your SDLC(software development life cycle) in which you have an ECS cluster for each stage or environment. Your cluster name would be something like namespace-environment or namespace-environment-stage.

Current implementation

Input:

  namespace   = "test"
  environment = "sandbox1"
  stage       = "stage1"
  name        = "myservice1"
  attributes  = ["consumer"]

Result:

name = test-sandbox1-stage1-myservice1-consumer

In that case, you will have a lot of bloated prefixes that don't provide any value.

Recommended implementation

Input:

  namespace   = "test"
  environment = "sandbox1"
  stage       = "stage1"
  name        = "myservice1"
  attributes  = ["consumer"]
  ecs_service_label_order = ["name", "attributes"]

Result:

name = myservice1-consumer

In that case, you would modify the id without losing out on the tags but have a much more useful and easy-to-view name

Important
You don't want to modify the inputs in general because you will need them for other resources like aws_iam_role with there full name (id) on a multi environment or stage account.

Task role gets deleted before tasks fully deleted, leaving them stuck in "deprovisioning state"

Describe the Bug

When a service is replaced (maybe deleted, too), the task role is deleted before the tasks fully exit. This leaves them stuck in a "deprovisioning" state in the ECS console.

To have the tasks exit completely and leave this state, one has to recreate the ECS service role that was deleted.

Expected Behavior

Roles should only be deleted after the task/service has been fully removed

Screenshots

image

Allow reusing a task definition

Have a question? Please checkout our Slack Community in the #geodesic channel or visit our Slack Archive.

Slack Community

Describe the Feature

It would be nice to pass a task definition in so we can reuse task definitions.

Expected Behavior

Pass a task definition arn in

Use Case

I'd like to create multiple tasks that use the same task definition but deployed on different clusters.

Describe Ideal Solution

Perhaps var.task_definition_arn

Alternatives Considered

Duplicating resources outside the module

Additional Context

N/A

Unable to use module with bridge network_mode and without load balancers.

Found a bug? Maybe our Slack Community can help.

Slack Community

Describe the Bug

Looks like it is not possible to create service without defining ecs_load_balancers variable and use "bridge" network_mode.
We receive a error:
module.ecs_alb_service_task.aws_ecs_service.default[0]: Creating...
โ•ท
โ”‚ Error: error creating filebeat service: error waiting for ECS service (filebeat) creation: InvalidParameterException: IAM roles are only valid for services configured to use load balancers.

Look like local variable "enable_ecs_service_role" has wrong conditions.
enable_ecs_service_role = module.this.enabled && var.network_mode != "awsvpc" && length(var.ecs_load_balancers) <= 1

It should be: length(var.ecs_load_balancers) >= 1

Expected Behavior

Able to create service in Bridge mode without load balancers.

Environment (please complete the following information):

Terraform v1.0.5
on linux_amd64

  • provider registry.terraform.io/hashicorp/aws v3.61.0
  • provider registry.terraform.io/hashicorp/local v2.1.0
  • provider registry.terraform.io/hashicorp/null v3.1.0
  • provider registry.terraform.io/hashicorp/template v2.2.0

Additional Context

Add any other context about the problem here.

Supply a custom task iam role

Describe the Feature

var.task_role_arn would be used for the service task instead of a new task role created.

Expected Behavior

It would be nice if we could supply our own custom task iam role.

Use Case

We already have a task iam role present for our task. We want to convert the task to fargate and have decided to use this module, however, this module doesn't have a way of reusing an existing task role and if the name is different, it has to be recreated.

Describe Ideal Solution

It would be nice if we could supply our own custom task iam role.

Alternatives Considered

N/A

Additional Context

N/A

Container definition rebuild on every run

using this module as part of https://github.com/cloudposse/terraform-aws-ecs-web-app

Working on the web app module, and increased the version to 0.6.0

module "ecs_alb_service_task" {
  source                    = "git::https://github.com/cloudposse/terraform-aws-ecs-alb-service-task.git?ref=tags/0.6.0"
  name                      = "${var.name}"
  namespace                 = "${var.namespace}"
  stage                     = "${var.stage}"
  alb_target_group_arn      = "${module.alb_ingress.target_group_arn}"
  container_definition_json = "${module.container_definition.json}"
  container_name            = "${module.default_label.id}"
  desired_count             = "${var.desired_count}"
  task_cpu                  = "${var.container_cpu}"
  task_memory               = "${var.container_memory}"
  ecr_repository_name       = "${module.ecr.repository_name}"
  ecs_cluster_arn           = "${var.ecs_cluster_arn}"
  launch_type               = "${var.launch_type}"
  vpc_id                    = "${var.vpc_id}"
  security_group_ids        = ["${var.ecs_security_group_ids}"]
  private_subnet_ids        = ["${var.ecs_private_subnet_ids}"]
  container_port            = "${var.container_port}"
}
module "hw_pipeline" {
    source                                          = "../../../terraform-aws-ecs-web-app"
    namespace                                       = "${var.namespace}"
    stage                                           = "${var.stage}"
    name                                            = "hw"
    listener_arns                                   = ["${module.hw_alb.https_listener_arn}", "${module.hw_alb.http_listener_arn}"]
    listener_arns_count                             = "2"
    aws_logs_region                                 = "us-west-2"

    vpc_id                                          = "${module.vpc.vpc_id}"
    codepipeline_enabled                            = "true"

    ecs_cluster_arn                                 = "${aws_ecs_cluster.ecs_cluster.arn}"
    ecs_cluster_name                                = "${aws_ecs_cluster.ecs_cluster.name}"
    ecs_private_subnet_ids                          = ["${module.app_subnets.az_subnet_ids["us-west-2a"]}", "${module.app_subnets.az_subnet_ids["us-west-2b"]}", "${module.app_subnets.az_subnet_ids["us-west-2c"]}"]

    ecs_security_group_ids                          = ["${aws_security_group.app_traffic.id}"]
    container_cpu                                   = "512"
    container_memory                                = "1024"
    container_image                                 = "xxxxxxx.dkr.ecr.us-west-2.amazonaws.com/bv-staging-hw-ecr:latest"
    container_port                                  = "4000"
    port_mappings                                   = [
      {
        containerPort                               = "4000"
        protocol                                    = "tcp"
      }
    ]

    desired_count                                   = "1"
    alb_name                                        = "${module.hw_alb.alb_name}"
    alb_arn_suffix                                  = "${module.hw_alb.alb_arn_suffix}"
    alb_ingress_healthcheck_path                    = "/"
    alb_ingress_paths                               = ["/*"]
    alb_ingress_listener_priority                   = "100"
    github_oauth_token                              = "${data.aws_ssm_parameter.github_oauth_token.value}"
    repo_owner                                      = "xxxxxxxxx"
    repo_name                                       = "hello_world"
    branch                                          = "master"
    ecs_alarms_enabled                              = "true"
    alb_target_group_alarms_enabled                 = "true"
    alb_target_group_alarms_3xx_threshold           = "25"
    alb_target_group_alarms_4xx_threshold           = "25"
    alb_target_group_alarms_5xx_threshold           = "25"
    alb_target_group_alarms_response_time_threshold = "0.5"
    alb_target_group_alarms_period                  = "300"
    alb_target_group_alarms_evaluation_periods      = "1"

    environment = [
      {
        name = "COOKIE"
        value = "cJzXwLAT8dwD9SSgBITcRI1ib4ejNts4bgagcfhv"
      },
      {
        name = "PORT"
        value = "80"
      },
      {
        name = "DATABASE_URL"
        value ="postgres://${var.db_user}:${data.aws_ssm_parameter.db_password.value}@${module.rds_instance.instance_endpoint}/apidb"
      }
    ]
}

Variable ecs_load_balancers definition

Hello. First of all, thank you much for the module!

Not sure if this is a bug, but trying to attach Target Group via ecs_load_balancers block raised the error, even with both possible definitions, see below:

Terraform Version

Terraform v0.12.12

First try:

module "ecs_alb_service_task" {
//...
  ecs_load_balancers          = [
    {
      target_group_arn  = join("", aws_lb_target_group.module_tg.*.arn)
      container_name    = var.container_name
      container_port    = var.container_port
    }
  ]
//...
}

Crash Output

Error: Invalid value for module argument
...
The given value is not suitable for child module variable "ecs_load_balancers"
...
element 0: attribute "elb_name" is required.

Well...

Second try - add elb_name:

module "ecs_alb_service_task" {
//...
  ecs_load_balancers          = [
    {
      elb_name = "some_value"
      target_group_arn  = join("", aws_lb_target_group.module_tg.*.arn)
      container_name    = var.container_name
      container_port    = var.container_port
    }
  ]
//...
}

Crash Output

Error: InvalidParameterException: loadBalancerName and targetGroupArn cannot both be specified. You must specify either a loadBalancerName or a targetGroupArn.
	status code: 400, request id: ...
... in resource "aws_ecs_service" "default":

As a workaround cloned a module and removed elb_name from variables.tf. Since the module called ...alb-service-task think that ELB isn't so important :)

Only create aws_security_group if var.network_mode = "awsvpc"

Found a bug? Maybe our Slack Community can help.

Slack Community

Describe the Bug

Looks like the security group is used only if var.network_mode = "awsvpc"

aws_ecs_service.ignore_changes_task_definition

dynamic "network_configuration" {
for_each = var.network_mode == "awsvpc" ? ["true"] : []
content {
security_groups = compact(concat(var.security_group_ids, aws_security_group.ecs_service.*.id))
subnets = var.subnet_ids
assign_public_ip = var.assign_public_ip
}
}

aws_ecs_service.default

dynamic "network_configuration" {
for_each = var.network_mode == "awsvpc" ? ["true"] : []
content {
security_groups = compact(concat(var.security_group_ids, aws_security_group.ecs_service.*.id))
subnets = var.subnet_ids
assign_public_ip = var.assign_public_ip
}
}

But currently the security group and its rules will be created regardless of the var.network_mode.

Expected Behavior

It should not create it unless var.network_mode = "awsvpc"

Steps to Reproduce

N/A

Additional Context

N/A

Missing support for bind_mount style service volumes

Have a question? Please checkout our Slack Community or visit our Slack Archive.

Slack Community

Describe the Feature

There is support for docker_volumes, fsx_volumes, and efs_volumes, but there is also a 4th default type called bind mount in ECS.

Describe Ideal Solution

Adding a variable called bind_mount_volumes, having it just be a list of objects with host_path and name, and concatting it with the volumes local variable should enable this functionality.

Additional Context

image

Support old (not long) arns with an option to NOT tag the ecs service

Have a question? Please checkout our Slack Community in the #geodesic channel or visit our Slack Archive.

Slack Community

Describe the Feature

Request modifying this module so it can support skipping tagging of the ECS service if for whatever reason you cannot add long arn support on the account

Expected Behavior

I'm in an old account where we cannot add long arn support. When I apply this module, it fails to create the ecs service because it tries to tag it.

Use Case

Applying module

Describe Ideal Solution

Works with both long arn and old arn accounts.

Alternatives Considered

  • Forking module
  • Not using this module

Additional Context

#39

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.