CloudFormation이란?
AWS CloudFormation은 Amazon Web Services(AWS) 리소스를 모델링하고 설정할 수 있게 해주는 서비스입니다. 이를 통해 개발자와 시스템 관리자는 코드를 통해 인프라를 자동으로 생성하고 관리할 수 있습니다. CloudFormation을 사용하면 서버, 로드 밸런서, 데이터베이스와 같은 필요한 AWS 리소스들을 정의한 템플릿을 작성하고, 이 템플릿을 사용하여 인프라를 안전하고 일관된 방식으로 프로비저닝하고 관리할 수 있습니다.
즉, Infrastructure as Code형태로 관리를 할 수 있으며, 이는 버전 관리, 재사용, 자동화에 유용합니다.
CloudFromation의 장점
- 자동화: 수동 프로비저닝과 구성을 줄여 시간을 절약하고 오류를 최소화합니다.
- 일관성: 동일한 템플릿을 사용하여 여러 환경(개발, 테스트, 프로덕션 등)에서 일관된 인프라를 쉽게 배포할 수 있습니다.
- 종속성 관리: CloudFormation은 리소스 간의 종속성을 자동으로 관리하며, 리소스를 올바른 순서로 생성합니다.
- 롤백 기능: 업데이트 중 오류가 발생하면 이전 상태로 롤백할 수 있어 리소스와 데이터의 안전을 보장합니다.
- 드리프트 감지: 인프라의 현재 상태와 CloudFormation 템플릿이 정의한 상태 사이의 차이(드리프트)를 감지할 수 있습니다.
CloudFormation의 작동 방식
- 템플릿 작성: AWS 리소스와 그 속성을 JSON 또는 YAML 포맷의 템플릿 파일로 정의합니다.
- 스택 생성: 템플릿을 CloudFormation에 업로드하고 스택을 생성하여 정의된 리소스들을 프로비저닝합니다.
- 관리 및 업데이트: 스택을 통해 인프라를 관리하고, 템플릿을 업데이트하여 인프라 변경 사항을 적용합니다.
- 리소스 삭제: 스택 삭제를 통해 정의된 모든 리소스를 자동으로 정리합니다.
구성해볼 아키택쳐 설명

- VPC 안에 2개의 가용영역을 사용해 고가용성을 더욱 높입니다.
- 하나의 가용영역에는 public subnet 1개와 private subnet 2개가 존재합니다.
- public subnet 부분에 존재하는 인터넷단 로드밸런서를 생성해 인터넷 게이트웨이를 통해 외부와 통신 할 수 있게 해줍니다.
- public subnet 2개에는 각각 NatGateway를 만들어 private subnet이 Nat Gateway를 통해 외부와 통신할 수 있게 합니다.
- 처음 Web단의 오토스케일링 그룹을 생성하고 인터넷단 로드밸런서와 연결합니다. 이 Web단 오토스케일링 그룹은 DaynamoDB를 사용합니다.
- APP단과 WEB단을 연결해주는 내부 로드발란서가 존재합니다. 이 로드발란서를 통해 Web단에서 App단으로 트래픽이 보내집니다.
- App단도 오토스케일링 그룹이 존재하고 EFS라는 파일 공유시스템을 가지고 있어 각각 인스턴스에서 파일을 공유할 수 있습니다.
- RDS는 다중영역 배포를 하여 Master와 Stand-By DB를 생성합니다. 이를 통해 Switch over와 Fail over를 할 수 있게합니다.
- 또한 ElastiCache에 인 메모리 DB인 Redis를 사용해 자주 사용하는 데이터는 빠르게 검색할 수 있게합니다.
CloudFormation Yaml 코드
문법 종류

