Skip to content
This repository has been archived by the owner on Nov 27, 2023. It is now read-only.

Commit

Permalink
ECS: supporting x-aws-assign_public_ip
Browse files Browse the repository at this point in the history
Allowing users to choose whether their instances should get a public IP address or not.
Defaulting to "no".

Signed-off-by: Nitzan Raz <[email protected]>
  • Loading branch information
BackSlasher committed Jan 10, 2023
1 parent 79770d5 commit 531bf3d
Show file tree
Hide file tree
Showing 6 changed files with 346 additions and 2 deletions.
5 changes: 4 additions & 1 deletion ecs/cloudformation.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,10 @@ func (b *ecsAPIService) createService(project *types.Project, service types.Serv
return err
}

assignPublicIP := ecsapi.AssignPublicIpEnabled
assignPublicIP := "DISABLED"
if assignPublicIPSetting, ok := service.Extensions[extensionAssignPublicIP]; ok && assignPublicIPSetting.(bool) {
assignPublicIP = ecsapi.AssignPublicIpEnabled
}
launchType := ecsapi.LaunchTypeFargate
platformVersion := "1.4.0" // LATEST which is set to 1.3.0 (?) which doesn’t allow efs volumes.
if requireEC2(service) {
Expand Down
11 changes: 11 additions & 0 deletions ecs/cloudformation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,17 @@ func TestSimpleConvert(t *testing.T) {
golden.Assert(t, result, expected)
}

func TestSlightlyComplexConvert(t *testing.T) {
bytes, err := ioutil.ReadFile("testdata/input/slightly-complex-service.yaml")
assert.NilError(t, err)
template := convertYaml(t, string(bytes), nil, useDefaultVPC)
resultAsJSON, err := marshall(template, "yaml")
assert.NilError(t, err)
result := fmt.Sprintf("%s\n", string(resultAsJSON))
expected := "slightly-complex-cloudformation-conversion.golden"
golden.Assert(t, result, expected)
}

func TestLogging(t *testing.T) {
template := convertYaml(t, `
services:
Expand Down
9 changes: 9 additions & 0 deletions ecs/testdata/input/slightly-complex-service.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
services:
entrance:
image: nginx
ports:
- "80:80"
x-aws-assign_public_ip: true

sensitive:
image: python
2 changes: 1 addition & 1 deletion ecs/testdata/simple-cloudformation-conversion.golden
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ Resources:
Ref: SimpleTCP80TargetGroup
NetworkConfiguration:
AwsvpcConfiguration:
AssignPublicIp: ENABLED
AssignPublicIp: DISABLED
SecurityGroups:
- Ref: DefaultNetwork
Subnets:
Expand Down
320 changes: 320 additions & 0 deletions ecs/testdata/slightly-complex-cloudformation-conversion.golden
Original file line number Diff line number Diff line change
@@ -0,0 +1,320 @@
AWSTemplateFormatVersion: 2010-09-09
Resources:
CloudMap:
Properties:
Description: Service Map for Docker Compose project TestSlightlyComplexConvert
Name: TestSlightlyComplexConvert.local
Vpc: vpc-123
Type: AWS::ServiceDiscovery::PrivateDnsNamespace
Cluster:
Properties:
ClusterName: TestSlightlyComplexConvert
Tags:
- Key: com.docker.compose.project
Value: TestSlightlyComplexConvert
Type: AWS::ECS::Cluster
Default80Ingress:
Properties:
CidrIp: 0.0.0.0/0
Description: entrance:80/tcp on default network
FromPort: 80
GroupId:
Ref: DefaultNetwork
IpProtocol: TCP
ToPort: 80
Type: AWS::EC2::SecurityGroupIngress
DefaultNetwork:
Properties:
GroupDescription: TestSlightlyComplexConvert Security Group for default network
Tags:
- Key: com.docker.compose.project
Value: TestSlightlyComplexConvert
- Key: com.docker.compose.network
Value: TestSlightlyComplexConvert_default
VpcId: vpc-123
Type: AWS::EC2::SecurityGroup
DefaultNetworkIngress:
Properties:
Description: Allow communication within network default
GroupId:
Ref: DefaultNetwork
IpProtocol: "-1"
SourceSecurityGroupId:
Ref: DefaultNetwork
Type: AWS::EC2::SecurityGroupIngress
EntranceService:
DependsOn:
- EntranceTCP80Listener
Properties:
Cluster:
Fn::GetAtt:
- Cluster
- Arn
DeploymentConfiguration:
MaximumPercent: 200
MinimumHealthyPercent: 100
DeploymentController:
Type: ECS
DesiredCount: 1
LaunchType: FARGATE
LoadBalancers:
- ContainerName: entrance
ContainerPort: 80
TargetGroupArn:
Ref: EntranceTCP80TargetGroup
NetworkConfiguration:
AwsvpcConfiguration:
AssignPublicIp: ENABLED
SecurityGroups:
- Ref: DefaultNetwork
Subnets:
- subnet1
- subnet2
PlatformVersion: 1.4.0
PropagateTags: SERVICE
SchedulingStrategy: REPLICA
ServiceRegistries:
- RegistryArn:
Fn::GetAtt:
- EntranceServiceDiscoveryEntry
- Arn
Tags:
- Key: com.docker.compose.project
Value: TestSlightlyComplexConvert
- Key: com.docker.compose.service
Value: entrance
TaskDefinition:
Ref: EntranceTaskDefinition
Type: AWS::ECS::Service
EntranceServiceDiscoveryEntry:
Properties:
Description: '"entrance" service discovery entry in Cloud Map'
DnsConfig:
DnsRecords:
- TTL: 60
Type: A
RoutingPolicy: MULTIVALUE
HealthCheckCustomConfig:
FailureThreshold: 1
Name: entrance
NamespaceId:
Ref: CloudMap
Type: AWS::ServiceDiscovery::Service
EntranceTCP80Listener:
Properties:
DefaultActions:
- ForwardConfig:
TargetGroups:
- TargetGroupArn:
Ref: EntranceTCP80TargetGroup
Type: forward
LoadBalancerArn:
Ref: LoadBalancer
Port: 80
Protocol: HTTP
Type: AWS::ElasticLoadBalancingV2::Listener
EntranceTCP80TargetGroup:
Properties:
Port: 80
Protocol: HTTP
Tags:
- Key: com.docker.compose.project
Value: TestSlightlyComplexConvert
TargetType: ip
VpcId: vpc-123
Type: AWS::ElasticLoadBalancingV2::TargetGroup
EntranceTaskDefinition:
Properties:
ContainerDefinitions:
- Command:
- .compute.internal
- TestSlightlyComplexConvert.local
Essential: false
Image: docker/ecs-searchdomain-sidecar:1.0
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-group:
Ref: LogGroup
awslogs-region:
Ref: AWS::Region
awslogs-stream-prefix: TestSlightlyComplexConvert
Name: Entrance_ResolvConf_InitContainer
- DependsOn:
- Condition: SUCCESS
ContainerName: Entrance_ResolvConf_InitContainer
Essential: true
Image: nginx
LinuxParameters: {}
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-group:
Ref: LogGroup
awslogs-region:
Ref: AWS::Region
awslogs-stream-prefix: TestSlightlyComplexConvert
Name: entrance
PortMappings:
- ContainerPort: 80
HostPort: 80
Protocol: tcp
Cpu: "256"
ExecutionRoleArn:
Ref: EntranceTaskExecutionRole
Family: TestSlightlyComplexConvert-entrance
Memory: "512"
NetworkMode: awsvpc
RequiresCompatibilities:
- FARGATE
Type: AWS::ECS::TaskDefinition
EntranceTaskExecutionRole:
Properties:
AssumeRolePolicyDocument:
Statement:
- Action:
- sts:AssumeRole
Condition: {}
Effect: Allow
Principal:
Service: ecs-tasks.amazonaws.com
Version: 2012-10-17
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
- arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
Tags:
- Key: com.docker.compose.project
Value: TestSlightlyComplexConvert
- Key: com.docker.compose.service
Value: entrance
Type: AWS::IAM::Role
LoadBalancer:
Properties:
Scheme: internet-facing
SecurityGroups:
- Ref: DefaultNetwork
Subnets:
- subnet1
- subnet2
Tags:
- Key: com.docker.compose.project
Value: TestSlightlyComplexConvert
Type: application
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
LogGroup:
Properties:
LogGroupName: /docker-compose/TestSlightlyComplexConvert
Type: AWS::Logs::LogGroup
SensitiveService:
Properties:
Cluster:
Fn::GetAtt:
- Cluster
- Arn
DeploymentConfiguration:
MaximumPercent: 200
MinimumHealthyPercent: 100
DeploymentController:
Type: ECS
DesiredCount: 1
LaunchType: FARGATE
NetworkConfiguration:
AwsvpcConfiguration:
AssignPublicIp: DISABLED
SecurityGroups:
- Ref: DefaultNetwork
Subnets:
- subnet1
- subnet2
PlatformVersion: 1.4.0
PropagateTags: SERVICE
SchedulingStrategy: REPLICA
ServiceRegistries:
- RegistryArn:
Fn::GetAtt:
- SensitiveServiceDiscoveryEntry
- Arn
Tags:
- Key: com.docker.compose.project
Value: TestSlightlyComplexConvert
- Key: com.docker.compose.service
Value: sensitive
TaskDefinition:
Ref: SensitiveTaskDefinition
Type: AWS::ECS::Service
SensitiveServiceDiscoveryEntry:
Properties:
Description: '"sensitive" service discovery entry in Cloud Map'
DnsConfig:
DnsRecords:
- TTL: 60
Type: A
RoutingPolicy: MULTIVALUE
HealthCheckCustomConfig:
FailureThreshold: 1
Name: sensitive
NamespaceId:
Ref: CloudMap
Type: AWS::ServiceDiscovery::Service
SensitiveTaskDefinition:
Properties:
ContainerDefinitions:
- Command:
- .compute.internal
- TestSlightlyComplexConvert.local
Essential: false
Image: docker/ecs-searchdomain-sidecar:1.0
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-group:
Ref: LogGroup
awslogs-region:
Ref: AWS::Region
awslogs-stream-prefix: TestSlightlyComplexConvert
Name: Sensitive_ResolvConf_InitContainer
- DependsOn:
- Condition: SUCCESS
ContainerName: Sensitive_ResolvConf_InitContainer
Essential: true
Image: python
LinuxParameters: {}
LogConfiguration:
LogDriver: awslogs
Options:
awslogs-group:
Ref: LogGroup
awslogs-region:
Ref: AWS::Region
awslogs-stream-prefix: TestSlightlyComplexConvert
Name: sensitive
Cpu: "256"
ExecutionRoleArn:
Ref: SensitiveTaskExecutionRole
Family: TestSlightlyComplexConvert-sensitive
Memory: "512"
NetworkMode: awsvpc
RequiresCompatibilities:
- FARGATE
Type: AWS::ECS::TaskDefinition
SensitiveTaskExecutionRole:
Properties:
AssumeRolePolicyDocument:
Statement:
- Action:
- sts:AssumeRole
Condition: {}
Effect: Allow
Principal:
Service: ecs-tasks.amazonaws.com
Version: 2012-10-17
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
- arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly
Tags:
- Key: com.docker.compose.project
Value: TestSlightlyComplexConvert
- Key: com.docker.compose.service
Value: sensitive
Type: AWS::IAM::Role

1 change: 1 addition & 0 deletions ecs/x.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,5 @@ const (
extensionManagedPolicies = "x-aws-policies"
extensionAutoScaling = "x-aws-autoscaling"
extensionCloudFormation = "x-aws-cloudformation"
extensionAssignPublicIP = "x-aws-assign_public_ip"
)

0 comments on commit 531bf3d

Please sign in to comment.