JINIers
동적 사이트 구축.yaml 본문
※ 참고 : 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 삭제 시 스냅샷이 자동으로 생기는 걸 방지하는 게 뭔지 모르겠다.
더 찾아봐야할 듯
- rds 생성 시 s3에 버킷이 생긴다. 얘는 수동으로 지워줘야함
5. rds 생성 시 남는 잔여물이 있음
cloudformation을 이용하면 설치가 깔끔하고 편리하게 지울 수 있으나 rds 생성 시 남는 잔여물(?)이 있음
깔끔하게 지우고 싶은데 잘 안된다.
분명 설정하는 옵션이 더 있을 것 같은데.. 다시 찾아봐야겠다.
6. 책에선 wordpress를 설치하라고 했는데 설치가 안됨(나만 그런거일수도..ㅠㅜㅜ)
그래서 nginx로 대체해서 설치했다.
주로 아키텍처 구축할 땐 cloudformation을 이용해서 구축하는 경우가 더 많다고 한다.
다른것도 차차 만들어봐야겠당.
'AWS > 이것저것' 카테고리의 다른 글
cloudformaiton 이용 네트워크 구성하기(autoscaling 생성) (0) | 2024.03.29 |
---|---|
cloudformaiton 이용 네트워크 구성하기(LB 생성) (0) | 2024.03.29 |
cloudformaiton 이용 네트워크 구성하기(vpc 생성) (0) | 2024.03.29 |
S3 이용 서버리스 구축 (0) | 2024.03.19 |
create vpc.yaml (0) | 2024.03.14 |