파라미터
Parameters:
InstanceType:
Type: String
Default: t2.micro
Description: EC2 instance type for the Bastion Host and AppServer
KeyName:
Type: AWS::EC2::KeyPair::KeyName
Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
DBInstanceClass:
Type: String
Default: db.t2.small
Description: The database instance type
MasterUsername:
Type: String
Description: The master username for the database instance.
MasterUserPassword:
Type: String
Description: The RDS MasterUserPassword
CacheNodeType:
Type: String
Default: cache.t2.small
Description: The version of the ElastiCache Node
- 값을 정해놓기 애매한 것은 이렇게 Paramemter를 설정할 수 있습니다.
VPC 생성
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.10.0.0/16
EnableDnsHostnames: true
Tags:
- Key: Name
Value: ##VPC 이름
- Properties는 AWS 리소스의 속성을 설정하는 데 사용됩니다.
- 제일 처음은 VPC를 만들어야 합니다. 자원 안에 Type을 AWS::EC2::VPC로 설정하고 CIDR을 설정해줍니다.
- EnableDnsHostnames
- 인스턴스 간에 DNS 호스트 이름을 사용하여 통신해야 할 때
- 외부에서 인스턴스의 퍼블릭 DNS 이름을 통해 접근해야 할 때
Subnet 생성
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.10.0.0/24
AvailabilityZone: "us-east-1a"
MapPublicIpOnLaunch: true
Tags:
- Key: Name
Value: PublicSubnet1
- !Ref는 AWS CloudFormation 템플릿에서 사용되는 인트린직 함수(내부 함수)입니다. 이 함수는 템플릿 내에서 선언된 파라미터의 값을 가져오거나, 다른 리소스에 대한 참조(예: 리소스의 논리적 ID)를 생성하는 데 사용됩니다.
- MapPublicIpOnLaunch
- 속성은 서브넷에 있는 EC2 인스턴스가 시작될 때 자동으로 퍼블릭 IPv4 주소가 할당되도록 지정합니다.
- 이 서브넷 내에서 새로 생성되는 모든 EC2 인스턴스에 자동으로 퍼블릭 IP 주소가 할당됩니다.
- 만약 PrivateSubnet을 설정하고 싶으면 MapPublicIpOnLaunch 이 부분을 빼면 됩니다.
Internet Gateway 생성
IGW:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: MagicMin-igw
Attachigw:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
InternetGatewayId: !Ref IGW
VpcId: !Ref VPC
- AWS::EC2::InternetGateway를 통해 InternetGateway 생성
- Attachigw는 논리적 이름입니다. Java에서 메소드 이름이라고 생각하면 쉽습니다.
- Type: AWS::EC2::InternetGateway 이 부분을 통해 InternetGateway를 VPC에 붙이는 과정이라는 것을 알 수 있습니다.
NAT 생성
EIP1:
Type: AWS::EC2::EIP
NAT1:
Type: AWS::EC2::NatGateway
DependsOn: Attachigw
Properties:
AllocationId: !GetAtt EIP1.AllocationId
SubnetId: !Ref PublicSubnet1
- 탄력적 IP를 생성해 고정 IP를 받습니다.
- DependsOn
- AWS CloudFormation에서 특정 리소스의 생성 순서를 제어하는 데 사용됩니다.
- 일반적으로 CloudFormation은 리소스 간의 종속성을 자동으로 해결합니다.
- 하지만 때때로, 특정 리소스가 다른 리소스가 완전히 생성되고 나서야 생성되어야 할 필요가 있을 때 DependsOn 속성을 사용하여 명시적으로 의존성을 지정할 수 있습니다.
- AllocationId를 통해 EIP를 NAT에 할당합니다.
- SubnetId를 통해 PublicSubnet1에 NAT를 할당합니다.
RouteTable 생성 및 세팅
PublicRT:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- Key: Name
Value: PublicRT
PublicOneRoute:
Type: AWS::EC2::Route
DependsOn: Attachigw
Properties:
RouteTableId: !Ref PublicRT
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref IGW
PublicSubnet1RTAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref PublicRT
SubnetId: !Ref PublicSubnet1
- 위의 아키택처를 보면 만들어야 할 RouteTable이 총 3개 필요합니다.
- Public Subnet1,2에서 IGW로 보내야하는 라우트 테이블과 Private subnet 1,3에서 Public subnet1의 NAT로 보내야하는 Route Table, Private Subnet 2,4에서 Public Subnet2의 NAT로 보내야 하는 Route Table이 필요합니다.
- 위의 코드는 Public Subnet에서 IGW로 보내는 Route Table입니다.
- Type: AWS::EC2::RouteTable를 통해 라우트 테이블을 생성합니다.
- PublicOneRoute
- DependsOn을 통해 Attachigw 생성 이후에 이 스택을 진행하도록 합니다.
- DestinationCidrBlock 설정은 모든 목적지 주소(즉, 인터넷으로 가는 모든 트래픽)에 적용됨을 의미합니다.
- Gateway : 이 라우트가 사용할 게이트웨이의 ID를 참조합니다. 여기서 IGW는 인터넷 게이트웨이의 논리적 이름이며, 이 라우트는 인터넷으로 가는 트래픽을 해당 게이트웨이로 전달하도록 설정됩니다.
- PublicSubnet1RTAssociation
- Type: AWS::EC2::SubnetRouteTableAssociation
- 이 리소스 타입은 서브넷과 라우트 테이블 간의 연결(연관)을 정의합니다.
- Type: AWS::EC2::SubnetRouteTableAssociation
LoadBalancer 생성
MyInternetFacingALB:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Name: MagicMinALB
Scheme: internet-facing
LoadBalancerAttributes:
- Key: idle.timeout.timeout_seconds
Value: '60'
Subnets:
- !Ref PublicSubnet1
- !Ref PublicSubnet2
SecurityGroups:
- !Ref InternetFacingALBSecurityGroup
InternetFacingALBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security Group for ALB
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 443
ToPort: 443
CidrIp: 0.0.0.0/0
InternetFacingALBListener:
Type: AWS::ElasticLoadBalancingV2::Listener
Properties:
DefaultActions:
- Type: forward
TargetGroupArn: !Ref InternetFacingALBTargetGroup
LoadBalancerArn: !Ref MyInternetFacingALB
Port: 80
Protocol: HTTP
InternetFacingALBTargetGroup:
Type: AWS::ElasticLoadBalancingV2::TargetGroup
Properties:
VpcId: !Ref VPC
Port: 80
Protocol: HTTP
HealthCheckProtocol: HTTP
HealthCheckPath: /
Matcher:
HttpCode: '200'
- MyInternetFacingALB
- Type: AWS::ElasticLoadBalancingV2::LoadBalancer (ALB를 생성하기 위한 리소스 타입)
- Scheme
- ALB의 종류를 설정합니다. 위으 코드는 internet-facing를 적어 인터넷에 직접 노출되어 외부 트래픽을 받게 합니다.
- 만약 내부 로드발란서를 새팅하고 싶으면 internal을 적으면 됩니다.
- LoadBalancerAttributes
- 로드 밸런서의 추가 설정을 의미합니다.
- 유휴 연결 타임아웃을 60초로 설정했습니다.
- InternetFacingALBSecurityGroup
- Type: AWS::EC2::SecurityGroup (보안 그룹 세팅)
- SecurityGroupIngress
- 인바운드 규칙을 정의합니다.
- 여기서는 80번 포트(HTTP)와 443번 포트(HTTPS)로 들어오는 모든 트래픽을 허용합니다.

