ECS+Fargate의 Public IP를 고정 IP로 설정하려면

7081 단어 AWSTerraformtech

하고 싶은 일


Amazon ECS+Fargate 구축, Public IP 주소 할당
인터넷 Gateway로 가는 노선이 있는 Public Subnet에서 이걸 설정하고 있어요.
노는 거라서 퍼블릭으로
(Private 시 AWS 비용이 증가하기 때문)
이 Public IP 주소는 디버깅을 할 때 ECS 작업을 만들 때마다 달라지기 때문에 고정시키고 싶습니다
찾아보니까 두 가지 방법이 있어요.
  • NLB(Network Load Balancer) 사용
  • NLB에 Elastic IP 할당
  • 참고로 현재 Fargate에 Elastic IP를 직접 할당할 수 없습니다(ECS의 시작 유형이 EC2라면 가능)
  • Fargate와 동일한 Subnet에서 NLB
  • 구성
  • NAT Gateway 사용
  • Prevate Subnet에서 Fargate
  • 구성
  • Public Subnet에서 NAT Gateway
  • 제작
  • NAT Gateway에 Elastic IP
  • 할당
  • Public Subnet에서 인터넷 Gateway
  • 만들기
  • FargateNAT Gateway를 통해 인터넷에 연결
  • 이번에 NLB를 사용하는 방법.
    이유는 비용 문제입니다.
  • 높은 NAT Gateway 비용, 높은 처리 데이터(GB) 단위로 요금
  • ECS 작업을 시작할 때pull Docker 이미지가 표시되지만, Private Subnet에 Fargate를 설정하면 NAT를 통해 이미지의pull이 실행되므로 크기에 따라 요금이 부과됩니다(확인되지 않았지만)
  • NAT를 거치지 않는 추가 라우팅 준비 필요
  • NLB 작성


    VPC와 Public Subnet은 Fargate와 같은 것을 사용합니다.

    AWS 콘솔을 사용하여 작성

  • EC2 -> Elastic IP에서 Elastic IP 주소 만들기
  • EC2 -> ターゲットグループ에서 대상 그룹 생성

    Basic configuration


    항목 설정
    값 설정
    시험을 준비하다
    Choose a target type
    IP addresses
    Fargate이므로 IP(인스턴스는 대개 아님)
    Target group name
    대상 그룹 이름
    Protocol
    TCP
    NLB는 L4(TCP 및 UDP) 프로토콜 지원
    Port
    80
    VPC
    Fargate 같은 녀석

    Health checks


    항목 설정
    값 설정
    시험을 준비하다
    Health check protocol
    TCP

    Register targets


    설정 없음
  • EC2 -> ロードバランサー에서 Network Load Balancer 제작

    Basic configuration


    항목 설정
    값 설정
    시험을 준비하다
    Load balancer name
    로드 밸런서의 이름
    Scheme
    Internet-facing
    Public Subnet은 인터넷용(인터넷용), Private Subnet은 인터넷용(내부용)
    IP address type
    IPv4

    Network mapping


    항목 설정
    값 설정
    시험을 준비하다
    VPC
    Fargate 같은 녀석
    Subnet
    Fargate 같은 녀석
    IPv4 settings
    Elastic IP 생성

    Listeners and routing


    항목 설정
    값 설정
    시험을 준비하다
    Protocol
    TCP
    Port
    80
    이번에는 HTTP 프로토콜로 기다리고 있습니다.
    Default action(type)
    Forward to
    지정된 대상 그룹에 요청 라우팅
    Default action
    생성된 대상 그룹
  • Terraform으로 만들다


    Elastic IP


    resource "aws_eip" "this" {
      tags = {
        Name = "sample"
      }
    }
    

    대상 그룹


    resource "aws_lb_target_group" "this" {
      target_type = "ip"
      name        = "sample"
      protocol    = "TCP"
      port        = 80
      vpc_id      = aws_vpc.this.id
    
      health_check {
        protocol = "TCP"
      }
    }
    

    NLB


    resource "aws_lb" "this" {
      load_balancer_type = "network"
      name               = "sample"
      internal           = false
      ip_address_type    = "ipv4"
    
      subnet_mapping {
        subnet_id     = aws_subnet.pub_a.id
        allocation_id = aws_eip.this.id
      }
    }
    

    NLB 청중


    resource "aws_lb_listener" "this" {
      load_balancer_arn = aws_lb.this.id
      protocol          = "TCP"
      port              = "80"
      default_action {
        type             = "forward"
        target_group_arn = aws_lb_target_group.this.arn
      }
    }
    

    ECS 서비스 다시 실행


    AWS 콘솔을 사용하여 작성


    로드 밸런서 이후 추가할 수 없기 때문에 서비스 다시 만들기
    항목 설정
    값 설정
    시험을 준비하다
    부하 평형기의 종류
    Network Load Balancer
    로드 밸런서 이름
    생성된 로드 밸런서
    대상 그룹 이름
    생성된 대상 그룹
    ECS 서비스의 보안 그룹에서 로드 밸런서에 대한 액세스를 허용하기 위해 입국 규칙에 VPC의 IPv4CIDR 블록(예: 10.0.0.0/16)을 추가했습니다.
    Port range 는 Fargate 에서 실행되는 애플리케이션에 따라 적절히 설정됩니다.EC2 -> ターゲットグループ -> Targetsタブ에서 헬스 status가 헬스가 되면 돼요.
    Elastic IP 주소로 의사 소통 가능

    Terraform으로 만들다


    보안 그룹


    입국 규칙에 VPC용 IPv4CIDR 블록 추가
    적절한 포트 설정
    resource "aws_security_group" "this" {
      name   = "sample"
      vpc_id = aws_vpc.this.id
    }
    
    resource "aws_security_group_rule" "nlb" {
      type              = "ingress"
      description       = "NLB"
      from_port         = 8080
      to_port           = 8080
      protocol          = "tcp"
      cidr_blocks       = [aws_vpc.this.cidr_block]
      security_group_id = aws_security_group.this.id
    }
    

    ECS 서비스


    resource "aws_ecs_service" "this" {
      ...
      load_balancer {
        target_group_arn = aws_lb_target_group.this.arn
        container_name   = "sample"
        container_port   = 8080
      }
    }
    

    좋은 웹페이지 즐겨찾기