본문 바로가기
공부/IaC

[AWS CloudFormation] #5 RDS 생성하기 (for MySQL)

by haejang 2021. 1. 6.
728x90
728x90

 

>>진행한 실습 GitHub

 

기존 ec2 만든 실습에서 연장해서 진행했는데, VPC의 구성을 좀 바꿔야 했다

RDS는 서브넷 그룹을 만들어서 지정해야 하는데, 서브넷 그룹은 2개 이상의 가용영역의 서브넷들이 존재해야 한다

 

바뀐 다이어그램

 

그래서 private subnet을 하나 더 만들어주고, 그에 맞게 parameter도 바꿔주었다

Parameters:
  AZprivate1:
    Description: AvailabilityZone for private
    Type: AWS::EC2::AvailabilityZone::Name
  AZprivate2:
    Description: AvailabilityZone for private
    Type: AWS::EC2::AvailabilityZone::Name
  PrivateSubnet1Cidr:
    Description: Cidr Block for Private Subnet 1
    Type: String
    Default: 10.0.10.0/24
  PrivateSubnet2Cidr:
    Description: Cidr Block for Private Subnet 2
    Type: String
    Default: 10.0.20.0/24
    
Resources:
  PrivateSubnet1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref PrivateSubnet1Cidr
      AvailabilityZone: !Ref AZprivate1
      Tags:
        - Key: Name
          Value: private subnet 1
  PrivateSubnet2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: !Ref PrivateSubnet2Cidr
      AvailabilityZone: !Ref AZprivate2
      Tags:
        - Key: Name
          Value: private subnet 2

 

이제 RDS를 만들어보겠다

 

1. Subnet Group 생성

AWS::RDS::DBSubnetGroup

Resources:
  SubnetGroup:
    Type: AWS::RDS::DBSubnetGroup
    Properties:
      DBSubnetGroupDescription: SubnetGroup for MySQL RDS
      DBSubnetGroupName: mySubnetGroup
      SubnetIds:
        - !Ref PrivateSubnet1
        - !Ref PrivateSubnet2

RDS를 만들기 위해 필요한 서브넷 그룹을 생성해준다

포함된 서브넷들의 가용영역은 2개 이상이어야 하므로 스택을 생성할 때 프라이빗 서브넷들의 가용영역을 다르게 설정해주어야 한다

Description은 필수니까 안쓰면 안된다

 

2. 필요한 Parameter 생성

Parameters:
  DBInstanceID:
    Default: dbinstance
    Description: Database Instance Name
    Type: String
    MinLength: 1
    MaxLength: 64
    AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
    ConstraintDescription: Must begin with a letter, Contain Only alphanumeric
    
  DBName:
    Default: db1
    Description: Database Name
    Type: String
    MinLength: 1
    MaxLength: 64
    AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
    ConstraintDescription: Must begin with a letter, Contain Only alphanumeric
    
  DBInstanceClass:
    Default: db.m5.large
    Description: DB instance class
    Type: String
    AllowedValues:
      - db.m5.large
      - db.m5.xlarge
      - db.m5.2xlarge
      - db.m5.4xlarge
      - db.m5.8xlarge
      
  DBUsername:
    Description: Username for DB Access
    Type: String
    MinLength: 1
    MaxLength: 64
    AllowedPattern: '[a-zA-Z][a-zA-Z0-9]*'
    ConstraintDescription: Must begin with a letter, Contain Only alphanumeric
    
  DBPassword:
    NoEcho: true
    Description: Password for DB Access
    Type: String
    MinLength: 8
    MaxLength: 40
    AllowedPattern: '[a-zA-Z0-9]*'
    ConstraintDescription: Contain Only alphanumeric
    
  DBAllocatedStorage:
    Default: 50
    Description: Size of Database (GiB)
    Type: Number
    MinValue: 5
    MaxValue: 1024
    ConstraintDescription: between 20 and 65536 GiB

DB 인스턴스 ID, Database 이름, 인스턴스 클래스, UserName, Password, 스토리지 크기를 파라미터로 설정해줬다

Min/Max Length/Value, AllowedPattern는 파라미터를 설정할 때의 조건들이다

인스턴스ID, DB이름, User이름은 알파벳으로 시작하면서 알파벳과 숫자만을 사용할 수 있게 했고, Password는 그냥 알파벳과 숫자만 사용하도록 설정했다

스택 생성하면서 파라미터 입력할 때, 이 조건에 걸리면 ConstrainDescription의 문구가 뜨면서 RollBack된다

그리고 Password엔 NoEcho : true란 속성이 있는데, 이는 파라미터를 입력하고 확인할 때 *로 마스킹되어 나타나도록 한다

인스턴스 클래스는 MySQL용 클래스들 중 5가지만 적어놨는데, MySQL로 할게 아니거나 다른 클래스를 쓰고 싶으면 AllowdValue를 없애고 직접 입력하도록 하자

 

3. RDS 생성

AWS::RDS::DBInstance

Resources:
  RDS:
    Type: AWS::RDS::DBInstance
    Properties:
      DBInstanceIdentifier: !Ref DBInstanceID
      DBName: !Ref DBName
      DBInstanceClass: !Ref DBInstanceClass
      Engine: MySQL
      EngineVersion: 8.0.20
      MasterUsername: !Ref DBUsername
      MasterUserPassword: !Ref DBPassword
      AllocatedStorage: !Ref DBAllocatedStorage
      DBSubnetGroupName: !Ref SubnetGroup
      VPCSecurityGroups:
        - !Ref SGforDB

서브넷그룹과 파라미터들을 미리 다 만들어놨으므로 편하게 참조만 해주면 된다

Engine과 EngineVersion은 그냥 고정시켜버렸는데, 이것도 파라미터로 쓰고싶은 사람은 알아서 수정해보도록 하자

보안그룹도 VPC 만들 때 만든 DB용 보안그룹을 연결시켜줬다 (Web서버용 보안그룹의 트래픽만 허용)

 

4. 생성 후 확인

ec2rds.yaml
0.01MB

 

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

 

 

비번만 *로 마스킹된걸 확인할 수 있다

아무튼 모두 다 제약조건에 맞게 설정해준 후, 생성을 완료한다

RDS 인스턴스가 생성되는게 오래걸려서 좀 기다려야 한다

 

생성되면 서비스 > RDS > 데이터베이스 로 들어가 생성된 dbinstance를 눌러보자

 

 

원하는대로 잘 생성되었다

 

Web Server EC2에서 접속을 해보자

mysql -h [생성된 RDS 엔드포인트] -u [설정한 UserName] -p

 

 

접속도 잘 되고, db1이란 데이터베이스도 잘 만들어져있다

 

/var/www/html/ 에서 index.html을 만들면 웹 브라우저에도 잘 나타난다

cd /var/www/html/
echo "Hello" > index.html

 

 

DB Table들을 생성하고 html, php 파일을 만들어 연동하는건 알아서 하자

 

728x90
728x90

댓글