Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

JINIers

동적 사이트 구축.yaml 본문

AWS/이것저것

동적 사이트 구축.yaml

JINIers 2024. 3. 14. 10:15

※ 참고 : aws 패턴별 구축/운용 가이드를 이용하여 작성하였음

(24.03.14 기준)

 

책에선 ui를 이용해서 만들라고 지시되어 있는데 

나는 한꺼번에 만들었다 지웠다 하고싶어서 cloudformation을 이용해서 만들기로 했다.

그러려면 yaml파일을 생성해야함

그래서 코드를 짰다.

 


만들어야 할 것

  • 1 VPC
  • 4 subnet(az-a, az-c / public, private)
  • 1 igw
  • 1 routingtable
  • 2 Security group(WEB, DB)
  • ec2
  • 1 RDS
  • 1 RDS subnet group

# 동적 사이트 구축

# 동적 사이트 구축.yaml

AWSTemplateFormatVersion: "2010-09-09"
Description: "Create WordPress 1 VPC, 4 subnet(az-a, az-c / public, private), 1 igw, 1 routingtable, 2 Security group(WEB, DB), 2 ec2, 1 rds, 1 rds subnet group "
# wordpress 가동시키는 ec2 생성, wordpress가 사용할 mysql은 rds 인스턴스로 생성

Parameters:
  AMI:
    Type: AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>
    Description: 'The ID of the AMI.'
    Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64

Resources:
# Create VPC
  vpcWordPress:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.1.0.0/16
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
      InstanceTenancy: default
      Tags:
        - Key: Name
          Value: "vpcWordPress"

# Create Subnet
  WPPublicSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: vpcWordPress
      CidrBlock: 10.1.11.0/24
      AvailabilityZone: "ap-northeast-2a"
      MapPublicIpOnLaunch: "true"
      Tags:
      - Key: Name
        Value: "WP Public Subnet AZ1"
  WPPrivateSubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: vpcWordPress
      CidrBlock: 10.1.15.0/24
      AvailabilityZone: "ap-northeast-2a"
      Tags:
      - Key: Name
        Value: "WP Private Subnet AZ1"
  WPPublicSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: vpcWordPress
      CidrBlock: 10.1.51.0/24
      AvailabilityZone: "ap-northeast-2c"
      MapPublicIpOnLaunch: "true"
      Tags:
      - Key: Name
        Value: "WP Public Subnet AZ3"
  WPPrivateSubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: vpcWordPress
      CidrBlock: 10.1.55.0/24
      AvailabilityZone: "ap-northeast-2c"
      Tags:
      - Key: Name
        Value: "WP Private Subnet AZ3"

# Create Public Route Table
  WPPublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId:
        Ref: vpcWordPress
      Tags:
        - Key: Name
          Value: "WP-PublicRouteTable"
  WPPublicSubnetARouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    DependsOn: 
      - "WPPublicRouteTable"
      - "WPPublicSubnetA"
    Properties:
      RouteTableId: 
        Ref: WPPublicRouteTable
      SubnetId:
        Ref: WPPublicSubnetA
  WPPublicSubnetCRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    DependsOn: 
      - "WPPublicRouteTable"
      - "WPPublicSubnetC"
    Properties:
      RouteTableId: 
        Ref: WPPublicRouteTable
      SubnetId: 
        Ref: WPPublicSubnetC

# Create Internet GateWay
  WPigw:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: "WP-igw"
  vpcWordPressInternetGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    DependsOn:
      - vpcWordPress
      - WPigw
    Properties:
      VpcId: !Ref vpcWordPress
      InternetGatewayId: !Ref WPigw
  vpcWordPressInternetRoute:
    Type: AWS::EC2::Route
    DependsOn: WPigw
    Properties:
       RouteTableId:
         Ref: WPPublicRouteTable
       DestinationCidrBlock: 0.0.0.0/0
       GatewayId:
         Ref: WPigw

# Create Security Group
  WPWebDMZ:
    Type: AWS::EC2::SecurityGroup
    DependsOn: vpcWordPress
    Properties:
      GroupDescription: WordPress Web APP Security Group
      GroupName: "WP-Web-DMZ"
      VpcId: !Ref vpcWordPress
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
      - IpProtocol: icmp
        FromPort: -1
        ToPort: -1
        CidrIp: 0.0.0.0/0
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp: 0.0.0.0/0
  WPDB:
    Type: AWS::EC2::SecurityGroup
    DependsOn:
      - "vpcWordPress"
      - "WPWebDMZ"
    Properties:
      GroupDescription: WordPress mysql Security Group
      GroupName: "WP-DB"
      VpcId: !Ref vpcWordPress
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: 80
        ToPort: 80
        CidrIp: 0.0.0.0/0
      - IpProtocol: icmp
        FromPort: -1
        ToPort: -1
        CidrIp: 0.0.0.0/0
      - IpProtocol: tcp
        FromPort: 22
        ToPort: 22
        CidrIp: 0.0.0.0/0
      - IpProtocol: tcp
        FromPort: 3306
        ToPort: 3306
        SourceSecurityGroupId: !Ref WPWebDMZ

