CloudFormation으로 VPC 엔드포인트를 구성해서 Private EC2 Instance에 접속해 보기

CloudFormation으로 VPC 엔드포인트를 구성해서 Private EC2 Instance에 접속하는 방법을 정리해 봤습니다.
2022.07.27

안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는 CloudFormation으로 VPC 엔드포인트를 구성해서 Private EC2 Instance에 접속하는 방법을 정리해 봤습니다.

들어가기에 앞서, 본 블로그 에서는 VPC 엔드포인트의 CloudFormation만 기재하고 있습니다.(VPC 엔드포인트 코드에 맞춰서 VPC, EC2를 별도로 작성해주세요.)

하고 싶은 것

현재 AWS 환경에 Internet Gateway, NAT gateway가 없는 상태에서 Private Subnet에 있는 EC2 Instance에 VPC 엔드포인트를 이용해서 접속을 시도 합니다.

VPC 엔드포인트에 관해서는 아래 링크를 참고해 주세요.

CloudFormation

AWSTemplateFormatVersion: "2010-09-09"
Description: EndPoint

#-------------------------------------------------------------------
#Create Endpoint
#-------------------------------------------------------------------
Resources:
  EndpointSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: EndpointSecurityGroup
      GroupName: EndpointSecurityGroup
      VpcId: { "Fn::ImportValue": !Sub "#VPC 입력" }
      Tags:
        - Key: Name
          Value: EndpointSecurityGroup
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 443
          ToPort: 443
          CidrIp: #VPCCIDR 입력
  EndpointSSM:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      PrivateDnsEnabled: true
      SecurityGroupIds:
        - !Ref EndpointSecurityGroup
      ServiceName: !Sub com.amazonaws.${AWS::Region}.ssm
      SubnetIds:
        - { "Fn::ImportValue": !Sub "# subnet-a 입력" }
        - { "Fn::ImportValue": !Sub "# subnet-c 입력" }
      VpcEndpointType: Interface
      VpcId: { "Fn::ImportValue": !Sub "#VPC 입력" }
  EndpointSSMMessages:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      PrivateDnsEnabled: true
      SecurityGroupIds:
        - !Ref EndpointSecurityGroup
      ServiceName: !Sub com.amazonaws.${AWS::Region}.ssmmessages
      SubnetIds:
        - { "Fn::ImportValue": !Sub "# subnet-a 입력" }
        - { "Fn::ImportValue": !Sub "# subnet-c 입력" }
      VpcEndpointType: Interface
      VpcId: { "Fn::ImportValue": !Sub "#VPC 입력" }
  EndpointEC2Messages:
    Type: AWS::EC2::VPCEndpoint
    Properties:
      PrivateDnsEnabled: true
      SecurityGroupIds:
        - !Ref EndpointSecurityGroup
      ServiceName: !Sub com.amazonaws.${AWS::Region}.ec2messages
      SubnetIds:
        - { "Fn::ImportValue": !Sub "# subnet-a 입력" }
        - { "Fn::ImportValue": !Sub "# subnet-c 입력" }
      VpcEndpointType: Interface
      VpcId: { "Fn::ImportValue": !Sub "#VPC 입력" }

#-------------------------------------------------------------------
#OutPut
#-------------------------------------------------------------------
Outputs:
  SecurityGroup:
    Value: !Ref EndpointSecurityGroup
    Export:
      Name: !Sub "endpoint-sg"
  EndpointSSM:
    Value: !Ref EndpointSSM
    Export:
      Name: !Sub "endpoint-ssm"
  EndpointSSMMessages:
    Value: !Ref EndpointSSMMessages
    Export:
      Name: !Sub "endpoint-ssmmessages"
  EndpointEC2Messages:
    Value: !Ref EndpointEC2Messages
    Export:
      Name: !Sub "endpoint-ec2messages"

엔드포인트용 보안 그룹과 endpoint를 생성합니다.

여기서 보안 그룹은 VPC의 CIDR를 허용합니다,

EC2 Instance에 세션 매니저를 연결하기 위해 아래 3가지 API를 엔드포인트에 추가했습니다.

  • com.amazonaws.ap-northeast-1.ssm
  • com.amazonaws.ap-northeast-1.ssmmessages
  • com.amazonaws.ap-northeast-1.ec2messages

보다 자세한 사항은 아래 링크를 참고해 주세요.

CloudFormation Stack을 생성하고, 엔드포인트를 확인해 보면 문제 없이 생성된 것을 확인할 수 있습니다.

VPC 엔드포인트에 관한 CloudFormation 내용은 아래 링크를 참고해 주세요.

EC2에서 접속 확인

이제 EC2 Instance에 접속을 시도합니다.

먼저 포트 포워드를 통해 접속해 보도록 하겠습니다.

포트 포워드를 하기 전에, 로컬 환경에서 AWS CLI를 설정할 필요가 있습니다.

AWS CLI는 아래 블로그를 참고해 주세요.

aws ssm start-session --target instanceID --document-name AWS-StartPortForwardingSession --parameters "localPortNumber=55678,portNumber=3389"
  • instanceID : 현재 접속하고자 하는 EC2 Instance의 ID를 넣습니다.

명령어를 입력하면 Starting session이라고 표시되는 것을 확인할 수 있습니다.

이제 Parallels Client를 이용해서 접속합니다.

Parallels Client 같은 프로그램을 활용한 접속 방법에 대해서는 아래 블로그를 참고해 주세요.

문제없이 Private Subnet에 있는 EC2 Instance에 접속 되는 것을 확인할 수 있습니다.

그 외 Fleet Manager로 접속하는 방법에 대해서는 아래 블로그를 참고해 주세요.

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

참고