- InternetFacingALBListener
- Type: AWS::ElasticLoadBalancingV2::Listener
- 리스너는 들어오는 트래픽을 어떻게 처리할지 결정합니다.
- DefaultActions
- 들어오는 트래픽에 대한 기본 동작을 설정합니다.
- 여기서는 트래픽을 InternetFacingALBTargetGroup으로 전달합니다.
- LoadBalancerArn
- 리스터가 연결될 로드 밸런서의 ARN을 지정합니다.
- Type: AWS::ElasticLoadBalancingV2::Listener
- InternetFacingALBTargetGroup
- Type: AWS::ElasticLoadBalancingV2::TargetGroup
- 로드 밸런서로부터 트래픽을 받을 대상 그룹을 정의합니다.
- TargetGroup을 만들 때 사용했던 포트, VPC, 프로토콜 버전, 상태 검사를 지정 합니다.
- 지금 위의 코드에는 대상 유형 선택이 없습니다. 그러므로 디폴트 값인 인스턴스로 지정됩니다.
- 만약 다른 값으로 대상을 선택하고 싶으면 TargetType: ip와 같이 추가하면 됩니다.
- Type: AWS::ElasticLoadBalancingV2::TargetGroup
DynamoDB 구성
MyDynamoDBTable:
Type: 'AWS::DynamoDB::Table'
Properties:
TableName: 'MyDynamoDBTable'
AttributeDefinitions:
- AttributeName: 'ID'
AttributeType: 'S'
KeySchema:
- AttributeName: 'ID'
KeyType: 'HASH'
ProvisionedThroughput:
ReadCapacityUnits: '5'
WriteCapacityUnits: '5'
MyDynamoDBAccessRole:
Type: 'AWS::IAM::Role'
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: 'Allow'
Principal:
Service: 'ec2.amazonaws.com'
Action: 'sts:AssumeRole'
Policies:
- PolicyName: 'DynamoDBAccessPolicy'
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: 'Allow'
Action:
- 'dynamodb:GetItem'
- 'dynamodb:PutItem'
- 'dynamodb:UpdateItem'
- 'dynamodb:DeleteItem'
- 'dynamodb:Scan'
- 'dynamodb:Query'
Resource: !GetAtt MyDynamoDBTable.Arn
MyDynamoDBAccessInstanceProfile:
Type: 'AWS::IAM::InstanceProfile'
Properties:
Roles:
- !Ref MyDynamoDBAccessRole
- 위의 아키택쳐에서 Web단 서버는 DynamoDB와 연결되어 있습니다.
- DynamoDB는 VPC안에 있는 기능이 아니기 때무에 IAM으로 권한 설정을 해줘야 합니다.


