✔️ 개요
AWS CloudFormation을 사용해 웹 어플리케이션을 프로비저닝하고 업데이트하는 방법을 배우기
AWS CloudFormation을 사용해 S3 버킷을 생성하고 CloudFormation 스택을 삭제하는 경우 또는 롤백 중에 적용되는 다양한 보존 정책을 알아본다.
Amazon Linux 인스턴스를 사용해 간단한 PHP 웹 어플리케이션을 프로비저닝한다.
기존 앱에 CloudFormation 템플릿을 다시 적용해 Amazon EC2 인스턴스와 같인 일부 리소스 속성을 변경해본다.
✔️ AWS CloudFormation을 사용해 S3 버킷 생성하기
CloudFormation 템플릿 예제를 보면서 각 코드가 의미하는 것이 무엇인지 알아보자
AWSTemplateFormatVersion: 2010-09-09
Description: Basic S3 Bucket CloudFormation template
Resources:
S3BucketForWebsiteContent:
Type: AWS::S3::Bucket
Properties:
AccessControl: PublicRead
Outputs:
BucketName:
Value: !Ref S3BucketForWebsiteContent
Description: Name of the newly created Amazon S3 Distribution
AWSTemplateFormatVersion은 단순히 템플릿 형식의 버전이다.
이 버전을 지정하지 않으면 CloudFormation이 최신 버전을 사용한다.
Description은 유효한 JSON 문자열이며 스택 만들기 마법사의 파라미터 지정 페이지에 나타난다.
AWSTemplateFormatVersion: 2010-09-09
Description: Basic S3 Bucket CloudFormation template
Resources 객체에는 개별 리소스 객체의 목록이 포함된다.
리소스 선언에는 리소스의 속성이 포함되며, 이 속성은 하위 객체로 선언된다.
리소스에는 생성하는 AWS 리소스의 종류를 정의하는 Type 속성이 있어야한다.
Type 속성에는 특별한 형식이 있다.
예를 들어 S3 버킷의 리소스 유형은 AWS::S3::Bucket이다.
이 템플릿은 이름이 S3BucketForWebsiteContent이며 S3 버킷 유형의 단일 리소스를 선언한다.
Resources:
S3BucketForWebsiteContent:
Type: AWS::S3::Bucket
여기에 추가로 Properties 속성을 사용해 리소스를 생성하는 데 사용되는 정보를 지정한다.
리소스 유형에 따라 EC2 인스턴스 리소스의 ImagaId 속성 같은 일부 속성은 필수이나 다른 속성은 선택 사항이다.
일부 속성에는 S3 버킷 리소스의 AccessControl 속성과 같은 기본값이 있다.
속성의 값을 지정하는 것은 전적으로 선택 사항이며 필요에 따라 결정할 수 있다.
일반적으로 리소스의 속성은 단순한 문자열 값이다.
다음 템플릿은 버킷의 AccessControl 속성에 대해 미리 제공된 ACL(Public)을 제공한다.
Resources:
S3BucketForWebsiteContent:
Type: AWS::S3::Bucket
Properties:
AccessControl: PublicRead
선택적 출력
Outputs 섹션에서 cfn-describe-stacks 명령에 응답하여 반환되는 사용자 정의 값을 선택적으로 정의할 수 있다.
이러한 출력 값에는 리터럴, 리소스, 파라미터, 의사 파라미터 및 내장 함수를 기반으로 한 정보가 포함될 수 있다.
Outputs:
BucketName:
Value: !Ref S3BucketForWebsiteContent
Description: Name of the newly created Amazon S3 Distribution
✔️ CloudFormation 삭제 시 일부 리소스 삭제하지 않도록 지정하기
AWS CloudFormation을 삭제할 때 별도 지정이 없으면 생성했던 S3 버킷의 모든 것이 삭제된다.
만약 S3에 담긴 데이터가 중요한 데이터라면 CloudFormation을 삭제할 때 같이 삭제되어서는 안된다.
CloudFormation 템플릿을 구성하고 스택을 삭제할 때 일부 리소스를 삭제하지 않도록 지정하는 방법을 알아보자
AWSTemplateFormatVersion: 2010-09-09
Description: Basic S3 Bucket CloudFormation template
Resources:
S3BucketForWebsiteContent:
Type: AWS::S3::Bucket
Properties:
AccessControl: PublicRead
Outputs:
BucketName:
Value: !Ref S3BucketForWebsiteContent
Description: Name of the newly created Amazon S3 Distribution
리소스가 생성된 후에는 사용자가 시작한 스택 삭제 또는 롤백의 경우 리소스를 삭제하지 않아야 함을 나타낸다.
DeletionPolicy: Retain
위의 CloudFormation 템플릿으로 스택을 생성하고 스택을 삭제하면 S3 버킷이 여전히 존재하는 것을 확인할 수 있다.
✔️ 웹 어플리케이션 프로비저닝
실행 중인 스택을 업데이트하는 과정을 알아본다.
- 초기 스택 생성 : Amazon Linux AMI를 사용해 스택을 생성하고 AWS CloudFormation 헬퍼 스크립트를 사용해 Apache 웹 서버 및 간단한 PHP 애플리케이션 설치
- 애플리케이션 업데이트 : 어플리케이션의 파일 중 하나를 업데이트하고 CloudFormation을 사용해 소프트웨어를 배포한다.
- 인스턴스 유형 업데이트 : 기본 EC2 인스턴스의 인스턴스 유형을 변경한다.
- IAM 역할 업데이트 : 인스턴스에 할당된 역할을 추가 권한을 제공하는 다른 역할로 변경한다.
- 스택의 리소스 변경 : 스택에서 리소스를 추가 및 제거하고 템플릿을 업데이트하며 자동 크기 조절되고 로드 밸런스되는 어플리케이션으로 변환한다.
✔️ 리소스의 속성 변경하기
CloudFormation을 사용하면 스택에 있는 기존 리소스의 속성을 변경할 수 있다.
스택에서 업데이트를 지원하는 리소스의 모든 속성을 필요에 따라 수정할 수 있다.
t2.micro → t2.small 이동하려고 가정해보자
템플릿의 Mappings 섹션에서 EC2 인스턴스에 대한 매핑이 있음을 확인할 수 있다.
보통 인스턴스를 사용할 때 개발 및 테스트의 용도로 성능이 적은 인스턴스 유형을 선택하고 실제 서비스를 수행할 때 성능이 더 나은 인스턴스를 사용한다.
prod를 선택하면 t2.small 인스턴스가 프로비저닝되고 dev를 선택하면 t2.micro 인스턴스가 프로비저닝된다.
Mappings:
EC2TypeConfig:
prod:
InstanceType: t2.small
dev:
InstanceType: t2.micro
EVN가 템플릿에 대한 입력 파라미터였기 때문에 인스턴스 유형을 쉽게 변경할 수 있다.
따라서 템플릿을 수정할 필요가 없이 Stack Update 마법사의 Specify Parameters 페이지에서 파라미터 값을 변경하기만 하면 된다.
ENV:
Type: String
Default: dev
AllowedValues:
- dev
- prod
✔️ 리소스의 속성 추가
템플릿에 원래 지정되지 않았던 속성을 추가할 수도 있다.
이를 설명하기 위해 이름 태그가 지정되도록 EC2 인스턴스를 업데이트하고 포트 22도 연다.
다음 코드는 EC2 인스턴스에 이름 태그를 추가한다.
Properties:
Tags:
- Key: Name
Value: Web server - port 80 and 22
다음 코드는 EC2 보안 그룹의 인바운드 규칙에 포트 22를 추가한다.
WebServerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable HTTP
VpcId: !Ref VPCId
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
✔️ 자동으로 크기가 조정되는 어플리케이션을 생성하기
EC2 인스턴스에 할당되는 IAM 역할을 변경한다.
이 작업은 해당 인스턴스에서 실행되는 코드가 AWS API를 호출하는 데 도움이 된다.
새 버전의 어플리케이션이 인스턴스에서 Amazon EC2 읽기 전용 API에 액세스해야 한다고 가정한다.
이 코드는 실습 설정의 일부로 생성된 다른 역할의 이름을 제공한다.
ec2-role-2 역할은 실습 설정의 일부로 생성되었으며 EC2 읽기 전용 API를 호출할 수 있는 권한을 제공한다.
WebServerInstanceProfile:
Type: AWS::IAM::InstanceProfile
Properties:
Path: /
Roles:
- ec2-role-2
이 변경으로 인스턴스에 할당된 역할이 업데이트되며 스택에서 다른 변경은 필요하지 않다.
스택이 업데이트되면 EC2 인스턴스는 EC2 읽기 전용 API에 액세스 할 수 있다.
시간이 지나면서 어플리케이션 요구 사항이 변경될 수 있으므로 CloudFormation을 사용하면 스택을 구성하는 리소스 집합을 변경할 수 있다.
자동으로 크기가 조정되고 로드 밸런스되는 어플리케이션으로 변환해보자
템플릿에서 탄력적 IP 주소 리소스를 제거한다.
Endpoint:
Type: AWS::EC2::EIP
Properties:
InstanceId: !Ref WebServerHost
Elastic Load Balancer 리소스를 추가한다.
ElasticLoadBalancer:
Type: AWS::ElasticLoadBalancing::LoadBalancer
Properties:
Subnets:
- !Ref VPCPublicSubnetId
SecurityGroups:
- !Ref WebServerSecurityGroup
Listeners:
- LoadBalancerPort: 80
InstancePort: 80
Protocol: HTTP
HealthCheck:
Target: HTTP:80/
HealthyThreshold: 3
UnhealthyThreshold: 5
Interval: 30
Timeout: 5
템플릿의 EC2 인스턴스를 Auto Scaling 시작 구성으로 변환한다. 속성은 동일하고 유형 이름만 변경하면 된다.
변경 전
WebServerHost:
Type: AWS::EC2::Instance
변경 후
WebServerConfig:
Type: AWS::AutoScaling::LaunchConfiguration
템플릿에 Auto Scaling 그룹 리소스를 포함하고 리소스의 이름을 WebServerHost → WebServerConfig로 변경한다.
WebServerGroup:
Type: AWS::AutoScaling::AutoScalingGroup
Properties:
AvailabilityZones:
- !Ref VPCPublicSubnetAZ
LaunchConfigurationName: !Ref WebServerConfig
MinSize: 2
MaxSize: 3
LoadBalancerNames:
- !Ref ElasticLoadBalancer
VPCZoneIdentifier:
- !Ref VPCPublicSubnetId
보안 그룹 정의는 모든 IP에 대한 트래픽을 허용한다.
그러나 프로덕션 환경에서는 트래픽을 ELB 보안 그룹으로 제한하는 것이 좋다.
WebServerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable HTTP
VpcId: !Ref VPCId
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
Output 섹션에서 로드 밸런서의 DNS 이름을 어플리케이션의 위치로 반환하도록 한다.
Outputs:
WebsiteURL:
Value: !Sub 'http://${ElasticLoadBalancer.DNSName}'
Description: Application URL
'Public Cloud > AWS' 카테고리의 다른 글
[AWS] Lambda 실습 (0) | 2022.04.16 |
---|---|
[AWS] CloudFormation으로 VPC 생성 및 업데이트하기 (0) | 2022.04.16 |
[AWS] AWS CLI와 SDK를 이용한 DynamoDB CRUD (0) | 2022.04.16 |
[AWS] aws-nuke를 이용해 aws 리소스 한번에 지우기 (0) | 2022.04.10 |
[AWS] AMI 이미지 생성 및 관리 (0) | 2022.04.07 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!