{
	"Outputs": {
		"ECSCluster": {
			"Value": {
				"Ref": "ECSCluster"
			},
			"Description": "The created cluster."
		}
	},
	"Metadata": {
		"AWSToolsMetrics": {
			"IaC_Generator": "arn:aws:cloudformation:eu-central-1:671607590936:generatedTemplate/2dab13ab-9b07-45f7-b975-c10fa2c42bc7"
		},
		"AWS::CloudFormation::Interface": {
			"ParameterGroups": [
				{
					"Label": {
						"default": "Network Configuration"
					},
					"Parameters": [
						"VpcId",
						"SubnetIDs",
						"SecurityGroupIDs",
						"PrivateRouteTable",
						"VpcEndpointsMode"
					]
				},
				{
					"Label": {
						"default": "ECS Cluster Settings"
					},
					"Parameters": [
						"ECSClusterName",
						"ALinkServerServiceName",
						"AdminServiceName",
						"ServiceConnectNamespace"
					]
				},
				{
					"Label": {
						"default": "ECS Cluster IAM Roles Settings"
					},
					"Parameters": [
						"IamRolesCreationMode",
						"ALinkServerECSContainerTaskRole",
						"EcsTaskExecutionRoleName"
					]
				},
				{
					"Label": {
						"default": "Application Load Balaner Settings"
					},
					"Parameters": [
						"ApplicationLoadBalancerName",
						"TargetGroupALinkServerworkers8000Name",
						"TargetGroupALinkServerAdmin8001Name"
					]
				}
			],
			"ParameterLabels": {
				"VpcId": {
					"default": "Target VPC"
				},
				"SubnetIDs": {
					"default": "Target Subnets"
				},
				"SecurityGroupIDs": {
					"default": "Security group ID"
				},
				"PrivateRouteTable": {
					"default": "VPC Route table for use with S3 and DynamoDB Endpoints"
				},
				"ECSClusterName": {
					"default": "Name of the ECS cluster"
				},
				"ALinkServerServiceName": {
					"default": "Name of the ALinkServer service"
				},
				"ALinkServerECSContainerTaskRole": {
					"default": "Name of the ALinkServer ECS Container Task Role"
				},
				"ServiceConnectNamespace": {
					"default": "Name of the ServiceConnect Namespace"
				},
				"TargetGroupALinkServerworkers8000Name": {
					"default": "Name of the ALinkServer Workers Application Load Balancer Target Group"
				},
				"TargetGroupALinkServerAdmin8001Name": {
					"default": "Name of the ALinkServer Admin Application Load Balancer Target Group"
				},
				"IamRolesCreationMode": {
					"default": "Role Creation Preference"
					},
				"VpcEndpointsMode": {
					"default": "VPC Endpoints Creation Preference"
					},
				"EcsTaskExecutionRoleName": {
					"default": "Name of the ALinkServer ECS Task Execution Role"
				},
				"ApplicationLoadBalancerName": {
					"default": "Name of the ALinkServer Application Load Balancer"
				},
				"AdminServiceName": {
					"default": "Name of the ALinkServer Admin service"
				}
			}
		},
		"AWS::Composer::Groups": {
			"Group2": {
				"Label": "ECS Cluster",
				"Members": [
					"ALinkServerService",
					"ECSCluster",
					"AdminService"
				]
			},
			"Group3": {
				"Label": "Application Load Balancer",
				"Members": [
					"TargetGroupALinkServeradmin8001",
					"TargetGroupALinkServerworkers8000",
					"ListenerALinkServerALB8000",
					"ListenerALinkServerALB8001",
					"LoadBalancerALinkServerALB"
				]
			}
		}
	},
	"AWSTemplateFormatVersion": "2010-09-09",
	"Description": "CloudFormation Stack template for creation of Sol4Cloud ALinkServer ECS cluster running main ALinkServer service and the Admin service. Template also installs VPC Endpoints for S3, STS, Secrects Manager, DynamoDB, Metering and logs to ensure all communication happens within AWS network and doesn't go over public internet.",
	"Parameters": {
		"VpcId": {
			"ConstraintDescription": "VPC Id must begin with 'vpc-' and have a valid uuid",
			"Type": "AWS::EC2::VPC::Id",
			"Description": "Select an existing VPC to install the ECS Service into"
		},
		"SecurityGroupIDs": {
			"Type": "List<AWS::EC2::SecurityGroup::Id>",
			"Description": "Specify list of the Security Groups for communication of the ALinkServer services. Ports 8000 and 8001 have to be allowed in the inbound rules"
		},
		"SubnetIDs": {
			"Type": "List<AWS::EC2::Subnet::Id>",
			"Description": "Specifies the list of existing VPC Subnets where ECS cluster services will run. At least 2 subnets in different availability zones are required for high availability of the services. Make sure to select subnets that allow VPC Endpoint configuration (see documentation or check in AWS Console)."
		},
		"PrivateRouteTable": {
			"Type": "String",
			"Description": "Specify route table of the subnets above. In new browser window go to AWS Console/VPC/Route tables and copy the ID of the route table. Route table needs to allow connection to application load balancer and to SAP system."
		},
		"ECSClusterName": {
			"Default": "sol4cloud-alinkserver-cluster",
			"Type": "String",
			"Description": "Specifies the ECS Cluster Name with which the ALinkServer services would be associated"
		},
		"ALinkServerServiceName": {
			"Type": "String",
			"Default": "alinkserver-worker-service-8000",
			"Description": "Specifies the name of the ALinkServer worker service (port 8000) in the ECS cluster"
		},
		"AdminServiceName": {
			"Type": "String",
			"Default": "alinkserver-admin-service-8001",
			"Description": "Specifies the name of the ALinkServer Admin service (port 8001) in the ECS cluster"
		},
		"ServiceConnectNamespace": {
			"Type": "String",
			"Default": "alinkserver-namespace",
			"Description": "Specifies the name of the Namespace configured for the communication of ALinkServer service with the Admin service"
		},
		"ALinkServerECSContainerTaskRole": {
			"Type": "String",
			"Default": "alinkserver-EcsContainerTaskRole",
			"Description": "Specifies the name of the role that will be used to run application containers. This role needs access to AWS S3, DynamoDB, Secrets Manager and AWS MeteringService"
		},
		"EcsTaskExecutionRoleName": {
			"Type": "String",
			"Default": "alinkserver-EcsTaskExecutionRole",
			"Description": "A task execution IAM role is used by the container agent to make AWS API requests on your behalf"
		},
		"ApplicationLoadBalancerName": {
			"Type": "String",
			"Default": "alinkserver-ALB",
			"Description": "Specifies the name of the Application Load Balancer that will be used to route traffic to the ALinkServer services"
		},
		"TargetGroupALinkServerworkers8000Name": {
			"Type": "String",
			"Default": "alinkserver-target-group-8000",
			"Description": "Specifies the name of the target group for the ALinkServer workers on port 8000"
		},
		"TargetGroupALinkServerAdmin8001Name": {
			"Type": "String",
			"Default": "alinkserver-target-group-8001",
			"Description": "Specifies the name of the target group for the ALinkServer Admin service on port 8001"
		},
		"IamRolesCreationMode": {
			"Type": "String",
			"Description": "Choose whether to create new IAM Roles for ALinkServer Task and Task Execution or use existing roles.",
			"Default": "Create New Roles",
			"AllowedValues": [
				"Create New Roles",
				"Use Existing Roles"
			]
    	},
		"VpcEndpointsMode": {
			"Type": "String",
			"Description": "Choose whether to create VPC Endpoints for ECS Services to use AWS internal network communication or skip the creation (and use custom networking setup).",
			"Default": "Create VPC Endpoints",
			"AllowedValues": [
				"Create VPC Endpoints",
				"No VPC Endpoints, custom network configuration"
			]
    	}
		},
		"Conditions": {
			"CreateNewRole": {
			"Fn::Equals": [
				{
				"Ref": "IamRolesCreationMode"
				},
				"Create New Roles"
			]
			},
		"CreateEndpointsCondition": {
			"Fn::Equals": [
				{
				"Ref": "VpcEndpointsMode"
				},
				"Create VPC Endpoints"
			]
			}							
	},
	"Resources": {
		"EndpointStack": {
			"Type": "AWS::CloudFormation::Stack",
			"Condition": "CreateEndpointsCondition",
			"Properties": {
				"TemplateURL": "https://sol4cloud-alinkserver-cf-templates.s3.eu-central-1.amazonaws.com/2026-09-10T160836-ALinkServer-endpoints-0.1.48.json",
				"Parameters": {
				"VpcId": { "Ref": "VpcId" },
				"SubnetIDs": { "Fn::Join": [",", { "Ref": "SubnetIDs" }] },
				"SecurityGroupIDs": { "Fn::Join": [",", { "Ref": "SecurityGroupIDs" }] },
				"PrivateRouteTable": { "Ref": "PrivateRouteTable" }
				}
			}
		},
		"ECSCluster": {
			"Properties": {
				"CapacityProviders": [
					"FARGATE",
					"FARGATE_SPOT"
				],
				"ClusterName": {
					"Ref": "ECSClusterName"
				},
				"ClusterSettings": [
					{
						"Value": "disabled",
						"Name": "containerInsights"
					}
				],
				"Configuration": {
					"ExecuteCommandConfiguration": {
						"Logging": "DEFAULT"
					}
				},
				"Tags": []
			},
			"Type": "AWS::ECS::Cluster"
		},
		"AlinkServerTaskDefinition": {
			"UpdateReplacePolicy": "Retain",
			"Type": "AWS::ECS::TaskDefinition",
			"DeletionPolicy": "Delete",
			"Properties": {
				"TaskRoleArn": {
					"Fn::If": [
						"CreateNewRole",
						{
						"Fn::GetAtt": [
							"IAMRoleALinkServerECSContainerTaskRole",
							"Arn"
						]
						},
						{
						"Ref": "ALinkServerECSContainerTaskRole"
						}
					]
					},
				"InferenceAccelerators": [],
				"Memory": "8192",
				"PlacementConstraints": [],
				"Cpu": "4096",
				"RequiresCompatibilities": [
					"EC2",
					"FARGATE"
				],
				"NetworkMode": "awsvpc",
				"ExecutionRoleArn": {
					"Fn::If": [
						"CreateNewRole",
						{
						"Fn::GetAtt": [
							"IAMRoleEcsTaskExecutionRole",
							"Arn"
						]
						},
						{
						"Ref": "EcsTaskExecutionRoleName"
						}
					]
					},
				"RuntimePlatform": {
					"OperatingSystemFamily": "LINUX",
					"CpuArchitecture": "X86_64"
				},
				"Volumes": [],
				"ContainerDefinitions": [
					{
						"Secrets": [],
						"HealthCheck": {
							"Command": [
								"CMD-SHELL",
								"wget --no-verbose --tries=1 --spider http://127.0.01:8000/health || exit 1"
							],
							"Timeout": 5,
							"Retries": 3,
							"Interval": 60,
							"StartPeriod": 30
						},
						"VolumesFrom": [],
						"Cpu": 0,
						"EntryPoint": [],
						"DnsServers": [],
						"Image": "709825985650.dkr.ecr.us-east-1.amazonaws.com/sol4cloud/sol4cloud-alinkserver:0.1.48",
						"Essential": true,
						"LogConfiguration": {
							"SecretOptions": [],
							"Options": {
								"awslogs-group": "/ecs/alinkserver",
								"awslogs-create-group": "true",
								"awslogs-region": {
									"Fn::Sub": "${AWS::Region}"
								},
								"awslogs-stream-prefix": "ecs"
							},
							"LogDriver": "awslogs"
						},
						"ResourceRequirements": [],
						"EnvironmentFiles": [],
						"Name": "alinkserver",
						"DockerSecurityOptions": [],
						"SystemControls": [],
						"DnsSearchDomains": [],
						"CredentialSpecs": [],
						"Ulimits": [],
						"ExtraHosts": [],
						"MountPoints": [],
						"DependsOn": [],
						"DockerLabels": {},
						"PortMappings": [
							{
								"ContainerPort": 8000,
								"AppProtocol": "http",
								"Protocol": "tcp",
								"HostPort": 8000,
								"Name": "alinkserver"
							}
						],
						"Command": [],
						"Environment": [
							{
								"Value": "1",
								"Name": "PYTHONUNBUFFERED"
							}
						],
						"Links": []
					}
				],
				"Family": "alinkserver-task-def",
				"Tags": []
			}
		},
		"AdminServerTaskDefinition": {
			"UpdateReplacePolicy": "Retain",
			"Type": "AWS::ECS::TaskDefinition",
			"DeletionPolicy": "Delete",
			"Properties": {
				"TaskRoleArn": {
					"Fn::If": [
						"CreateNewRole",
						{
						"Fn::GetAtt": [
							"IAMRoleALinkServerECSContainerTaskRole",
							"Arn"
						]
						},
						{
						"Ref": "ALinkServerECSContainerTaskRole"
						}
					]
					},
				"InferenceAccelerators": [],
				"Memory": "2048",
				"PlacementConstraints": [],
				"Cpu": "512",
				"RequiresCompatibilities": [
					"EC2",
					"FARGATE"
				],
				"NetworkMode": "awsvpc",
				"ExecutionRoleArn": {
					"Fn::If": [
						"CreateNewRole",
						{
						"Fn::GetAtt": [
							"IAMRoleEcsTaskExecutionRole",
							"Arn"
						]
						},
						{
						"Ref": "EcsTaskExecutionRoleName"
						}
					]
					},
				"RuntimePlatform": {
					"OperatingSystemFamily": "LINUX",
					"CpuArchitecture": "X86_64"
				},
				"Volumes": [],
				"ContainerDefinitions": [
					{
						"Secrets": [],
						"HealthCheck": {
							"Command": [
								"CMD-SHELL",
								"wget --no-verbose --tries=1 --spider http://127.0.01:8001/health || exit 1"
							],
							"Timeout": 5,
							"Retries": 3,
							"Interval": 60,
							"StartPeriod": 30
						},
						"VolumesFrom": [],
						"Cpu": 0,
						"EntryPoint": [],
						"DnsServers": [],
						"Image": "709825985650.dkr.ecr.us-east-1.amazonaws.com/sol4cloud/sol4cloud-alinkserveradmin:0.1.48",
						"Essential": true,
						"LogConfiguration": {
							"SecretOptions": [],
							"Options": {
								"awslogs-group": "/ecs/alinkserveradmin",
								"awslogs-create-group": "true",
								"awslogs-region": {
									"Fn::Sub": "${AWS::Region}"
								},
								"awslogs-stream-prefix": "ecs"
							},
							"LogDriver": "awslogs"
						},
						"ResourceRequirements": [],
						"EnvironmentFiles": [],
						"Name": "alinkserveradmin",
						"DockerSecurityOptions": [],
						"SystemControls": [],
						"DnsSearchDomains": [],
						"CredentialSpecs": [],
						"Ulimits": [],
						"ExtraHosts": [],
						"MountPoints": [],
						"DependsOn": [],
						"DockerLabels": {},
						"PortMappings": [
							{
								"ContainerPort": 8001,
								"AppProtocol": "http",
								"Protocol": "tcp",
								"HostPort": 8001,
								"Name": "alinkserveradmin"
							}
						],
						"Command": [],
						"Environment": [
							{
								"Value": "1",
								"Name": "PYTHONUNBUFFERED"
							}
						],
						"Links": []
					}
				],
				"Family": "alinkserveradmin-task-def",
				"Tags": []
			}
		},
		"ALinkServerServiceConnectNamespace": {
			"Type": "AWS::ServiceDiscovery::HttpNamespace",
			"DeletionPolicy": "Delete",
			"Properties": {
				"Name": {
					"Ref": "ServiceConnectNamespace"
				},
				"Description": "ALinkServer Service Connect Namespace"
			}
		},
		"ALinkServerService": {
			"Type": "AWS::ECS::Service",
			"DependsOn": ["AdminService", "ListenerALinkServerALB8001"],
			"Properties": {
				"Cluster": {
					"Ref": "ECSClusterName"
				},
				"CapacityProviderStrategy": [
					{
						"CapacityProvider": "FARGATE",
						"Base": 0,
						"Weight": 1
					}
				],
				"TaskDefinition": {
					"Ref": "AlinkServerTaskDefinition"
				},
				"ServiceName": {
					"Ref": "ALinkServerServiceName"
				},
				"SchedulingStrategy": "REPLICA",
				"DesiredCount": 0,
				"LoadBalancers": [
					{
						"ContainerName": "alinkserver",
						"ContainerPort": 8000,
						"TargetGroupArn": {
							"Ref": "TargetGroupALinkServerworkers8000"
						}
					}
				],
				"NetworkConfiguration": {
					"AwsvpcConfiguration": {
						"AssignPublicIp": "DISABLED",
						"SecurityGroups": {
							"Ref": "SecurityGroupIDs"
						},
						"Subnets": {
							"Ref": "SubnetIDs"
						}
					}
				},
				"PlatformVersion": "LATEST",
				"DeploymentConfiguration": {
					"DeploymentCircuitBreaker": {
						"Enable": true,
						"Rollback": true
					},
					"MaximumPercent": 200,
					"MinimumHealthyPercent": 100
				},
				"DeploymentController": {
					"Type": "ECS"
				},
				"ServiceConnectConfiguration": {
					"Enabled": true,
					"Namespace": {
						"Fn::GetAtt": [
							"ALinkServerServiceConnectNamespace",
							"Arn"
						]
					}
				},
				"Tags": [],
				"EnableECSManagedTags": true,
				"EnableExecuteCommand": false
			}
		},
		"AdminService": {
			"Type": "AWS::ECS::Service",
			"DependsOn": ["ECSCluster", "ListenerALinkServerALB8001"],
			"Properties": {
				"Cluster": {
					"Ref": "ECSClusterName"
				},
				"CapacityProviderStrategy": [
					{
						"CapacityProvider": "FARGATE",
						"Base": 0,
						"Weight": 1
					}
				],
				"TaskDefinition": {
					"Ref": "AdminServerTaskDefinition"
				},
				"ServiceName": {
					"Ref": "AdminServiceName"
				},
				"SchedulingStrategy": "REPLICA",
				"DesiredCount": 0,
				"LoadBalancers": [
					{
						"ContainerName": "alinkserveradmin",
						"ContainerPort": 8001,
						"TargetGroupArn": {
							"Ref": "TargetGroupALinkServeradmin8001"
						}
					}
				],
				"NetworkConfiguration": {
					"AwsvpcConfiguration": {
						"AssignPublicIp": "DISABLED",
						"SecurityGroups": {
							"Ref": "SecurityGroupIDs"
						},
						"Subnets": {
							"Ref": "SubnetIDs"
						}
					}
				},
				"PlatformVersion": "LATEST",
				"DeploymentConfiguration": {
					"DeploymentCircuitBreaker": {
						"Enable": true,
						"Rollback": true
					},
					"MaximumPercent": 200,
					"MinimumHealthyPercent": 100
				},
				"DeploymentController": {
					"Type": "ECS"
				},
				"ServiceConnectConfiguration": {
					"Enabled": true,
					"Namespace": {
						"Fn::GetAtt": [
							"ALinkServerServiceConnectNamespace",
							"Arn"
						]
					},
					"Services": [
						{
							"PortName": "alinkserveradmin",
							"DiscoveryName": "admin-server",
							"ClientAliases": [
								{
									"Port": 8001,
									"DnsName": "admin-server.internal.local"
								}
							]
						}
					]
				},
				"Tags": [],
				"EnableECSManagedTags": true,
				"EnableExecuteCommand": false
			}
		},
		"IAMRoleALinkServerECSContainerTaskRole": {
			"UpdateReplacePolicy": "Retain",
			"Type": "AWS::IAM::Role",
			"Condition": "CreateNewRole",			
			"DeletionPolicy": "Delete",
			"Properties": {
				"Path": "/",
				"ManagedPolicyArns": [
					"arn:aws:iam::aws:policy/AWSMarketplaceMeteringFullAccess",
					"arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess_v2",
					"arn:aws:iam::aws:policy/AmazonS3FullAccess",
					"arn:aws:iam::aws:policy/SecretsManagerReadWrite"
				],
				"MaxSessionDuration": 3600,
				"RoleName": {
					"Ref": "ALinkServerECSContainerTaskRole"
				},
				"Description": "",
				"AssumeRolePolicyDocument": {
					"Version": "2012-10-17",
					"Statement": [
						{
							"Condition": {
								"StringEquals": {
									"aws:SourceAccount": {
										"Fn::Sub": "${AWS::AccountId}"
									}
								},
								"ArnLike": {
									"aws:SourceArn": {
										"Fn::Sub": "arn:aws:ecs:${AWS::Region}:${AWS::AccountId}:*"
									}
								}
							},
							"Action": "sts:AssumeRole",
							"Effect": "Allow",
							"Principal": {
								"Service": "ecs-tasks.amazonaws.com"
							}
						}
					]
				}
			}
		},
		"IAMRoleEcsTaskExecutionRole": {
			"UpdateReplacePolicy": "Retain",
			"Type": "AWS::IAM::Role",
			"Condition": "CreateNewRole",			
			"DeletionPolicy": "Delete",
			"Properties": {
				"Path": "/",
				"ManagedPolicyArns": [
					"arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy",
					"arn:aws:iam::aws:policy/service-role/AWSAppSyncPushToCloudWatchLogs"
				],
				"MaxSessionDuration": 3600,
				"RoleName": {
					"Ref": "EcsTaskExecutionRoleName"
				},
				"AssumeRolePolicyDocument": {
					"Version": "2008-10-17",
					"Statement": [
						{
							"Action": "sts:AssumeRole",
							"Effect": "Allow",
							"Principal": {
								"Service": "ecs-tasks.amazonaws.com"
							},
							"Sid": ""
						}
					]
				}
			}
		},
		"TargetGroupALinkServeradmin8001": {
			"UpdateReplacePolicy": "Retain",
			"Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
			"DeletionPolicy": "Delete",
			"Properties": {
				"IpAddressType": "ipv4",
				"HealthCheckIntervalSeconds": 60,
				"Matcher": {
					"HttpCode": "200"
				},
				"HealthCheckPath": "/health",
				"Port": 8001,
				"Targets": [],
				"HealthCheckEnabled": true,
				"ProtocolVersion": "HTTP1",
				"UnhealthyThresholdCount": 2,
				"HealthCheckTimeoutSeconds": 5,
				"Name": {
					"Ref": "TargetGroupALinkServerAdmin8001Name"
				},
				"VpcId": {
					"Ref": "VpcId"
				},
				"HealthyThresholdCount": 5,
				"HealthCheckProtocol": "HTTP",
				"TargetType": "ip",
				"HealthCheckPort": "traffic-port",
				"Protocol": "HTTP",
				"Tags": []
			}
		},
		"TargetGroupALinkServerworkers8000": {
			"UpdateReplacePolicy": "Retain",
			"Type": "AWS::ElasticLoadBalancingV2::TargetGroup",
			"DeletionPolicy": "Delete",
			"Properties": {
				"IpAddressType": "ipv4",
				"HealthCheckIntervalSeconds": 60,
				"Matcher": {
					"HttpCode": "200"
				},
				"HealthCheckPath": "/health",
				"Port": 8000,
				"Targets": [],
				"HealthCheckEnabled": true,
				"ProtocolVersion": "HTTP1",
				"UnhealthyThresholdCount": 2,
				"HealthCheckTimeoutSeconds": 5,
				"Name": {
					"Ref": "TargetGroupALinkServerworkers8000Name"
				},
				"VpcId": {
					"Ref": "VpcId"
				},
				"HealthyThresholdCount": 5,
				"HealthCheckProtocol": "HTTP",
				"TargetType": "ip",
				"HealthCheckPort": "traffic-port",
				"Protocol": "HTTP",
				"Tags": []
			}
		},
		"ListenerALinkServerALB8000": {
			"UpdateReplacePolicy": "Retain",
			"DependsOn": "LoadBalancerALinkServerALB",						
			"Type": "AWS::ElasticLoadBalancingV2::Listener",
			"DeletionPolicy": "Delete",
			"Properties": {
				"Protocol": "HTTP",
				"LoadBalancerArn": {
					"Ref": "LoadBalancerALinkServerALB"
				},
				"DefaultActions": [
					{
						"Order": 1,
						"TargetGroupArn": {
							"Ref": "TargetGroupALinkServerworkers8000"
						},
						"Type": "forward"
					}
				],
				"Port": 8000
			}
		},
		"LoadBalancerALinkServerALB": {
			"UpdateReplacePolicy": "Retain",
			"Type": "AWS::ElasticLoadBalancingV2::LoadBalancer",
			"DeletionPolicy": "Delete",
			"Properties": {
				"IpAddressType": "ipv4",
				"SecurityGroups": {
					"Ref": "SecurityGroupIDs"
				},
				"Subnets": {
					"Ref": "SubnetIDs"
				},
				"Type": "application",
				"Scheme": "internal",
				"EnablePrefixForIpv6SourceNat": "off",
				"Tags": [],
				"Name": {
					"Ref": "ApplicationLoadBalancerName"
				}
			}
		},
		"ListenerALinkServerALB8001": {
			"UpdateReplacePolicy": "Retain",
			"DependsOn": "LoadBalancerALinkServerALB",
			"Type": "AWS::ElasticLoadBalancingV2::Listener",
			"DeletionPolicy": "Delete",
			"Properties": {
				"Protocol": "HTTP",
				"LoadBalancerArn": {
					"Ref": "LoadBalancerALinkServerALB"
				},
				"DefaultActions": [
					{
						"Order": 1,
						"TargetGroupArn": {
							"Ref": "TargetGroupALinkServeradmin8001"
						},
						"Type": "forward"
					}
				],
				"Port": 8001
			}
		}
	}
}