- MyDynamoDBTable
- Type: AWS::DynamoDB::Table은 Amazon DynamoDB 테이블을 생성합니다.
- AttributeDefinitions: 테이블의 속성 정의를 나열합니다. 여기서는 'ID'라는 속성 이름과 'S'(String 타입)를 사용합니다.
- KeySchema: 테이블의 기본 키 구성을 정의합니다. 'ID' 속성이 HASH 키(기본 키)로 사용됩니다.
- ProvisionedThroughput: 읽기 및 쓰기 용량 단위를 설정합니다. 이 설정은 DynamoDB 테이블의 처리량을 관리합니다.
- MyDynamoDBAccessRole (IAM 역할)
- Type: AWS::IAM::Role은 AWS 리소스에 대한 액세스 권한을 부여하는 IAM 역할을 생성합니다.
- AssumeRolePolicyDocument: 이 역할을 어떤 AWS 서비스(여기서는 EC2)가 사용할 수 있는지 정의합니다.
- Policies: 역할에 연결된 정책들을 나열합니다. 여기서는 'DynamoDBAccessPolicy'라는 정책을 정의하고, 이 정책은 DynamoDB 테이블에 대한 다양한 액션(GetItem, PutItem 등)을 허용합니다.
- Resource: 정책이 적용될 리소스를 지정합니다. 여기서는 !GetAtt MyDynamoDBTable.Arn을 사용하여 이전에 정의한 DynamoDB 테이블의 ARN을 참조합니다.
- MyDynamoDBAccessInstanceProfile (IAM 인스턴스 프로필)
- Type: AWS::IAM::InstanceProfile은 EC2 인스턴스에 IAM 역할을 연결할 수 있게 해주는 인스턴스 프로필을 생성합니다.
- Properties : Roles: 이 인스턴스 프로필에 연결할 IAM 역할들의 리스트입니다. 여기서는 !Ref MyDynamoDBAccessRole을 사용하여 이전에 정의한 IAM 역할을 참조합니다.
AutoScaling Group
MyWebLaunchTemplate:
Type: AWS::EC2::LaunchTemplate
Properties:
LaunchTemplateName: MyWebLaunchTemplate
LaunchTemplateData:
InstanceType: !Ref InstanceType
ImageId: ami-014d544cfef21b42d # EC2 인스턴스에 사용될 AMI의 ID를 지정
KeyName: !Ref KeyName
SecurityGroupIds:
- !Ref EC2SecurityGroup
IamInstanceProfile:
Arn: !GetAtt MyDynamoDBAccessInstanceProfile.Arn
TagSpecifications: # EC2 인스턴스에 할당될 태그를 지정
- ResourceType: instance
Tags:
- Key: Name
Value: MinEC2Web
UserData: # EC2 인스턴스가 시작될 때 실행될 사용자 데이터를 지정
Fn::Base64: | # base64로 인코딩된 스크립트를 포함
#!/bin/bash
yum update -y
yum install -y httpd php
systemctl start httpd
systemctl enable httpd
usermod -a -G apache ec2-user
chown -R ec2-user:apache /var/www
chmod 2775 /var/www
find /var/www -type d -exec chmod 2775 {} \;
find /var/www -type f -exec chmod 0664 {} \;
# PHP script to display Instance ID and Availability Zone
cat << 'EOF' > /var/www/html/index.php
<!DOCTYPE html>
<html>
<body>
<center>
<?php
# Get the instance ID from meta-data and store it in the $instance_id variable
$url = "http://169.254.169.254/latest/meta-data/instance-id";
$instance_id = file_get_contents($url);
# Get the instance's availability zone from metadata and store it in the $zone variable
$url = "http://169.254.169.254/latest/meta-data/placement/availability-zone";
$zone = file_get_contents($url);
?>
<h2>EC2 Instance ID: <?php echo $instance_id ?></h2>
<h2>Availability Zone: <?php echo $zone ?></h2>
</center>
</body>
</html>
EOF
- MyWebLaunchTemplate (런치 템플릿)
- Type: AWS::EC2::LaunchTemplate은 EC2 인스턴스를 생성할 때 사용할 수 있는 설정의 모음입니다.
- LaunchTemplateName: 런치 템플릿의 이름입니다.
- LaunchTemplateData: 인스턴스 생성에 사용될 구성 정보입니다.
- InstanceType: 인스턴스의 유형입니다. 파라미터로 받아옵니다.
- ImageId: 인스턴스에 사용될 AMI(Amazon Machine Image)의 ID입니다.
- KeyName: 인스턴스에 접근하기 위한 키 페어의 이름입니다.
- SecurityGroupIds: 인스턴스가 속할 보안 그룹의 ID 리스트입니다.
- IamInstanceProfile: 인스턴스가 사용할 IAM 인스턴스 프로필의 ARN입니다.
- TagSpecifications: 인스턴스에 적용될 태그를 정의합니다.
- UserData : EC2가 생성할 때 실행시켜야할 명령어를 입력할 수 있습니다.
MyWebServerGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
VPCZoneIdentifier:
- !Ref PrivateSubnet1
- !Ref PrivateSubnet2
LaunchTemplate:
LaunchTemplateId:
Ref: MyWebLaunchTemplate
Version: !GetAtt MyWebLaunchTemplate.LatestVersionNumber
MinSize: 2
MaxSize: 4
DesiredCapacity: 4
TargetGroupARNs:
- !Ref InternetFacingALBTargetGroup
Tags:
- Key: Name
Value: EC2WebServer
PropagateAtLaunch: true
EC2SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: EC2 security group
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Tags:
- Key: Name
Value: EC2SecurityGroup
- MyWebServerGroup (오토스케일링 그룹)
- Type: AWS::AutoScaling::AutoScalingGroup은 동적으로 확장 및 축소할 수 있는 EC2 인스턴스 그룹을 정의합니다.
- Properties:
- VPCZoneIdentifier: 오토스케일링 그룹이 배포될 서브넷의 ID 리스트입니다.
- LaunchTemplate: 인스턴스 생성에 사용될 런치 템플릿의 정보입니다.
- MinSize, MaxSize, DesiredCapacity: 오토스케일링 그룹의 최소, 최대, 원하는 인스턴스 수입니다.
- TargetGroupARNs: 오토스케일링 그룹에 연결된 타겟 그룹의 ARN 리스트입니다.
- Tags: 오토스케일링 그룹 내 인스턴스에 적용될 태그입니다.
- Properties:
- Type: AWS::AutoScaling::AutoScalingGroup은 동적으로 확장 및 축소할 수 있는 EC2 인스턴스 그룹을 정의합니다.
EFS 세팅
MyEFSFileSystem:
Type: AWS::EFS::FileSystem
Properties:
Encrypted: true
PerformanceMode: generalPurpose
ThroughputMode: bursting
FileSystemTags:
- Key: Name
Value: MyEFSFileSystem
MyEFSMountTarget3:
Type: AWS::EFS::MountTarget
Properties:
FileSystemId: !Ref MyEFSFileSystem
SubnetId: !Ref PrivateSubnet3
SecurityGroups:
- !Ref EFSSecurityGroup
MyEFSMountTarget4:
Type: AWS::EFS::MountTarget
Properties:
FileSystemId: !Ref MyEFSFileSystem
SubnetId: !Ref PrivateSubnet4
SecurityGroups:
- !Ref EFSSecurityGroup
EFSSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow access to EFS
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 2049
ToPort: 2049
CidrIp: 10.10.0.0/22
Amazon EFS (Elastic File System)는 AWS에서 제공하는 완전관리형의 확장 가능한 파일 스토리지 서비스입니다. EFS는 간단하고 확장성이 뛰어난 파일 스토리지를 필요로 하는 애플리케이션에 적합합니다.
- 현재 위의 아키택쳐는 private subnet 3,4에 있는 APP단 오토스케일링 그룹이 EFS를 통해 파일을 공유 하고 있습니다.
- Type: AWS::EFS::FileSystem 리소스는 Amazon EFS 파일 시스템을 생성합니다.

