내부 ALB로 https 접속하는 방법을 CloudFormation 코드로 정리

내부 ALB로 https 접속하는 방법을 CloudFormation 코드로 정리해 봤습니다.
2022.03.19

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 내부 ALB로 https 접속하는 방법을 CloudFormation 코드로 정리해 봤습니다.

사전 준비

본 블로그에서는 EC2 생성까지는 다루지 않기 때문에 별도로 EC2를 준비할 필요가 있습니다.

현재 Public Subnet에 EC2 Windows를 하나 생성했고, Private Subnet에 EC2 Windows를 하나 생성한 상태입니다.

Private Subnet에 있는 EC2 Windows에는 node를 설치해서 움직이고 있는 상태입니다.

EC2 Windows에서 node 설치 방법은 아래 블로그를 참고해 주세요.

추가적으로 Public Subnet EC2 Windows에서 Private Subnet에 있는 EC2 Windows로 접속하는 방법은 아래 블로그를 참고해 주세요.

(node 설치 하기 위해서는 인터넷이 뚫려 있어야 웹사이트로 접속할 수 있기에 일시적으로 NAT Gateway를 생성했습니다. 그리고 node 설치가 끝나고 NAT Gateway는 삭제 한 상태입니다.)

먼저 Private Subnet EC2 Windows의 보안 그룹에서 HTTP포트 Public Subnet EC2 Windows의 보안 그룹을 열어줍니다.

Public Subnet EC2 Windows에서 Private Subnet EC2 Windows 아이피 주소로 접속해 보면 위와 같이 접속이 가능한 상태입니다.

마지막으로 ACM과 Route53를 설정합니다.

CloudFormation 작성

AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  EC2InstanceID:
    Description: "Subnet ID EC2 Instance"
    Type: AWS::EC2::Instance::Id
    Default: "" 
  ALBPrivateSubnetID1:
    Description: "Subnet ID of private-subnet1"
    Type: AWS::EC2::Subnet::Id
    Default: "subnet-" #수정 필요 private subnet
  ALBPrivateSubnetID2:
    Description: "Subnet ID of private-subnet2"
    Type: AWS::EC2::Subnet::Id
    Default: "subnet-" #수정 필요 private subnet
  HostZoneId:
    Description: FQDN of the hosted zone
    Type: AWS::Route53::HostedZone::Id
    Default: ''
  SubDomain:
    Description: FQDN of the certificate
    Type: String
    Default: 'www.test.com'
  LoadBalancerCertificateARN:
    Type: String
    Default: acm-arn #acm arn으로 수정 필요
    Description: Enter certificate ARN; Use ACM to create a certificate before creating this stack

내부 ALB이기 때문에 2개의 Private Subnet을 선택하고 인스턴스는 Private Subnet에 있는 EC2 Windows를 선택합니다.

그리고 Route53의 호스팅 영역 ID를 선택하고, acm의 arn을 넣습니다. 마지막에 SubDomain은 ALB로 접속할 때 사용할 도메인 주소입니다.

Resources:
  ALBSecurityGroup:
    Type: "AWS::EC2::SecurityGroup"
    Properties:
      VpcId: !ImportValue testVPCID
      GroupName: "test-alb-sg"
      GroupDescription: "-"
      Tags:
        - Key: "Name"
          Value: "test-alb-sg"
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: "0.0.0.0/0"

VpcId에는 미리 CloudFormation으로 만들어둔 VPC를 OutPut해서 받아왔지만, 이 부분에 대해서는 각자의 방법으로 진행해도 상관 없습니다.

TargetGroup: 
    Type: "AWS::ElasticLoadBalancingV2::TargetGroup"
    Properties: 
      VpcId: !ImportValue testVPCID
      Name: "test-alb-tg"
      Protocol: HTTP
      Port: 80
      HealthCheckProtocol: HTTP
      HealthCheckPath: "/"
      HealthCheckPort: "traffic-port"
      HealthyThresholdCount: 2
      UnhealthyThresholdCount: 2
      HealthCheckTimeoutSeconds: 5
      HealthCheckIntervalSeconds: 10
      Matcher: 
        HttpCode: 200
      Tags: 
        - Key: Name
          Value: "test-alb-tg"
      TargetGroupAttributes: 
        - Key: "deregistration_delay.timeout_seconds"
          Value: 300
        - Key: "stickiness.enabled"
          Value: false
        - Key: "stickiness.type"
          Value: lb_cookie
        - Key: "stickiness.lb_cookie.duration_seconds"
          Value: 86400
      Targets: 
        - Id: !Ref EC2InstanceID
          Port: 80

타겟 그룹을 생성합니다.

#  internal ALB
  internalALB: 
    Type: "AWS::ElasticLoadBalancingV2::LoadBalancer"
    Properties: 
      Name: "test-alb"
      Tags: 
        - Key: Name
          Value: !Sub "test-alb"
      Scheme: "internal"
      LoadBalancerAttributes: 
        - Key: "deletion_protection.enabled"
          Value: false
        - Key: "idle_timeout.timeout_seconds"
          Value: 60
      SecurityGroups:
        - !Ref ALBSecurityGroup
      Subnets: 
        - Ref: ALBPrivateSubnetID1
        - Ref: ALBPrivateSubnetID2
  ALBListenerHTTPS:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      Port: 443
      Protocol: HTTPS
      Certificates:
        - CertificateArn: !Ref LoadBalancerCertificateARN
      DefaultActions:
        - TargetGroupArn: !Ref TargetGroup
          Type: forward
      LoadBalancerArn: !Ref internalALB
#  Route53
  DnsRecord:
    Type: AWS::Route53::RecordSet
    Properties:
      HostedZoneId: !Sub '${HostZoneId}'
      Comment: "DNS for ALB"
      Name: !Sub '${SubDomain}'
      Type: A
      AliasTarget:
        HostedZoneId: !GetAtt 'internalALB.CanonicalHostedZoneID'
        DNSName: !GetAtt 'internalALB.DNSName'

마지막으로 ALB를 생성하고 Route53에 로드 밸런서로 접속하기 위한 도메인을 생성합니다.

생성 확인

로드 밸런서로 들어가 보면 HTTPS 443으로 설정되어 있고 인증서도 정상적으로 설정되어 있는 것을 확인할 수 있습니다.

타겟 그룹 또 한 EC2가 healthy 상태인 것을 확인할 수 있습니다.

Route53에서 레코드도 정상적으로 설정된 것을 확인할 수 있습니다.

마지막으로 설정한 도메인으로 접속해 보면 https로 접속되는 것을 확인할 수 있습니다.

본 블로그 게시글을 보시고 문의 사항이 있으신 분들은 클래스메소드코리아 (info@classmethod.kr)로 연락 주시면 빠른 시일 내 담당자가 회신 드릴 수 있도록 하겠습니다 !

참고