'Best practice for multiple Container(django,nginx) on Fargate

I have multiple containers/images such as admin(django),nginx(httpserver)

my system is here below.

port80-> nginx -> port8011 -> admin

I want to deploy these on fargate.

However I'm still confused.

Two Image, Two Container,Two task difinition,two loadbalancer it's ok.

However one public IP to only nginx?

How can I connect between container?

Currently my source code is like this below.

I am familiar with docker-compose, but not for aws fargate.

Any help appreciated.

const VPCID='vpc-0867d6797e62XXXXX';
const vpc = ec2.Vpc.fromLookup(this, "VPC", {
  vpcId:VPCID
  //isDefault: true,
});

const cluster = new ecs.Cluster(this, "SampleCluster", {
  vpc:vpc,
  clusterName: "StAdminNginxCluster"
});

const adminRepo = ecr.Repository.fromRepositoryArn(this, 'AdminRepository', 'arn:aws:ecr:ap-northeast-1:678100XXXXXX:repository/st_admin_site');
const nginxRepo = ecr.Repository.fromRepositoryArn(this, 'NginxRepository', 'arn:aws:ecr:ap-northeast-1:678100XXXXXX:repository/st_nginx');

const adminImage = ecs.ContainerImage.fromEcrRepository(adminRepo,"latest");
const nginxImage = ecs.ContainerImage.fromEcrRepository(nginxRepo,"latest");

//make task definition
     const taskDefinitionAdmin = new ecs.FargateTaskDefinition(this, "TaskDefAdmin",{
  memoryLimitMiB: 512,
  cpu: 256,
});
const taskDefinitionNginx = new ecs.FargateTaskDefinition(this, "TaskDefNginx",{
  memoryLimitMiB: 512,
  cpu: 256,
});
const adminContainer = taskDefinitionAdmin.addContainer("AdminContainer", {
  image: adminImage,
});
const nginxContainer = taskDefinitionNginx.addContainer("NginxContainer", {
  image: nginxImage,
});

adminContainer.addPortMappings({
  containerPort: 8011
});
nginxContainer.addPortMappings({
  containerPort: 80
})

const ecsServiceAdmin = new ecs.FargateService(this, "ServiceAdmin", {
  cluster,
  taskDefinition:taskDefinitionAdmin,
  desiredCount: 2
});
const ecsServiceNginx = new ecs.FargateService(this, "ServiceNginx", {
  cluster,
  taskDefinition:taskDefinitionNginx,
  desiredCount: 2
});

const lbAdmin = new elb.ApplicationLoadBalancer(this, "LBAdmin", {
  vpc: cluster.vpc,
  internetFacing: true
});
const listenerAdmin = lbAdmin.addListener("Listener", { port: 8011 });

const targetGroupAdmin = listenerAdmin.addTargets("ECSAdmin", {
  protocol: elb.ApplicationProtocol.HTTP,
  port: 8011,
  targets: [ecsServiceAdmin]
});

const lbNginx = new elb.ApplicationLoadBalancer(this, "LBNginx", {
  vpc: cluster.vpc,
  internetFacing: true
});
const listenerNginx = lbNginx.addListener("Listener", { port: 80 });

const targetGroupNginx = listenerNginx.addTargets("ECS", {
  protocol: elb.ApplicationProtocol.HTTP,
  port: 80,
  targets: [ecsServiceNginx]
});

This docker-compose works.

version: "3.9"
   
services:

  admindjango:
    image: 678100XXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/st_admin_site:latest
    ports:
      - "8011:8011"
    restart: always 

  nginx:
    image: 678100XXXXXX.dkr.ecr.ap-northeast-1.amazonaws.com/st_nginx:latest
    ports:
      - '80:80'
    depends_on:
      - admindjango

Update

I use two container with one task difinition.

I just call addContainer twice fron one taskDifinition.

(For now, ignore loadbalancer)

Also you can access each container by 127.0.0.1:XXX.

It works well for my purpose. thanks to @Mark B

const taskDefinitionAdmin = new ecs.FargateTaskDefinition(this, "TaskDefAdmin",{
  memoryLimitMiB: 512,
  cpu: 256,
});
const adminContainer = taskDefinitionAdmin.addContainer("AdminContainer", {
  image: adminImage,
});
adminContainer.addPortMappings({
  containerPort: 8011,
  hostPort: 8011
});
const nginxContainer = taskDefinitionAdmin.addContainer("NginxContainer", {
  image: nginxImage,
});

nginxContainer.addPortMappings({
  containerPort: 80,
  hostPort: 80
})
const adminSG = new ec2.SecurityGroup(this, 'admin-server-sg', {
  vpc,
  allowAllOutbound: true,
  description: 'security group for a web server',
});

adminSG.addIngressRule(
  ec2.Peer.anyIpv4(),
  ec2.Port.tcp(80),
  'allow SSH access from anywhere',
);

const ecsAdminService = new ecs.FargateService(this, "AdminService", {
  cluster,
  taskDefinition:taskDefinitionAdmin,
  desiredCount: 2,
  vpcSubnets:  {subnetType: ec2.SubnetType.PUBLIC },
  assignPublicIp: true,
  securityGroups:[adminSG]
});


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source