- Properties
- Encrypted: 파일 시스템의 데이터를 암호화할지 여부를 지정합니다. 여기서는 true로 설정되어 있어, 데이터가 암호화됩니다.
- PerformanceMode: 파일 시스템의 성능 모드를 설정합니다. generalPurpose는 일반적인 용도로 사용되며, 대부분의 워크로드에 적합합니다.
- ThroughputMode: 처리량 모드를 설정합니다. bursting은 사용량에 따라 자동으로 처리량이 조절되는 모드입니다.
- FileSystemTags: 파일 시스템에 태그를 추가합니다. 여기서는 이름을 MyEFSFileSystem으로 지정합니다.
- LifecyclePolices: 위의 코드에는 추가 안했지만 라이프사이클도 추가할 수 있습니다.
- TransitionToIA: AFTER_30_DAYS : 30일이 지난 후에 IA로 전환 할 수 있습니다.
- MyEFSMountTarget3 & MyEFSMountTarget4 (EFS 마운트 타겟 생성)
- Type: AWS::EFS::MountTarget은 EFS 파일 시스템을 EC2 인스턴스에 마운트할 수 있는 타겟을 생성합니다.
- Properties:
- FileSystemId: 마운트할 파일 시스템의 ID를 참조합니다.
- SubnetId: 마운트 타겟이 위치할 서브넷의 ID를 참조합니다. PrivateSubnet3과 PrivateSubnet4에 각각 마운트 타겟을 생성합니다.
- SecurityGroups: 마운트 타겟에 대한 네트워크 액세스를 허용하는 보안 그룹을 지정합니다.
- Properties:
- Type: AWS::EFS::MountTarget은 EFS 파일 시스템을 EC2 인스턴스에 마운트할 수 있는 타겟을 생성합니다.
- EFSSecurityGroup (보안 그룹 생성)
- Type: AWS::EC2::SecurityGroup은 인바운드 트래픽 규칙을 통해 EFS 파일 시스템에 대한 접근을 허용하는 보안 그룹을 생성합니다.
- Properties
- GroupDescription: 보안 그룹의 설명입니다.
- VpcId: 보안 그룹이 생성될 VPC의 ID를 참조합니다.
- SecurityGroupIngress: 보안 그룹에 인바운드 규칙을 추가합니다. 여기서는 TCP 프로토콜 2049 포트(NFS)로의 접근을 허용합니다.
- Properties
- Type: AWS::EC2::SecurityGroup은 인바운드 트래픽 규칙을 통해 EFS 파일 시스템에 대한 접근을 허용하는 보안 그룹을 생성합니다.
RDS 세팅
MyDBInstance:
Type: AWS::RDS::DBInstance
Properties:
DBName: MinRDS
AllocatedStorage: 20
DBInstanceClass: !Ref DBInstanceClass
Engine: mysql
MasterUsername: !Ref MasterUsername
MasterUserPassword: !Ref MasterUserPassword
MultiAZ: true
VPCSecurityGroups:
- !Ref MyDBSecurityGroup
DBSubnetGroupName: !Ref MyDBSubnetGroup
MyDBSubnetGroup:
Type: AWS::RDS::DBSubnetGroup
Properties:
DBSubnetGroupDescription: My DB Subnet Group
SubnetIds:
- !Ref PrivateSubnet3
- !Ref PrivateSubnet4
MyDBSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Access to RDS
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 3306
ToPort: 3306
CidrIp: 10.10.0.0/24
- MyDBInstance (RDS 데이터베이스 인스턴스)
- Type: AWS::RDS::DBInstance는 Amazon RDS 데이터베이스 인스턴스를 생성합니다.
- Properties
- DBName: 생성될 데이터베이스의 이름입니다.
- AllocatedStorage: 데이터베이스에 할당될 스토리지 크기(GB)입니다.
- DBInstanceClass: 데이터베이스 인스턴스 유형입니다. db.t2.small은 인스턴스의 성능을 결정합니다.
- Engine: 사용될 데이터베이스 엔진입니다. 여기서는 mysql을 사용합니다.
- MasterUsername와 MasterUserPassword: 데이터베이스의 마스터 사용자 이름과 비밀번호입니다.
- MultiAZ: 데이터베이스 인스턴스의 고가용성 설정입니다. true로 설정하면, 자동으로 다른 가용 영역에 대기 복제본이 생성됩니다.
- VPCSecurityGroups: 데이터베이스 인스턴스에 대한 네트워크 접근 제어를 설정하는 VPC 보안 그룹입니다.
- DBSubnetGroupName: 데이터베이스 인스턴스가 위치할 서브넷 그룹의 이름입니다.
- MyDBSubnetGroup (RDS 서브넷 그룹)
- Type: AWS::RDS::DBSubnetGroup는 RDS 데이터베이스 인스턴스를 위한 서브넷 그룹을 생성합니다.
- Properties:
- DBSubnetGroupDescription: 서브넷 그룹의 설명입니다.
- SubnetIds: 서브넷 그룹에 포함될 서브넷의 ID 목록입니다. 여기서는 PrivateSubnet3와 PrivateSubnet4를 참조합니다.
- MyDBSecurityGroup (RDS 보안 그룹)
- Type: AWS::EC2::SecurityGroup는 EC2 인스턴스 또는 RDS 인스턴스와 같은 리소스에 대한 인바운드 및 아웃바운드 트래픽을 제어합니다.
- Properties:
- GroupDescription: 보안 그룹의 설명입니다.
- VpcId: 보안 그룹이 위치할 VPC의 ID입니다.
- SecurityGroupIngress: 인바운드 규칙을 정의합니다. 여기서는 MySQL 데이터베이스의 기본 포트인 3306번 포트로 들어오는 TCP 트래픽을 허용합니다.
ElastiCache 세팅
MyCacheSubnetGroup:
Type: AWS::ElastiCache::SubnetGroup
Properties:
Description: Cache Subnet Group
SubnetIds:
- !Ref PrivateSubnet3
MyElasticCacheCluster:
Type: AWS::ElastiCache::CacheCluster
Properties:
CacheNodeType: !Ref CacheNodeType
Engine: redis
NumCacheNodes: 1
CacheSubnetGroupName: !Ref MyCacheSubnetGroup
VpcSecurityGroupIds:
- !GetAtt MyElasticCacheSecurityGroup.GroupId
MyElasticCacheSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Security Group for ElasticCache
VpcId: !Ref VPC
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 6379
ToPort: 6379
CidrIp: 10.10.0.0/24
- MyCacheSubnetGroup (ElastiCache 서브넷 그룹)
- Type: AWS::ElastiCache::SubnetGroup는 ElastiCache 클러스터를 위한 서브넷 그룹을 생성합니다.
- Properties
- Description: 서브넷 그룹에 대한 설명입니다.
- SubnetIds: 서브넷 그룹에 포함될 서브넷의 ID 목록입니다. 여기서는 PrivateSubnet3를 참조합니다. 이는 ElastiCache 클러스터가 배치될 VPC 내의 특정 서브넷을 지정합니다.


