#AWS Certified Developer Associate
(12.13 시작)
205. AWS CloudFormaiton - 섹션 소개
aws의 IaC 도구
206. AWS CloudFormaiton 개요
CloudFormation 은 모든 리소스에 관한 aws 인프라 개요를 선언하는 방식 대부분 지원됨
- Infrastructure as Code - 코드형 인프라 관리
- 수동으로 생성되는 리소스가 없어 제어하기 좋음
- 모든 코드는 예를 들어 Git으로 버전 관리를 할 수 있어 관리하기 좋음
- 인프라의 모든 변경 사항은 코드 검토를 통해 검토됨
- Cost
- 비용 측면에서 CloudFormation 자체는 무료, 생성한 모든 스택에는 식별자가 있어 손쉽게 스택의 비용을 추적할 수 있음- CloudFormation 탬플릿으로 리소스 비용을 추산할 수 있음- 개발환경, 저용량의 AWS 계정에서 CloudFormation 을 사용한 비용 절약 전략이 필요하다면 자동으로 오후 5시에 모든 탬플릿을 삭제하고 오전 8시에 재생성 할 수 있음 - IaC 이기에 모두 다시 생성 가능 - 많은 비용을 절약 가능
- Productivity - 생산성
원하는 만큼 즉흥적으로 인프라를 삭제하고 재생성 할 수 있음
프레젠테이션을 생성하면 자동으로 도표가 생성되도록 할 수 있음
선언형 프로그래밍으로 순서와 조정의 측면에서 순서를 파악할 필요가 없음
- Separation of concern - 관심 분리
많은 앱과 층에 원하는 만큼의 스택을 가질 수 있음
VPC stacks, Network stacks - 서브넷의 모든 네트워크를 생성하는 VPC CloudFormation 스택이 가장 일반적임
App stacks - 애플리케이션 스택은 배포할 각 애플리케이션에 애플리케이션 CloudFormation 스택이 있는 것
CloudFormation Works
Amazon S3에 탬플릿을 업로드하면 CloudFormation이 가져옴
탬플릿을 업로드 할 때 이전 탬플릿은 수정할 수 없음 - 새 버전 탬플릿을 업로드해야함
스택은 이름으로 식별됨(identified)
스택을 삭제하면 모든 단일 Artifact와 CloudFormation 에서 생성한 모든 스택도 함께 삭제됨
Deploying CloudFormation templates
수동
- CloudFormation designer 에서 탬플릿을 수정
- 콘솔을 이용 매개변수를 입력하는 방법 - etc
자동- 텍스트 에디터를 이용, yaml 파일 수정- 탬플릿 배포에 AWS CLI 사용- 플로우의 일부 자동화를 위해 추천
CloudFormation Building BlocksTemplates components (탬플릿 구성요소)1. Resources - 탬플릿에서 선언할 AWS 리소스 (Mandatory)2. Parameters - 사용자가 탬플릿을 참조하도록 탬플릿에 요청할 수 있느느 동적 입력값3. Mappings - 탬플릿의 정적 변수4. Outputs - 탬플릿에서 일부를 내보내면 다른 탬플릿에서 참조하는 것5. Conditionals - 조건의 리스트 IF문이 생성된 것을 제어하는 것6. Metadata
Templates helpers1. References - 탬플릿 내에서 참조하거나 연결할 수 있음2. Funtions - 데이터를 변환하는 기능도 사용 가능
207. AWS CloudFormaiton 스택 생성 실습
인프라에 간단한 ec2 인스턴스를 생성
이후 EIP를 추가 + 할당
보안 그룹 2개 추가
강의와 같은 환경에서 실행하기 위해 us-east-1 인 버지니아에서 진행
이미 있는 파일을 업로드 하는 방식으로 진행
이름만 입력해주고 나머진 모두 스킵해주고 생성하면
events 탭에서 create_in_progress 상태인걸 확인할 수 있다
새로고침 해보면 MyInstance 이름으로 ec2 가 하나 생성된것을 확인할 수 있다
208. AWS CloudFormaiton 업데이트 및 스택 직접 삭제
#0-just-ec2.yaml
---
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
AvailabilityZone: us-east-1a
ImageId: ami-a4c7edb2
InstanceType: t2.micro
위 탬플릿으로 이전 실습을 만들었는데
이제 2번째 탬플릿을 업데이트해서
EIP 1개와 파라미터를 추가하고
2개의 보안그룹을 새로 추가한다고 한다
#1-ec2-with-sg-eip.yaml
---
Parameters:
SecurityGroupDescription:
Description: Security Group Description
Type: String
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
AvailabilityZone: us-east-1a
ImageId: ami-a4c7edb2
InstanceType: t2.micro
SecurityGroups:
- !Ref SSHSecurityGroup
- !Ref ServerSecurityGroup
# an elastic IP for our instance
MyEIP:
Type: AWS::EC2::EIP
Properties:
InstanceId: !Ref MyInstance
# our EC2 security group
SSHSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable SSH access via port 22
SecurityGroupIngress:
- CidrIp: 0.0.0.0/0
FromPort: 22
IpProtocol: tcp
ToPort: 22
# our second EC2 security group
ServerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Ref SecurityGroupDescription
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 192.168.1.1/32
위 2번째 파일로 탬플릿을 업데이트 할 예정
현재 탬플릿을 교체 - 파일 업로드
s3에 파일이 업로드되면 designer 에서 보기로 접근할 수 있다
위처럼 gui 형식으로도 편집할 수 있음
코드에서 파라미터 블럭을 추가해줬기때문에
매개변수 값을 입력해줘야 한다
변수 이름은 보안그룹설명이고 대충 아무거나 입력해주고 다음
스택 옵션 구성 단계는 스킵해주고 다음
검토 단계에서 아래로 내리면
변경 사항을 확인할 수 있다
작업이 수정(modify)로 되어있고 대체(replacement)에 true 로 되어있는 기존 인스턴스는 제거되고 새로 생성될 것이다
yaml 파일에서 작성한 코드의 순서가 아니라
cloudformation 에서는 aws 동작 순서대로
보안그룹부터 만들고
ec2를 대체한 후
eip 를 생성하는 모습이다
즉 리소스 생성 순서를 정의할 필요가 없이 aws가 알아서 순서대로 progress 한다는 것
작업이 끝나면 기존 인스턴스는 자동 종료된다
리소스를 보면 새로 생성된 eip 나 sg를 볼 수 있고
instance 도 업데이트 완료된것으로 나온다
직접 ec2 탭으로 가서 확인해봐도 잘 생성되있는 것을 확인할 수 있다
위 코드에서 80번 포트 보안그룹에서
매개변수인 SecurityGroupDescription 을 groupdescription 으로 넣어줬는데
위처럼 잘 추가된것도 확인할 수 있다
이제 cloudformation stack 삭제를 한다고 함
삭제를 누르게 되면
해당 플랫폼으로 생성된 모든 리소스가 삭제되며
cloudformation 은 삭제해야할 순서대로 자동으로 삭제한다
위 탬플릿을 예로들면
EIP 를 릴리스하고 - EC2 를 종료하고 - SG 를 삭제한다
209. YAML 단기 집중 과정
CloudFormation 은 yaml 과 json 언어를 지원함
근데 json 은 cloudformation 에서 추천하지 않는다고 함
key value pairs - 키 값 페어 형식으로 구성됨
직관적인 코드 구성
yaml 에서 최상단에서 키 값 페어를 가질 수 있는데 중첩 객체를 가질 수도 있음
배열도 지원
yaml 파일 작성법 정리 link
https://m-falcon.tistory.com/458
(12.13 끝 - 로아 레이드 하러가야댐)
(12.18 시작 - 학교 종강하고 다시 시작)
210. CloudFormation 리소스
aws가 리소스의 생성 + 연결 + 삭제를 모두 해줌
224개가 넘는 리소스가 있음
리소스 형식 : AWS::aws-product-name::data-type-name
리소스 타입 문서
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html
예시 문서 (for an ec2 instance)
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html
FAQ for resources
리소스 양을 동적으로 만들 수 있나?
- 안됌 - 동적인 코드 생성을 못하기 때문
모든 aws 서비스가 지원되나?
- 거의 다 됌, 아직 안되는 몇개가 있긴 한데 aws lambda 사용자 지정 리소스를 통해 작업할 수 있음
211. CloudFormation 매개변수
parameters 는 AWS CloudFormation 탬플릿에 입력값을 제공하는 방식이다
탬플릿을 다른 회사나 계정, 리전에서 재사용하기 원한다면 알아야할 중요한 사항임
어떤 입력값은 미리 결정할 수 없음
매개변수는 강력하고 제어할 수 있으며 탬플릿에서 발생하는 오류를 유형 덕분에 예방할 수 있음
매개변수 적용시 시스템이 향후 가변성이 있는지를 생각해서 적용해야 함
Type
- String
- Number
- CommaDelimitedList
- List<Type>
- AWS Parameter
Description
COnstraints
ConstraintDescription(String)
Min/MaxLength
Min/MaxValue
AllowedValues
AllowedPattern (reg exp)
NoEcho (Boolean)
매개변수는 YAML !Ref 함수를 이용해서 호출 가능
참조 관련 함수인데
매개변수를 참조하거나 리소스를 참조할수도 있음
Pseudo Parameters(의사 매개변수)
aws 에서 제공하는 매개변수
기본값이 활성화 되었을때 사용 가능
212. CloudFormation 매핑
매핑은 CloudFormation 탬플릿에서 고정 변수이다
사용자 환경에 따라 일부 값을 하드코딩 해야할 때 유용함
모든 값을 명시적으로 탬플릿에 쓰여야 함
사용할 모든 값을 알고있을때 매핑이 유용함
- ami ID
- Region
- AZ
- Environment (dev vs prod)
탬플릿을 좀더 안전하게 제어할 수 있게 해줌
만약 사용자별 특정값이 필요하다면 사용자가 값을 입력해야 하고 그 값이 무엇인지 사전에 알 수 없을때는 매개변수를 사용하는게 유용함
매핑 값 접근 형식
#Fn::FindInMap 함수 사용
!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]
213. CloudFormation 출력
Outputs - 선택사항 - 선택적 출력을 선언할 수 있음
만약 이 출력을 내보내면 다른 스택에서 값을 불러올 수 있음
즉, CloudFormation 탬플릿을 연결할 수 있음
aws 콘솔에서 출력을 볼 수도 있고 aws cli 를 이용해 출력값을 빠르게 검색할 수도 있음, UI 에서 볼수도 있음
이 출력값을 공유함으로써 여러 스택에서 협업이 가능함
CloudFormation 출력을 사용하고 , 이들이 다른 CloudFormation 스택에서 참조된다면 다른곳에서 참조중인 출력이 있는 스택을 삭제할 수 없다
!ImportValue 로 이전 스택에서 출력한 값을 가져옴
이렇게 참조되고있으면 앞의 스택은 삭제되지 않음
214. CloudFormation 조건
조건(Conditions)은 리소스나 어떤 논리 문장에 기반한 출력의 생성을 제어할 때 사용됨
조건문은 언제나 사용할 수 있음
- Environment (dev / test / prod) 에 따라 리소스 생성 제어
- AWS Region
- any parameter value
각 조건은 다른 조건, 매개변수 값, 매핑을 참조함 즉 다 커스텀하게 사용
how to define a condition?
Conditions:
CreateProdResources: !Equals [ !Ref EnvType, prod ]
conditions 블럭 사용
대충 저렇게 쓴다고함, 논리함수는 다 쓸 수 있다고 함
Resources:
MountPoint:
Type: "AWS::EC2::VolumeAttachment"
Condition: CreateProdResources
위 처럼 조건을 사용하면
CreateProdResources 가 참이여야만
위 리소스가 만들어지게 된다
215. CloudFormation 내장함수
- Ref
매개변수 혹은 리소스를 참조할 때 사용
!Ref 로 사용
- Fn::GetAtt
직접 생성했던 리소스의 속성을 얻을때 사용
모든 리소스와 이 리소스에 있는 모든 속성의 리스트를 얻을 수 있음
Return values
Ref
When you pass the logical ID of this resource to the intrinsic Ref function, Ref returns the instance ID. For example: i-1234567890abcdef0.
For more information about using the Ref function, see Ref.
Fn::GetAtt
The Fn::GetAtt intrinsic function returns a value for a specified attribute of this type. The following are the available attributes and sample return values.
For more information about using the Fn::GetAtt intrinsic function, see Fn::GetAtt.
The Availability Zone where the specified instance is launched. For example: us-east-1b.
You can retrieve a list of all Availability Zones for a Region by using the Fn::GetAZs intrinsic function.
PrivateDnsNameThe private DNS name of the specified instance. For example: ip-10-24-34-0.ec2.internal.
PrivateIpThe private IP address of the specified instance. For example: 10.24.34.0.
PublicDnsNameThe public DNS name of the specified instance. For example: ec2-107-20-50-45.compute-1.amazonaws.com.
PublicIpThe public IP address of the specified instance. For example: 192.0.2.0.
Resources:
EC2Instance:
Type: "AWS::EC2::Instance"
Properties:
ImageId: ami-1234567
InstanceType: t2.micro
예를들어 위 EC2 머신의 AZ를 원한다면
NewVolume:
Type: "AWS::EC2::Volume"
COndition: CreateProdResources
Properties:
Size:100
AvailabilityZone:
!GetAtt EC2Instance.AvailabilityZone
위처럼 !GetAtt 으로 얻어와서 사용할 수 있다
- Fn::FindInMap
매핑함수로 미리 하드코딩한 값을 가져와서 사용
- Fn::ImportValue
다른 탬플릿의 출력으로 내보내기 된 값들을 가져올때 사용
- Fn::Join
구분자로 값을 결합할 수 있음a:b:c 라는 문자열을 만들때
!Join [ ":", [a, b, c] ]
위처럼 사용한다고 함
- Fn::Sub
대체(Substitute)의 약어, 문자열에서 값을 바꿀때 매우 유용하다고 함
참조나 의사 변수와 함께 사용할 수 있음문자열에는 반드시 ${VariableName} 기호를 사용해야 함
!Sub
- String
- { Var1Name : Var1Value, Var2Name: Var2Value }
...
!sub String
- Condition Functions (Fn::If, Fn::Not, Fn::Equals 등) (조건함수)
위에서 함
216. CloudFormation 롤백
스택 생성에 실패할 경우- 기본적으로 모든 사항이 롤백됨 - 전부 삭제된다는 뜻- 스택을 생성할때 롤백을 비활성화하는 옵션도 있음 - 어떤 일이 발생했는지 트러블 슈팅을 진행할때 사용
이미 생성되어 쓰이고 있는 스택을 업데이트 하는데 실패할 경우- 업데이트에 실패하면 스택이 자동으로 롤백되어서 이전 작업 상태로 알려진 그린 상태로 돌아감- 오류 메세지를 통해 로그에 어떤 일이 생겼는지도 볼 수 있음
위에 0-just-ec2.yaml 파일로 생성하려는데 이미지를 찾을 수 없다고 400번 오류가 나서왜그런지 보니까 소스가 버지니아 리전에 맞춰져있어서 그런거였다나는 서울에서 스택 생성하려고 해서 cloudformation 에서 오류가 난거였음ami id 가 버전별로 다른가보다
이후 업데이트해줌
#2-trigger-failure.yaml
---
Parameters:
SecurityGroupDescription:
Description: Security Group Description
Type: String
Resources:
MyInstance:
Type: AWS::EC2::Instance
Properties:
AvailabilityZone: us-east-1a
ImageId: ami-123456
InstanceType: t2.micro
SecurityGroups:
- !Ref SSHSecurityGroup
- !Ref ServerSecurityGroup
# an elastic IP for our instance
MyEIP:
Type: AWS::EC2::EIP
Properties:
InstanceId: !Ref MyInstance
# our EC2 security group
SSHSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Enable SSH access via port 22
SecurityGroupIngress:
- CidrIp: 0.0.0.0/0
FromPort: 22
IpProtocol: tcp
ToPort: 22
# our second EC2 security group
ServerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: !Ref SecurityGroupDescription
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 80
ToPort: 80
CidrIp: 0.0.0.0/0
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 192.168.1.1/32
위 코드에서 리소스 인스턴스 아이디가 ami-123456 이여서 오류가 날꺼다
업데이트 하게 되면
ami-123456 을 찾을 수 없다고 나오고 스택 생성에 실패함
이후 롤백 프로세스 진행
새로 스택을 생성할때 위 파일로 생성하게 되면 스택 생성 옵션을 설정할 수 있다
스택 이름을 FailureDemo2 로 하고
같은 파일을 올린 후에
강의에서는 stack creation option 안에 같이 있었는데
이후에 분리되었나보다
stack failure option 에서 보존으로 놓고 생성하면
위 처럼 몇개 리소스는 아예 실패해서 생성되지 않았지만
ssh-sh 는 생성된 채 삭제되지 않고 유지되고 있는 것을 확인할 수 있다
이미 있던 스택의 업데이트에서 실패한 경우 위 콘솔에서 업데이트 또는 삭제 둘다 가능하며
새로 스택을 업로드 할때 스택 롤백 옵션을 비활성화한 FailureDemo2 같은 경우에도 업데이트 또는 삭제 둘다 가능하다
그러나 새로 스택을 업로드할때 스택 롤백 옵션을 활성화해서 자동으로 롤백이 실행되면 업데이트는 불가능하고 삭제만 가능하다고 한다
217. CloudFormation ChangeSet, 중첩 스택 및 StackSet
ChangeSet - 변경사항인듯
스택을 업데이트 할 때는 사전에 어떤 변경 사항이 발생하는지 알아야 그 신뢰도를 높일 수 있음
업데이트 성공 여부를 알 수는 없지만 어떤일이 생길지 알 수 있음
Nested stacks - 중첩 스택
중첩스택은 cloudformation 의 기타 스택의 일부임
중첩스택은 반복되는 패턴 죽 개별 스택의 공통 구성 요소를 업데이트하고 이들을 다른 스택에서 호출함
예시 :
로드밸런서의 구성이 재사용될 때
보안 그룹 구성이 재사용될 때
-> 중첩 스택이 최선의 방법으로 간주됨
중첩 스택을 업데이트 하려면 먼저 상위 스택을 업데이트 해야함 (root stack)
Cross vs Nested Stacks
Cross stacks
- 스택의 수명 주기가 서로 다를때 유용함
- outputs export 하고 Fn::ImportValue 사용
- export 값을 여러 스택으로 전달
Nested stacks
- 구성요소가 재사용 및 재생성되어야 유용함
- 중첩 스택이 상위 수준의 스택에서만 영향을 미칠때 중요하다고 할 수 있음 - 스택간 공유가 되지는 않음
StackSets - 단일 작업
여러 계정과 리전에 걸쳐서 스택을 생성, 업데이트 또는 삭제 하는데 사용
관리자 계정이 stackset을 생성 - 신뢰할 수 있는 계정이 stackset 으로부터 스택 인스턴스를 생성, 업데이트 또는 삭제 할 수 있음
stackset을 업데이트하면 연결된 모든 리전과 게정에 대한 스택 인스턴스 또한 업데이트 됨
218. CloudFormation 드리프트
cloudformation으로 생성한 구성을 수동으로 변경하는데 대한 보호가 없음
drift - IaC로 생성된 인프라를 제3자가 수동으로 변경하는 것
CloudFormation drift 기능 - drift 감지 - 모든 리소스가 지원되지는 않음
드리프트 감지 지원 리소스 리스트
새로 스택을 만들어줬다
파일은 새로
Parameters:
VPCId:
Description: VPC to create the security group into
Type: AWS::EC2::VPC::Id
Resources:
SSHSecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: Test Drift SSH Security Group
SecurityGroupIngress:
- CidrIp: "10.0.0.0/25"
FromPort: 22
ToPort: 22
IpProtocol: tcp
VpcId: !Ref VPCId
HTTPSecurityGroup:
Type: "AWS::EC2::SecurityGroup"
Properties:
GroupDescription: Test Drift HTTP Security Group
SecurityGroupIngress:
- CidrIp: "0.0.0.0/0"
FromPort: 80
ToPort: 80
IpProtocol: tcp
VpcId: !Ref VPCId
기본 vpc 를 파라미터에서 선택해주면
2개의 보안그룹이 생성된다
그리고 보안그룹으로 들어가서 cidr를 바꾸거나 인아웃바운드 규칙을 삭제했다
(대충 http 인바운드 추가함)
그리고 stack actions 에 있는 드리프트 감지를 선택해줌
그럼 드리프트 감지 매커니즘이 시작되고
스택 작업에 드리프트 감지 결과로 들어가보면
이렇게 각 리소스별 상태가 나와있고
드리프트 상세 결과 보기로 들어가보면
이렇게 예상 값과 실제 값이 나와있다
이렇게 드리프트 여부를 알 수 있고
자주 실행시켜주는게 좋다고 한다 - 자동으로 현상유지를 시켜주진 않는듯 하다
cloudformation 끝!
'AWS > AWS Certified Developer Associate' 카테고리의 다른 글
[Udemy][day-43] Section19 : AWS 모니터링 및 감사: CloudWatch, X-Ray 및 CloudTrail - 2 (0) | 2022.12.23 |
---|---|
[Udemy][day-42] Section19 : AWS 모니터링 및 감사: CloudWatch, X-Ray 및 CloudTrail - 1 (0) | 2022.12.22 |
[Udemy][day-38,39] Section17 : AWS CI/CD-2 (0) | 2022.12.05 |
[Udemy][day-36,37] Section17 : AWS CI/CD-1 (0) | 2022.12.03 |
[Udemy][day-33,34,35] Section16 : AWS Elastic Beanstalk (0) | 2022.11.15 |