ECS "Select a valid deployment group for the service." CodeDeploy
ECS "Select a valid deployment group for the service." CodeDeploy
我是 运行 错误“Select 服务的有效部署组。”当我尝试在我的 ecs 服务上进行 blue/green 部署时。 (https://monosnap.bugsmasher.online/marcoschmiedel/20200716192812untnf_.png)
谁能告诉我什么是“有效部署组”?
这是我的环境作为 yaml 文件....
感谢帮助...
#
#--------------------------------------------------------------------------
# AWS TEMPLATE VERSION
#--------------------------------------------------------------------------
#
# FIRST WE DECLARE THE CLOUDFORMATION TEMPLATE VERSION SO THAT THE COMPILER
# WORK WITH THE CORRECT SYNTAX.
#
AWSTemplateFormatVersion: '2010-09-09'
#
#--------------------------------------------------------------------------
# PARAMETERS
#--------------------------------------------------------------------------
#
# WE SET GLOBAL PARAMETERS FOR BETTER HANDLING OF THE YAML FILE. THESE CAN
# BE EASILY ADJUSTED IF NECESSARY.
#
Parameters:
#
# APPSLUG IS DECLARED AS AN IDENTIFIER FOR THIS CLOUD FORMATION STACK.
# IT IS USED IN MOST OF THE RESOURCES (E.G. TAGS) FOR BETTER
# DIFFERENTIATION.
#
AppSlug:
Type: String
Default: "polaris-1337"
#
# THE WILDCARD SUBDOMAIN * .ITMAXCLOUD.COM WAS MANUALLY DEFINED FOR ALL
# ENVIRONMENTS. THE ASSOCIATED SSL CERTIFICATE MUST BE REFERENCED WITHIN
# THIS CLOUD FORMATION STACK.
#
WildcardDomain:
Type: String
Default: "itmaxcloud.com"
SSLCert:
Type: String
Default: "arn:aws:acm:eu-central-1:643325912344:certificate/b4df1ca3-6a5b-476e-8bd1-cec600ea6dc8"
#
# ????? CODE DEPLOY ARN
#
CodeDeployArn:
Type: String
Default: "arn:aws:iam::643325912344:role/CodeDeploy"
#
#--------------------------------------------------------------------------
# RESOURCES
#--------------------------------------------------------------------------
#
# RESOURCES ARE THE BUILDING BLOCKS THAT MAKE UP THE ENVIRONMENT.
#
Resources:
#------------------------------------------------------------------------
# NETWORK
#------------------------------------------------------------------------
#
# VPC
# A VPC (VIRTUAL PRIVATE CLOUD) IS LIKA A VIRTUAL CONTAINER IN WHICH ALL
# OUR NETWORKS ARE LOCATED.
#
Vpc:
Type: AWS::EC2::VPC
Properties:
CidrBlock: '10.0.0.0/16'
EnableDnsHostnames: "true"
EnableDnsSupport: "true"
InstanceTenancy: "default"
Tags:
- Key: Name
Value: !Sub "${AppSlug}-vpc"
#
# SUBNET
# SUBNETS ARE THE ACTUAL PHYSICAL NETWORKS WITHIN THE VPC. THESE ARE
# LOCATED IN THREE DIFFERENT AVAILABILITY ZONES.
#
SubnetAlpha:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: Vpc
CidrBlock: '10.0.10.0/24'
AvailabilityZone: !Sub "${AWS::Region}a"
Tags:
- Key: Name
Value: !Sub "${AppSlug}-alpha"
SubnetBeta:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: Vpc
CidrBlock: '10.0.20.0/24'
AvailabilityZone: !Sub "${AWS::Region}b"
Tags:
- Key: Name
Value: !Sub "${AppSlug}-beta"
SubnetGamma:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: Vpc
CidrBlock: '10.0.30.0/24'
AvailabilityZone: !Sub "${AWS::Region}c"
Tags:
- Key: Name
Value: !Sub "${AppSlug}-gamma"
#
# INTERNET GATEWAY
# AN INTERNET GATEWAY IS JUST ANOTHER NETWORK IN OUR VPC. IT HAS A SIMILAR
# STATUS LIKE A SUBNET AND OFFERS "THE INTERNET AS A NETWORK".
#
InternetGateway:
Type: AWS::EC2::InternetGateway
InternetGatewayAttachement:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref 'Vpc'
InternetGatewayId: !Ref 'InternetGateway'
#
# ROUTE TABLE
# THE ROUTE TABLE IS THE ORCHESTRATOR IN OUR VPC. IT DECIDES WHO
# COMMUNICATES WITH WHOM.
#
RouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref 'Vpc'
#
# ALL NETWORKS MUST BE ASSOCIATED WITH THE ROUTE TABLE.
#
RouteInternetGateway:
Type: AWS::EC2::Route
DependsOn: InternetGatewayAttachement
Properties:
DestinationCidrBlock: '0.0.0.0/0'
GatewayId: !Ref 'InternetGateway'
RouteTableId: !Ref 'RouteTable'
RouteSubnetAlpha:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref SubnetAlpha
RouteTableId: !Ref RouteTable
RouteSubnetBeta:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref SubnetBeta
RouteTableId: !Ref RouteTable
RouteSubnetGamma:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref SubnetGamma
RouteTableId: !Ref RouteTable
#------------------------------------------------------------------------
# LOAD BALANCER
#------------------------------------------------------------------------
#
# SECURITY GROUP
# THE LOAD BALANCER GETS A SECURITY GROUP THAT ONLY ALLOWS DESIRED
# PORTS (E.G. 80 OR 443).
#
SecurityGroupPublicLoadBalancer:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub "${AppSlug}-public-loadbalancer-security"
GroupName: !Sub "${AppSlug}-public-loadbalancer-security"
VpcId: !Ref 'Vpc'
SecurityGroupIngress:
- Description: !Sub "${AppSlug}-public-loadbalancer-security-http"
IpProtocol: tcp
CidrIp: 0.0.0.0/0
FromPort: 80
ToPort: 80
- Description: !Sub "${AppSlug}-public-loadbalancer-security-https"
IpProtocol: tcp
CidrIp: 0.0.0.0/0
FromPort: 443
ToPort: 443
Tags:
- Key: Name
Value: !Sub "${AppSlug}-public-loadbalancer-security"
#
# LOAD BALANCER
# A LOAD BALANCER SERVES AS A BASTION BETWEEN THE VPC NETWORK AND THE
# OUTSIDE WORLD. IT CONTROLS THE TRAFFIC OF THE ECS CLUSTER.
#
PublicLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Scheme: internet-facing
LoadBalancerAttributes:
- Key: idle_timeout.timeout_seconds
Value: '30'
Subnets:
- !Ref SubnetAlpha
- !Ref SubnetBeta
- !Ref SubnetGamma
SecurityGroups: [!Ref 'SecurityGroupPublicLoadBalancer']
Tags:
- Key: Name
Value: !Sub "${AppSlug}-public-loadbalancer"
#
# LOAD BALANCER LISTENER
# A LOAD BALANCER CAN REGISTER ONE LISTENER PER PORT. THIS LISTENER
# CAN BE EQUIPPED WITH VARIOUS RULES THEN. (IN OUR CASE WE EQUIP
# THE STANDARD PATH FROM PORT 80 WITH A REDIRECT TO 443. THE STANDARD
# PATH OF PORT 443 RETURNS THE HTTP ERROR 400.)
#
HttpListenerPublicLoadBalancer:
Type: "AWS::ElasticLoadBalancingV2::Listener"
Properties:
DefaultActions:
- Type: "redirect"
RedirectConfig:
Protocol: "HTTPS"
Port: "443"
Host: "#{host}"
Path: "/#{path}"
Query: "#{query}"
StatusCode: "HTTP_301"
LoadBalancerArn: !Ref PublicLoadBalancer
Port: 80
Protocol: "HTTP"
HttpsListenerPublicLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: fixed-response
FixedResponseConfig:
StatusCode: 400
LoadBalancerArn: !Ref PublicLoadBalancer
Port: '443'
Protocol: HTTPS
Certificates:
- CertificateArn: !Sub "${SSLCert}"
#------------------------------------------------------------------------
# ECS
#------------------------------------------------------------------------
#
# ECS CLUSTER
# THE ECS CLUSTER MANAGES THE PROVISION OF VARIOUS SERVICES (E.G. DOCKER
# CONTAINERS). WITH FARGATE, THERE IS NO NEED TO MAINTAIN EC2 HARDWARE
# ANY LONGER.
#
EcsCluster:
Type: AWS::ECS::Cluster
Properties:
Tags:
- Key: Name
Value: !Sub "${AppSlug}-ecs"
#------------------------------------------------------------------------
# CodeDeploy
#------------------------------------------------------------------------
#
# ?
#
CodeDeploy:
Type: AWS::CodeDeploy::Application
Properties:
ApplicationName: !Sub "${AppSlug}-code-deploy"
ComputePlatform: Lambda
CodeDeployDeploymentGroup:
Type: 'AWS::CodeDeploy::DeploymentGroup'
Properties:
ApplicationName: !Ref CodeDeploy
DeploymentConfigName: CodeDeployDefault.LambdaAllAtOnce
DeploymentStyle:
DeploymentType: BLUE_GREEN
DeploymentOption: WITH_TRAFFIC_CONTROL
ServiceRoleArn: !Sub "${CodeDeployArn}"
#------------------------------------------------------------------------
# WEBAPP CONTAINER
#------------------------------------------------------------------------
#
# TASK
# A TASK IS A JOB THAT WE WANT TO RUN. IN THE CASE OF ECS AND FARGATE,
# THIS PART CONSISTS PARAMETERS FOR DOCKER AND THE FARGATE SERVER
# HARDWARE.
#
TaskWebapp:
Type: AWS::ECS::TaskDefinition
Properties:
ContainerDefinitions:
# DOCKER PARAMETERS
- Name: !Sub "${AppSlug}-webapp-container"
Image: "httpd:latest"
PortMappings:
- ContainerPort: 80
Protocol: "tcp"
StartTimeout: 60
# FARGATE PARAMETERS
Cpu: "256"
Memory: "512"
RequiresCompatibilities:
- "FARGATE"
NetworkMode: "awsvpc"
Tags:
- Key: Name
Value: !Sub "${AppSlug}-webapp-task"
#
# SECURITY GROUP
# THE CONTAINER NEEDS A SECURITY GROUP WITH WHICH IT CAN BE REACHED
# FROM THE LOADBALANCER.
#
SecurityGroupWebapp:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub "${AppSlug}-webapp-security"
GroupName: !Sub "${AppSlug}-webapp-security"
SecurityGroupIngress:
- Description: !Sub "${AppSlug}-webapp-security-http"
IpProtocol: tcp
FromPort: 80
ToPort: 80
SourceSecurityGroupId: !Ref SecurityGroupPublicLoadBalancer
VpcId: !Ref Vpc
Tags:
- Key: Name
Value: !Sub "${AppSlug}-webapp-security"
#
# TARGET GROUP
# ?????
#
TargetGroupBlueWebapp:
Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'
Properties:
HealthCheckIntervalSeconds: 5
HealthCheckPath: /
HealthCheckPort: '80'
HealthCheckProtocol: HTTP
HealthCheckTimeoutSeconds: 2
HealthyThresholdCount: 3
Matcher:
HttpCode: '200'
Port: 80
Protocol: HTTP
Tags:
- Key: Name
Value: !Sub "${AppSlug}-webapp-target-blue"
TargetType: ip
UnhealthyThresholdCount: 4
VpcId: !Ref Vpc
TargetGroupGreenWebapp:
Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'
Properties:
HealthCheckIntervalSeconds: 5
HealthCheckPath: /
HealthCheckPort: '80'
HealthCheckProtocol: HTTP
HealthCheckTimeoutSeconds: 2
HealthyThresholdCount: 3
Matcher:
HttpCode: '200'
Port: 80
Protocol: HTTP
Tags:
- Key: Name
Value: !Sub "${AppSlug}-webapp-target-green"
TargetType: ip
UnhealthyThresholdCount: 4
VpcId: !Ref Vpc
# Regelwerk für listener
ListenerRuleWebapp:
Type: AWS::ElasticLoadBalancingV2::ListenerRule
Properties:
Actions:
- Type: forward
ForwardConfig:
TargetGroups:
- TargetGroupArn: !Ref TargetGroupBlueWebapp
Weight: 1
- TargetGroupArn: !Ref TargetGroupGreenWebapp
Weight: 2
Conditions:
- Field: host-header
HostHeaderConfig:
Values:
- !Sub "webapp.${WildcardDomain}"
ListenerArn: !Ref HttpsListenerPublicLoadBalancer
Priority: 1
#
# ECS SERVICE
# ?????
#
ServiceWebapp:
DependsOn: HttpsListenerPublicLoadBalancer
Type: AWS::ECS::Service
Properties:
Cluster: !Ref EcsCluster
DeploymentController:
Type: "CODE_DEPLOY"
DesiredCount: 2
LaunchType: "FARGATE"
LoadBalancers:
- ContainerName: !Sub "${AppSlug}-webapp-container"
ContainerPort: 80
TargetGroupArn: !Ref TargetGroupBlueWebapp
- ContainerName: !Sub "${AppSlug}-webapp-container"
ContainerPort: 80
TargetGroupArn: !Ref TargetGroupGreenWebapp
NetworkConfiguration:
AwsvpcConfiguration:
AssignPublicIp: "ENABLED"
SecurityGroups:
- !Ref SecurityGroupWebapp
Subnets:
- !Ref SubnetAlpha
- !Ref SubnetBeta
- !Ref SubnetGamma
# PropagateTags: "TASK_DEFINITION"
SchedulingStrategy: "REPLICA"
TaskDefinition: !Ref TaskWebapp
# DNS ?
myDNSOne:
Type: AWS::Route53::RecordSetGroup
Properties:
HostedZoneName: itmaxcloud.com.
Comment: some comments maybe?.
RecordSets:
- Name: webapp.itmaxcloud.com.
Type: CNAME
TTL: '900'
SetIdentifier: Some Identifiery here
Weight: '1'
ResourceRecords:
- !GetAtt PublicLoadBalancer.DNSName
您正在使用 ECS,但您的 CodeDeploy 应用程序设置为 Lambda
。应该设置为ECS:
CodeDeploy:
Type: AWS::CodeDeploy::Application
Properties:
ApplicationName: !Sub "${AppSlug}-code-deploy"
ComputePlatform: ECS # <-- NOT Lambda
可能还有更多问题,但不正确的 ComputePlatform
是最明显的一个。
我是 运行 错误“Select 服务的有效部署组。”当我尝试在我的 ecs 服务上进行 blue/green 部署时。 (https://monosnap.bugsmasher.online/marcoschmiedel/20200716192812untnf_.png)
谁能告诉我什么是“有效部署组”?
这是我的环境作为 yaml 文件....
感谢帮助...
#
#--------------------------------------------------------------------------
# AWS TEMPLATE VERSION
#--------------------------------------------------------------------------
#
# FIRST WE DECLARE THE CLOUDFORMATION TEMPLATE VERSION SO THAT THE COMPILER
# WORK WITH THE CORRECT SYNTAX.
#
AWSTemplateFormatVersion: '2010-09-09'
#
#--------------------------------------------------------------------------
# PARAMETERS
#--------------------------------------------------------------------------
#
# WE SET GLOBAL PARAMETERS FOR BETTER HANDLING OF THE YAML FILE. THESE CAN
# BE EASILY ADJUSTED IF NECESSARY.
#
Parameters:
#
# APPSLUG IS DECLARED AS AN IDENTIFIER FOR THIS CLOUD FORMATION STACK.
# IT IS USED IN MOST OF THE RESOURCES (E.G. TAGS) FOR BETTER
# DIFFERENTIATION.
#
AppSlug:
Type: String
Default: "polaris-1337"
#
# THE WILDCARD SUBDOMAIN * .ITMAXCLOUD.COM WAS MANUALLY DEFINED FOR ALL
# ENVIRONMENTS. THE ASSOCIATED SSL CERTIFICATE MUST BE REFERENCED WITHIN
# THIS CLOUD FORMATION STACK.
#
WildcardDomain:
Type: String
Default: "itmaxcloud.com"
SSLCert:
Type: String
Default: "arn:aws:acm:eu-central-1:643325912344:certificate/b4df1ca3-6a5b-476e-8bd1-cec600ea6dc8"
#
# ????? CODE DEPLOY ARN
#
CodeDeployArn:
Type: String
Default: "arn:aws:iam::643325912344:role/CodeDeploy"
#
#--------------------------------------------------------------------------
# RESOURCES
#--------------------------------------------------------------------------
#
# RESOURCES ARE THE BUILDING BLOCKS THAT MAKE UP THE ENVIRONMENT.
#
Resources:
#------------------------------------------------------------------------
# NETWORK
#------------------------------------------------------------------------
#
# VPC
# A VPC (VIRTUAL PRIVATE CLOUD) IS LIKA A VIRTUAL CONTAINER IN WHICH ALL
# OUR NETWORKS ARE LOCATED.
#
Vpc:
Type: AWS::EC2::VPC
Properties:
CidrBlock: '10.0.0.0/16'
EnableDnsHostnames: "true"
EnableDnsSupport: "true"
InstanceTenancy: "default"
Tags:
- Key: Name
Value: !Sub "${AppSlug}-vpc"
#
# SUBNET
# SUBNETS ARE THE ACTUAL PHYSICAL NETWORKS WITHIN THE VPC. THESE ARE
# LOCATED IN THREE DIFFERENT AVAILABILITY ZONES.
#
SubnetAlpha:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: Vpc
CidrBlock: '10.0.10.0/24'
AvailabilityZone: !Sub "${AWS::Region}a"
Tags:
- Key: Name
Value: !Sub "${AppSlug}-alpha"
SubnetBeta:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: Vpc
CidrBlock: '10.0.20.0/24'
AvailabilityZone: !Sub "${AWS::Region}b"
Tags:
- Key: Name
Value: !Sub "${AppSlug}-beta"
SubnetGamma:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: Vpc
CidrBlock: '10.0.30.0/24'
AvailabilityZone: !Sub "${AWS::Region}c"
Tags:
- Key: Name
Value: !Sub "${AppSlug}-gamma"
#
# INTERNET GATEWAY
# AN INTERNET GATEWAY IS JUST ANOTHER NETWORK IN OUR VPC. IT HAS A SIMILAR
# STATUS LIKE A SUBNET AND OFFERS "THE INTERNET AS A NETWORK".
#
InternetGateway:
Type: AWS::EC2::InternetGateway
InternetGatewayAttachement:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref 'Vpc'
InternetGatewayId: !Ref 'InternetGateway'
#
# ROUTE TABLE
# THE ROUTE TABLE IS THE ORCHESTRATOR IN OUR VPC. IT DECIDES WHO
# COMMUNICATES WITH WHOM.
#
RouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref 'Vpc'
#
# ALL NETWORKS MUST BE ASSOCIATED WITH THE ROUTE TABLE.
#
RouteInternetGateway:
Type: AWS::EC2::Route
DependsOn: InternetGatewayAttachement
Properties:
DestinationCidrBlock: '0.0.0.0/0'
GatewayId: !Ref 'InternetGateway'
RouteTableId: !Ref 'RouteTable'
RouteSubnetAlpha:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref SubnetAlpha
RouteTableId: !Ref RouteTable
RouteSubnetBeta:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref SubnetBeta
RouteTableId: !Ref RouteTable
RouteSubnetGamma:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref SubnetGamma
RouteTableId: !Ref RouteTable
#------------------------------------------------------------------------
# LOAD BALANCER
#------------------------------------------------------------------------
#
# SECURITY GROUP
# THE LOAD BALANCER GETS A SECURITY GROUP THAT ONLY ALLOWS DESIRED
# PORTS (E.G. 80 OR 443).
#
SecurityGroupPublicLoadBalancer:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub "${AppSlug}-public-loadbalancer-security"
GroupName: !Sub "${AppSlug}-public-loadbalancer-security"
VpcId: !Ref 'Vpc'
SecurityGroupIngress:
- Description: !Sub "${AppSlug}-public-loadbalancer-security-http"
IpProtocol: tcp
CidrIp: 0.0.0.0/0
FromPort: 80
ToPort: 80
- Description: !Sub "${AppSlug}-public-loadbalancer-security-https"
IpProtocol: tcp
CidrIp: 0.0.0.0/0
FromPort: 443
ToPort: 443
Tags:
- Key: Name
Value: !Sub "${AppSlug}-public-loadbalancer-security"
#
# LOAD BALANCER
# A LOAD BALANCER SERVES AS A BASTION BETWEEN THE VPC NETWORK AND THE
# OUTSIDE WORLD. IT CONTROLS THE TRAFFIC OF THE ECS CLUSTER.
#
PublicLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Scheme: internet-facing
LoadBalancerAttributes:
- Key: idle_timeout.timeout_seconds
Value: '30'
Subnets:
- !Ref SubnetAlpha
- !Ref SubnetBeta
- !Ref SubnetGamma
SecurityGroups: [!Ref 'SecurityGroupPublicLoadBalancer']
Tags:
- Key: Name
Value: !Sub "${AppSlug}-public-loadbalancer"
#
# LOAD BALANCER LISTENER
# A LOAD BALANCER CAN REGISTER ONE LISTENER PER PORT. THIS LISTENER
# CAN BE EQUIPPED WITH VARIOUS RULES THEN. (IN OUR CASE WE EQUIP
# THE STANDARD PATH FROM PORT 80 WITH A REDIRECT TO 443. THE STANDARD
# PATH OF PORT 443 RETURNS THE HTTP ERROR 400.)
#
HttpListenerPublicLoadBalancer:
Type: "AWS::ElasticLoadBalancingV2::Listener"
Properties:
DefaultActions:
- Type: "redirect"
RedirectConfig:
Protocol: "HTTPS"
Port: "443"
Host: "#{host}"
Path: "/#{path}"
Query: "#{query}"
StatusCode: "HTTP_301"
LoadBalancerArn: !Ref PublicLoadBalancer
Port: 80
Protocol: "HTTP"
HttpsListenerPublicLoadBalancer:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: fixed-response
FixedResponseConfig:
StatusCode: 400
LoadBalancerArn: !Ref PublicLoadBalancer
Port: '443'
Protocol: HTTPS
Certificates:
- CertificateArn: !Sub "${SSLCert}"
#------------------------------------------------------------------------
# ECS
#------------------------------------------------------------------------
#
# ECS CLUSTER
# THE ECS CLUSTER MANAGES THE PROVISION OF VARIOUS SERVICES (E.G. DOCKER
# CONTAINERS). WITH FARGATE, THERE IS NO NEED TO MAINTAIN EC2 HARDWARE
# ANY LONGER.
#
EcsCluster:
Type: AWS::ECS::Cluster
Properties:
Tags:
- Key: Name
Value: !Sub "${AppSlug}-ecs"
#------------------------------------------------------------------------
# CodeDeploy
#------------------------------------------------------------------------
#
# ?
#
CodeDeploy:
Type: AWS::CodeDeploy::Application
Properties:
ApplicationName: !Sub "${AppSlug}-code-deploy"
ComputePlatform: Lambda
CodeDeployDeploymentGroup:
Type: 'AWS::CodeDeploy::DeploymentGroup'
Properties:
ApplicationName: !Ref CodeDeploy
DeploymentConfigName: CodeDeployDefault.LambdaAllAtOnce
DeploymentStyle:
DeploymentType: BLUE_GREEN
DeploymentOption: WITH_TRAFFIC_CONTROL
ServiceRoleArn: !Sub "${CodeDeployArn}"
#------------------------------------------------------------------------
# WEBAPP CONTAINER
#------------------------------------------------------------------------
#
# TASK
# A TASK IS A JOB THAT WE WANT TO RUN. IN THE CASE OF ECS AND FARGATE,
# THIS PART CONSISTS PARAMETERS FOR DOCKER AND THE FARGATE SERVER
# HARDWARE.
#
TaskWebapp:
Type: AWS::ECS::TaskDefinition
Properties:
ContainerDefinitions:
# DOCKER PARAMETERS
- Name: !Sub "${AppSlug}-webapp-container"
Image: "httpd:latest"
PortMappings:
- ContainerPort: 80
Protocol: "tcp"
StartTimeout: 60
# FARGATE PARAMETERS
Cpu: "256"
Memory: "512"
RequiresCompatibilities:
- "FARGATE"
NetworkMode: "awsvpc"
Tags:
- Key: Name
Value: !Sub "${AppSlug}-webapp-task"
#
# SECURITY GROUP
# THE CONTAINER NEEDS A SECURITY GROUP WITH WHICH IT CAN BE REACHED
# FROM THE LOADBALANCER.
#
SecurityGroupWebapp:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Sub "${AppSlug}-webapp-security"
GroupName: !Sub "${AppSlug}-webapp-security"
SecurityGroupIngress:
- Description: !Sub "${AppSlug}-webapp-security-http"
IpProtocol: tcp
FromPort: 80
ToPort: 80
SourceSecurityGroupId: !Ref SecurityGroupPublicLoadBalancer
VpcId: !Ref Vpc
Tags:
- Key: Name
Value: !Sub "${AppSlug}-webapp-security"
#
# TARGET GROUP
# ?????
#
TargetGroupBlueWebapp:
Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'
Properties:
HealthCheckIntervalSeconds: 5
HealthCheckPath: /
HealthCheckPort: '80'
HealthCheckProtocol: HTTP
HealthCheckTimeoutSeconds: 2
HealthyThresholdCount: 3
Matcher:
HttpCode: '200'
Port: 80
Protocol: HTTP
Tags:
- Key: Name
Value: !Sub "${AppSlug}-webapp-target-blue"
TargetType: ip
UnhealthyThresholdCount: 4
VpcId: !Ref Vpc
TargetGroupGreenWebapp:
Type: 'AWS::ElasticLoadBalancingV2::TargetGroup'
Properties:
HealthCheckIntervalSeconds: 5
HealthCheckPath: /
HealthCheckPort: '80'
HealthCheckProtocol: HTTP
HealthCheckTimeoutSeconds: 2
HealthyThresholdCount: 3
Matcher:
HttpCode: '200'
Port: 80
Protocol: HTTP
Tags:
- Key: Name
Value: !Sub "${AppSlug}-webapp-target-green"
TargetType: ip
UnhealthyThresholdCount: 4
VpcId: !Ref Vpc
# Regelwerk für listener
ListenerRuleWebapp:
Type: AWS::ElasticLoadBalancingV2::ListenerRule
Properties:
Actions:
- Type: forward
ForwardConfig:
TargetGroups:
- TargetGroupArn: !Ref TargetGroupBlueWebapp
Weight: 1
- TargetGroupArn: !Ref TargetGroupGreenWebapp
Weight: 2
Conditions:
- Field: host-header
HostHeaderConfig:
Values:
- !Sub "webapp.${WildcardDomain}"
ListenerArn: !Ref HttpsListenerPublicLoadBalancer
Priority: 1
#
# ECS SERVICE
# ?????
#
ServiceWebapp:
DependsOn: HttpsListenerPublicLoadBalancer
Type: AWS::ECS::Service
Properties:
Cluster: !Ref EcsCluster
DeploymentController:
Type: "CODE_DEPLOY"
DesiredCount: 2
LaunchType: "FARGATE"
LoadBalancers:
- ContainerName: !Sub "${AppSlug}-webapp-container"
ContainerPort: 80
TargetGroupArn: !Ref TargetGroupBlueWebapp
- ContainerName: !Sub "${AppSlug}-webapp-container"
ContainerPort: 80
TargetGroupArn: !Ref TargetGroupGreenWebapp
NetworkConfiguration:
AwsvpcConfiguration:
AssignPublicIp: "ENABLED"
SecurityGroups:
- !Ref SecurityGroupWebapp
Subnets:
- !Ref SubnetAlpha
- !Ref SubnetBeta
- !Ref SubnetGamma
# PropagateTags: "TASK_DEFINITION"
SchedulingStrategy: "REPLICA"
TaskDefinition: !Ref TaskWebapp
# DNS ?
myDNSOne:
Type: AWS::Route53::RecordSetGroup
Properties:
HostedZoneName: itmaxcloud.com.
Comment: some comments maybe?.
RecordSets:
- Name: webapp.itmaxcloud.com.
Type: CNAME
TTL: '900'
SetIdentifier: Some Identifiery here
Weight: '1'
ResourceRecords:
- !GetAtt PublicLoadBalancer.DNSName
您正在使用 ECS,但您的 CodeDeploy 应用程序设置为 Lambda
。应该设置为ECS:
CodeDeploy:
Type: AWS::CodeDeploy::Application
Properties:
ApplicationName: !Sub "${AppSlug}-code-deploy"
ComputePlatform: ECS # <-- NOT Lambda
可能还有更多问题,但不正确的 ComputePlatform
是最明显的一个。