공부하기싫어
article thumbnail

#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 인 버지니아에서 진행

0-just-ec2.yaml
0.00MB

이미 있는 파일을 업로드 하는 방식으로 진행

create stack
stack info
events tab

이름만 입력해주고 나머진 모두 스킵해주고 생성하면

events 탭에서 create_in_progress 상태인걸 확인할 수 있다

 

create_complete

새로고침 해보면 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
0.00MB

#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번째 파일로 탬플릿을 업데이트 할 예정

 

update

 

changes

현재 탬플릿을 교체 - 파일 업로드

 

designer 에서 보기

s3에 파일이 업로드되면 designer 에서 보기로 접근할 수 있다

위처럼 gui 형식으로도 편집할 수 있음

parameters

코드에서 파라미터 블럭을 추가해줬기때문에

매개변수 값을 입력해줘야 한다

변수 이름은 보안그룹설명이고 대충 아무거나 입력해주고 다음

 

스택 옵션 구성 단계는 스킵해주고 다음

 

검토 단계에서 아래로 내리면

changes

변경 사항을 확인할 수 있다

작업이 수정(modify)로 되어있고 대체(replacement)에 true 로 되어있는 기존 인스턴스는 제거되고 새로 생성될 것이다

 

events

yaml 파일에서 작성한 코드의 순서가 아니라

cloudformation 에서는 aws 동작 순서대로

보안그룹부터 만들고

ec2를 대체한 후

eip 를 생성하는 모습이다

즉 리소스 생성 순서를 정의할 필요가 없이 aws가 알아서 순서대로 progress 한다는 것

 

작업이 끝나면 기존 인스턴스는 자동 종료된다

resources

리소스를 보면 새로 생성된 eip 나 sg를 볼 수 있고

instance 도 업데이트 완료된것으로 나온다

직접 ec2 탭으로 가서 확인해봐도 잘 생성되있는 것을 확인할 수 있다

 

위 코드에서 80번 포트 보안그룹에서

매개변수인 SecurityGroupDescription 을 groupdescription 으로 넣어줬는데

description

위처럼 잘 추가된것도 확인할 수 있다

 

 

이제 cloudformation stack 삭제를 한다고 함

delete

삭제를 누르게 되면

해당 플랫폼으로 생성된 모든 리소스가 삭제되며

cloudformation 은 삭제해야할 순서대로 자동으로 삭제한다

위 탬플릿을 예로들면

EIP 를 릴리스하고 - EC2 를 종료하고 - SG 를 삭제한다

 

 

209. YAML 단기 집중 과정

CloudFormation 은 yaml 과 json 언어를 지원함

근데 json 은 cloudformation 에서 추천하지 않는다고 함

 

key value pairs - 키 값 페어 형식으로 구성됨

직관적인 코드 구성

yaml 에서 최상단에서 키 값 페어를 가질 수 있는데 중첩 객체를 가질 수도 있음

배열도 지원

 

yaml 파일 작성법 정리 link

https://m-falcon.tistory.com/458

 

YAML 파일 작성법

yaml 은 보통 Configuration 파일로 자주 쓴다. ex) serverless.yml json을 두고 yaml 을 써야하는 이유? 주석을 넣을 수 있다. 더 읽기 편하다. 동일 파일 내에서 '참조'가 가능하다. 기본 문법 main syntax HashMap(Ke

m-falcon.tistory.com

 

 

(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

 

AWS resource and property types reference - AWS CloudFormation

Thanks for letting us know this page needs work. We're sorry we let you down. If you've got a moment, please tell us how we can make the documentation better.

docs.aws.amazon.com

예시 문서 (for an ec2 instance)

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html

 

AWS::EC2::Instance - AWS CloudFormation

If you do not specify a key pair, you can't connect to the instance unless you choose an AMI that is configured to allow users another way to log in.

docs.aws.amazon.com

 

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 스택에서 참조된다면 다른곳에서 참조중인 출력이 있는 스택을 삭제할 수 없다

 

output 선언

 

다른 스택에서 출력 참조

!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.

AvailabilityZone

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.

PrivateDnsName

The private DNS name of the specified instance. For example: ip-10-24-34-0.ec2.internal.

PrivateIp

The private IP address of the specified instance. For example: 10.24.34.0.

PublicDnsName

The public DNS name of the specified instance. For example: ec2-107-20-50-45.compute-1.amazonaws.com.

PublicIp

The 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 가 버전별로 다른가보다

 

update

이후 업데이트해줌

 

#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 이여서 오류가 날꺼다

 

 

update

 

changes

업데이트 하게 되면

 

update failed

ami-123456 을 찾을 수 없다고 나오고 스택 생성에 실패함

이후 롤백 프로세스 진행

 

새로 스택을 생성할때 위 파일로 생성하게 되면 스택 생성 옵션을 설정할 수 있다

스택 이름을 FailureDemo2 로 하고

같은 파일을 올린 후에

스택 실패 옵션

강의에서는 stack creation option 안에 같이 있었는데

이후에 분리되었나보다

 

stack failure option 에서 보존으로 놓고 생성하면

 

stack rollback stoped

위 처럼 몇개 리소스는 아예 실패해서 생성되지 않았지만

ssh-sh 는 생성된 채 삭제되지 않고 유지되고 있는 것을 확인할 수 있다

 

cloudformation stacks

이미 있던 스택의 업데이트에서 실패한 경우 위 콘솔에서 업데이트 또는 삭제 둘다 가능하며

새로 스택을 업로드 할때 스택 롤백 옵션을 비활성화한 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 감지 - 모든 리소스가 지원되지는 않음

드리프트 감지 지원 리소스 리스트

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/resource-import-supported-resources.html

 

Resources that support import and drift detection operations - AWS CloudFormation

 

docs.aws.amazon.com

 

스택 생성

새로 스택을 만들어줬다

파일은 새로

 

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 에 있는 드리프트 감지를 선택해줌

detect drift

그럼 드리프트 감지 매커니즘이 시작되고

스택 작업에 드리프트 감지 결과로 들어가보면

 

드리프트 감지 결과

 

이렇게 각 리소스별 상태가 나와있고

드리프트 상세 결과 보기로 들어가보면

 

상세 결과

이렇게 예상 값과 실제 값이 나와있다

이렇게 드리프트 여부를 알 수 있고

자주 실행시켜주는게 좋다고 한다 - 자동으로 현상유지를 시켜주진 않는듯 하다

 

 

cloudformation 끝!