# Create RDS
  wpDBsubnetgroup:
    Type: AWS::RDS::DBSubnetGroup
    DependsOn: 
        - WPPrivateSubnetA
        - WPPrivateSubnetC
    Properties:
      DBSubnetGroupDescription: WordPress DB Subnet
      DBSubnetGroupName: wpDBsubnetgroup
      SubnetIds: [!Ref WPPrivateSubnetA, !Ref WPPrivateSubnetC]
      Tags: 
      - Key: Name
        Value: "wp-dbsubnet"
  wpparatemtergroup:
    Type: AWS::RDS::DBParameterGroup
    Properties:
      DBParameterGroupName: wpparatemtergroup
      Description: wpp aratemter group
      Family: mysql8.0
  wpoptiongroup:
    Type: AWS::RDS::OptionGroup
    Properties:
      EngineName: mysql
      MajorEngineVersion: "8.0"
      OptionGroupDescription: wp option group
      OptionGroupName: wpoptiongroup
  wpmyql:
    Type: AWS::RDS::DBInstance
    DependsOn: 
        - WPDB
        - wpDBsubnetgroup
        - wpoptiongroup
        - wpparatemtergroup
    Properties:
      Engine: MySQL
      LicenseModel: general-public-license
      EngineVersion: 8.0.35
      DBInstanceIdentifier: wp-mysql
      # DBClusterSnapshotIdentifier: 
      MasterUsername: root
      MasterUserPassword: root1234
      DBInstanceClass: db.t2.micro
      AllocatedStorage: 20
      VPCSecurityGroups: 
      - Ref: WPDB
      DBSubnetGroupName: !Ref wpDBsubnetgroup
      Port: 3306
      DBParameterGroupName: wpparatemtergroup
      OptionGroupName: wpoptiongroup
      StorageEncrypted: false
      PubliclyAccessible: false
      BackupRetentionPeriod: 0
      AvailabilityZone: "ap-northeast-2a"
      AutoMinorVersionUpgrade: false  # true
      
      
# instance
  WPwebApp:
    Type: AWS::EC2::Instance
    DependsOn: 
      - WPPublicSubnetA
      - WPWebDMZ
    Properties:
      ImageId: !Ref AMI
      KeyName: "test"
      InstanceType: t2.micro
      NetworkInterfaces:
      - AssociatePublicIpAddress: true
        SubnetId: !Ref WPPublicSubnetA
        DeviceIndex: "0"
        GroupSet:
            - !Ref WPWebDMZ
      Tags:
        - Key: Name
          Value: "WPwebApp"
      # UserData: 
      #   Fn::Base64: !Sub |
      #     #!/bin/bash -xe
      #     sudo yum install php php-gd php-mbstring -y
      #     sudo yum install mysql -y
      #     sudo wget -o ./wordpress-6.4.3-ko_kr.tar.gz  https://ko.wordpress.org/wordpress-6.4.3-ko_KR.tar.gz
      #     sudm rm wordpress-6.4.3-ko_kr.tar.gz
      #     sudo tar xvf wordpress-6.4.3-ko_KR.tar.gz
      #     sudo ln -s ./wordpress /var/www/html
      #     sudo chown -R apache:apache ./wordpress
      #     sudo chkconfig httpd on
      #     sudo service httpd start

 

 


문제점

1. userdata는 어떻게 설정하는걸까ㅜㅜ

 

2. userdata 설정 후 생성하면 설정됐는지 확인은 어떻게 하는지 모르겠다.

 

3. 책에선 database option setting에 'DB parameter group, option group' 값이 default로 되어있다.

→ 절대 default로 설정하면 안됨!!

디폴트로 설정하면 영영 지워지지 않는다..

안지워짐.. 안지워져요..

지워지지 않는다.

 

 

지우려고 하면 아래처럼 에러남

 

 

그래서 yaml 안에 parameter group, option group을 새로 생성하는 코드를 넣었다.

→ 이러면 이제 다른 문제가 생김 ㅜㅜ 

* 디폴트로 하면 cloudformation 삭제 시 에러 없이 삭제됨 / 하지만 디폴트 그룹이 지워지지 지

 

* 참고

# rds 파라미터그룹 삭제

aws rds delete-db-parameter-group --db-parameter-group-name default:mysql-8-0

 

# rds 옵션그룹 삭제

aws rds delete-option-group --option-group-name default:mysql-8-0

 

 

4. cloudformation으로 생성 후 삭제 시 발생하는 문제

  • rds - option group이 삭제되지 않음

이렇게 에러가 남

 

 

옵션그룹에 들어가보면 남아있는 것을 확인할 수 있다.

그 외의 것들은 다 지워짐

 

옵션 그룹을 지우려고 하면 스냅샷 때문에 지울 수 없다는 에러가 생김

 

그럼 스냅샷을 먼저 지워준다.

* cloudformation 삭제 시 스냅샷이 자동으로 생기는 걸 방지하는 게 뭔지 모르겠다.

더 찾아봐야할 듯

삭제 후 option group 삭제

 

  • rds 생성 시 s3에 버킷이 생긴다. 얘는 수동으로 지워줘야함

 

5. rds 생성 시 남는 잔여물이 있음

cloudformation을 이용하면 설치가 깔끔하고 편리하게 지울 수 있으나 rds 생성 시 남는 잔여물(?)이 있음

깔끔하게 지우고 싶은데 잘 안된다.

분명 설정하는 옵션이 더 있을 것 같은데.. 다시 찾아봐야겠다.

 

6. 책에선 wordpress를 설치하라고 했는데 설치가 안됨(나만 그런거일수도..ㅠㅜㅜ)

그래서 nginx로 대체해서 설치했다.

 


주로 아키텍처 구축할 땐 cloudformation을 이용해서 구축하는 경우가 더 많다고 한다.

다른것도 차차 만들어봐야겠당.

 

site-create-template.yaml
0.01MB

Comments