- MyElasticCacheCluster (ElastiCache 클러스터)
- Type: AWS::ElastiCache::CacheCluster는 ElastiCache 클러스터를 생성합니다.
- Properties:
- CacheNodeType: 사용될 캐시 노드 유형입니다. cache.t2.small은 클러스터에 사용될 인스턴스 유형을 지정합니다.
- Engine: 캐시 엔진 유형을 지정합니다. 여기서는 redis를 사용합니다.
- NumCacheNodes: 클러스터에 생성될 캐시 노드의 수입니다. 여기서는 1개의 노드만 생성합니다.
- CacheSubnetGroupName: 클러스터가 사용할 서브넷 그룹의 이름을 참조합니다. 여기서는 MyCacheSubnetGroup을 사용합니다.
- VpcSecurityGroupIds: 클러스터에 적용될 보안 그룹의 ID 목록입니다. 여기서는 MyElasticCacheSecurityGroup의 그룹 ID를 참조합니다.
- MyElasticCacheSecurityGroup (ElastiCache 보안 그룹)
- Type: AWS::EC2::SecurityGroup는 AWS 리소스에 대한 네트워크 액세스를 제어하는 보안 그룹을 생성합니다.
- Properties:
- GroupDescription: 보안 그룹에 대한 설명입니다.
- VpcId: 보안 그룹이 생성될 VPC의 ID를 참조합니다.
- SecurityGroupIngress: 인바운드 규칙을 정의합니다. 여기서는 Redis의 기본 포트인 6379번 포트로 TCP 트래픽을 허용합니다. 이는 ElastiCache 클러스터에 대한 액세스를 제어합니다.
Output 설정
Outputs:
BastionHostPublicIp:
Description: Public IP address of the bastion host
Value: !GetAtt BastionHost.PublicIp
InternetFacingALBDNSName:
Description: The DNS name of the internet-facing load balancer
Value: !GetAtt MyInternetFacingALB.DNSName
InternelALBDNSName:
Description: The DNS name of the internel load balancer
Value: !GetAtt MyInternalALB.DNSName
RDSDBInstanceReadEndpoint:
Description: The read endpoint of the RDS DB instance (if applicable for read replicas)
Value: !GetAtt MyDBInstance.Endpoint.Address
ElastiCacheRedisEndpoint:
Description: The endpoint of the ElastiCache Redis cluster
Value: !GetAtt MyElasticCacheCluster.RedisEndpoint.Address
- 콘솔에서 보고 싶은 내용을 출력할 수 있습니다.
- 굳이 각각의 서비스에 안 찾아가도 되고 CloudFormation에서 모두 확인할 수 있습니다.
'AWS Cloud School > project' 카테고리의 다른 글
CloudFormation을 TerraForm으로 변경하기 (0) | 2024.03.11 |
---|---|
CloudFormation 실행하기 및 테스트 (0) | 2024.03.11 |
DMZ 구성 (0) | 2024.02.01 |
CentOS에서 보안 회선 VPN 구성 (실습) (2) | 2024.01.21 |