CloudFormation으로 VPC 엔드포인트를 구성해서 Private EC2 Instance에 접속해 보기
안녕하세요 클래스메소드 김재욱(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로 접속하는 방법에 대해서는 아래 블로그를 참고해 주세요.
본 블로그 게시글을 읽고 궁금한 사항이 있으신 분들은 [email protected]로 보내주시면 감사하겠습니다.