본문 바로가기
공부/IaC

[AWS CloudFormation] #3 웹서버용 EC2 만들기 (SG, EC2, UserData)

by haejang 2021. 1. 5.
728x90
728x90

 

>>진행한 실습 GitHub

 

 

위 그림과 같이 만들어볼건데, RDS는 추후에 하도록 하겠다

오늘은 APM 설치되어있는 EC2 생성까지만

 

기본적인 VPC 설정에 대한 설명은 생략하겠다

전체 코드는 밑에 있으니 설명이 필요한 사람은 이전 글을 보고 오자

 

1. Security Group

AWS::EC2::SecurityGroup

SGforWeb:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: allow 22, 80
    GroupName: webaccess
    SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp: 0.0.0.0/0
    VpcId: !Ref VPC

SGforDB:
  Type: AWS::EC2::SecurityGroup
  Properties:
    GroupDescription: allow webserver
    GroupName: dbaccess
    SecurityGroupIngress:
      - IpProtocol: -1
        SourceSecurityGroupId : !GetAtt SGforWeb.GroupId
    VpcId: !Ref VPC

웹서버용, DB용 2개를 만들었다

규칙 속성 참조 - Ingress, Egress

인바운드(AWS::EC2::SecurityGroupIngress), 아웃바운드(AWS::EC2::SecurityGroupEgress) 규칙을 따로 만들어서 붙일 수도 있다

웹서버용에선 ssh(22)와 http(80)를 허용해줬고, DB용에선 웹서버용SG만 허용해줬다( -1은 모든 프로토콜 지정 )

 

2. 웹서버용 EC2

AWS::EC2::Instance

Parameters:
  KeyName:
    Description: Name of KeyPair
    Type: AWS::EC2::KeyPair::KeyName
  AMI:
    Description: AMI of EC2
    Type: AWS::EC2::Image::Id
    Default: ami-0094965d55b3bb1ff

Resources:
  EC2forWeb:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: !Ref AMI
      KeyName: !Ref KeyName
      AvailabilityZone: !GetAtt PublicSubnet.AvailabilityZone
      InstanceType: t3.micro
      SubnetId: !Ref PublicSubnet
      SecurityGroupIds:
        - !Ref SGforWeb
      UserData:
        Fn::Base64:
          !Join [ "", [
          "#!/bin/bash\n",
          "#Install APM for Web Server\n",
          "yum install -y mariadb* php httpd php-mysql\n",
          "systemctl enable httpd mariadb\n",
          "systemctl start httpd mariadb\n"] ]
      Tags:
        - Key: Name
          Value: Web Server

Key와 는 각자, 리전별로 갖고있는 키를 바로 쓸 수 있도록 Parameter로 설정했다

ami도 리전별로 원하는 os별로 다르기 때문에 파라미터로 넣었지만, 드롭다운 값 목록을 표시하지 않기 때문에 디폴트값을 넣어줬다

내가 넣은 ami는 서울 리전의 Amazon Linux 2 이다

 

 

참고로 보안그룹 아이디는 !Ref SGforWeb 말고 !GetAtt SGforWeb.GroupId 도 가능하다

APM을 설치해놓도록 UserData도 추가해줬다

Fn::Base64는 UserData값을 인코딩해서 EC2 인스턴스에 전달해주는 내장함수이고,

Fn::Join은 리스트의 값들을 단일 문자열로 생성해주는 내장함수이다

네트워크 인터페이스를 붙이고 싶으면 Instance NetworkInterface 속성을 사용하면 된다

 

이제 완성된 파일을 가지고 스택을 생성해보자

 

ec2.yaml
0.00MB

 

스택 생성이 완료되면, EC2가 하나 생성되어 있다

 

 

이녀석의 퍼블릭IP주소 또는 DNS를 복사해서 웹브라우저에 검색해보면

 

 

Apache가 뜬다

 

들어가서 확인도 해보자

 

 

httpd랑 mysql이 잘 돌고 있다

rds 연동까지 하는건 다음에 하도록 하겠다

 

728x90
728x90

댓글