내부 ALB로 https 접속하는 방법을 CloudFormation 코드로 정리
안녕하세요 클래스메소드 김재욱(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로 접속되는 것을 확인할 수 있습니다.
본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 [email protected]로 보내주시면 감사하겠습니다.