본문 바로가기

AWS

[AWS] Cloudformation Git Sync 를 통한 쉬운 인프라 배포 (+실습)

'AWS로 구현하는 MAS와 컨테이너 오캐스트레이션' 강의를

블로그를 통해 구매하시는 분들에게만 10%할인 중입니다.

이미지를 클릭하고, 아래 쿠폰번호를 입력해 주세요!

16861-259843d6c2d7


 
 

 
Cloudformation에 대한 설명은 아래 글에서 확인하실 수 있습니다.

 

[AWS] CloudFormation 정리

스프링 부트를 사용한 예제 애플리케이션을 AWS를 통해 모노리식에서 MSA로 MSA에서 다시 컨테이너 오케스트레이션으로 개선해나가는 과정을 모두 담은 강의를 출시하게 되었습니다.강의 과

kanoos-stu.tistory.com

 
 


 

Git Sync 란?

Git Sync는 Git을 통해 AWS CloudFormation 스택을 관리, 연결된 Git 리포지토리의 두 가지 파일의 변경 사항을 모니터링한다.

  1. CloudFormation template file: 스택을 정의하는 파일
  2. Stack deployment file: 스택을 구성하는 파라미터가 포함된 파일

이 파일들에 변경 사항을 커밋하면 CloudFormation이 스택을 자동으로 업데이트, 이는 풀 요청 및 버전 추적을 통해 중앙에서 스택을 관리할 수 있게 한다.

Git Sync는 콘솔 인터페이스에서 Git 리포지토리를 연결하고, 이 리포지토리에 Stack deployment file 생성, Cloudformation template file 업데이트, 풀 요청을 하게된다.
그리고 상태 대시보드에서 스택 배포 모니터링, 편집, 문제 해결 기능을 제공

 

Git Sync의 장점

  1. 지속적 배포: Git 저장소에 대한 모든 커밋 또는 풀 요청 시 인프라 변경 사항 배포를 자동화
  2. 협업 및 버전 제어: 인프라 관리를 Git을 통해 하므로 협업 및 버전 제거가 용의
  3. 간소화된 인프라 관리: 인프라 업데이트를 자동화하고 수동 배포의 부담을 줄인다.

 


 

Git Sync 를 통한 인프라 배포 실습

 

실습 순서

  1. Git 리포지토리 생성 (현재 Github, GitLab, Bitbucket 지원)
  2. 스택을 정의한 CloudfFormation template file 리포지토리에 생성
  3. CloudFormation에 사용할 2가지 역할 생성
  4. 콘솔 인터페이스를 통해 CloudFormation Git Sync 구성
  5.  Git 리포지토리에 AWS가 생성한 pull request 병합

 


 

1. Git 리포지토리 생성

 

각자 사용하는 Git에 맞게 리포지토리 생성

이 단계는 생략하겠습니다.

 


 

2. 리포지토리에 스택을 정의한 CloudFormation template file 생성

생성된 Git 리포지토리에 CloudFormation template file 생성

AWSTemplateFormatVersion: '2010-09-09'
Description: 'CloudFormation template to create a VPC'

Resources:
  GoopangVPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      Tags:
        - Key: Name
          Value: goopang-vpc

 

  • AWSTemplateFormatVersion: 템플릿 형식 버전 지정. 여기서는 2010-09-09 버전을 사용
  • Description: 템플릿에 대한 설명
  • Resources: CloudFormation 스택에 의해 생성될 AWS 리소스를 정의하는 섹션
    • Type: 생성할 리소스의 유형을 지정. 여기서는 VPC를 생성
    • Properties: VPC 리소스의 속성 정의
      • CidrBlock: VPC의 CIDR 블록을 지정. 여기서는 10.0.0.0/16을 사용
      • EnableDnsSupport: DNS 지원 활성화
      • EnableDnsHostnames: DNS 호스트 이름 활성화
      • Tags: 리소스의 태그를 지정. 여기서는 VPC의 이름을 goopang-vpc로 설정

 


 

3. CloudFormation에 사용할 2가지 역할 생성

Cloudformation Git Sync를 사용할 때는 아래 2가지 역할이 필요하다.

  1. AWS Code Connections 서비스가 Git 리포지토리 브랜치의 변화를 감지하고, AWS EventBridge 서비스를 통해 CloudFormation에 스택 업데이트틀 하기 위한 역할
  2. CloudFormation이 스택을 업데이트하며 리소스와 상호작용하기 위한 역할

 

 

첫번째 역할 생성

 

IAM 콘솔 -> roles 탭 -> create role
  1. Trusted entity type에 Custom trust policy 선택
  2. Custom trust policy에 정책 입력 후 next
  3. policy를 선택하지 않고 생성 -> policy의 permissions를 직접 입력해서 생성해주기 위함

전체 정책

더보기
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CfnGitSyncTrustPolicy",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudformation.sync.codeconnections.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

 

생성된 role 상세화면

Create inline policy 선택

 정책 입력 후 생성

전체 정책

더보기
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "SyncToCloudFormation",
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateChangeSet",
                "cloudformation:DeleteChangeSet",
                "cloudformation:DescribeChangeSet",
                "cloudformation:DescribeStackEvents",
                "cloudformation:DescribeStacks",
                "cloudformation:ExecuteChangeSet",
                "cloudformation:GetTemplate",
                "cloudformation:ListChangeSets",
                "cloudformation:ListStacks",
                "cloudformation:ValidateTemplate"
            ],
            "Resource": "*"
        },
        {
            "Sid": "PolicyForManagedRules",
            "Effect": "Allow",
            "Action": [
                "events:PutRule",
                "events:PutTargets"
            ],
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                "events:ManagedBy": ["cloudformation.sync.codeconnections.amazonaws.com"]
                }
            }
        },
        {
            "Sid": "PolicyForDescribingRule",
            "Effect": "Allow",
            "Action": "events:DescribeRule",
            "Resource": "*"
        }
    ]
}

 

 

policy 생성 완료

 


 

두번째 역할 생성

IAM 콘솔 -> roles 탭 -> create role
  • Trusted entity type에 AWS service를 선택
  • Use case에 CloudFormation 선택 후 next
  • policy를 선택하지 않고 생성
    -> policy의 permissions를 직접 입력해서 생성해주기 위함
생성된 role 상세화면

Create inline policy 선택

 

 정책 입력 후 생성

전체 정책

더보기
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStack",
                "cloudformation:DescribeStacks",
                "cloudformation:DeleteStack",
                "cloudformation:UpdateStack",
                "cloudformation:ListStackResources",
                "cloudformation:DescribeStackResources",
                "cloudformation:GetTemplateSummary",
                "cloudformation:ValidateTemplate"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:*"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
      		"Resource": "arn:aws:iam::<account-id>:role/<role-name>"
        }
    ]
}

 

 

 


 

  

4. 콘솔 인터페이스를 통해 CloudFormation Git Sync 구성

 

CloudFormation tamplate 지정 방법 선택

Prepare template - Choose an existing template 선택

Specify template - Sync from Git 선택

 

스택 이름 및 stack depoyment file 생성 방법 선택

Stack deployment file은 CloudFormation에서 생성하도록 설정할 수 있고, 직접 리포지토리에 생성할 수 있다.

CloudFormation에서 생성하도록 하면, 스택 생성 후 연결된 리포지토리에 pull request가 생성된다. -> 이후 확인

 

기존에 연결했던 Git 리포지토리가 있다면 Choose a linked Git repository 선택
처음 연결한다면 Link a Git repository 선택
리포지토리가 생성된 Git의 계정이 AWS에 권한 부여가 안 되어있다면, add a new connection 버튼을 클릭해서 해당 계정에 접근할 수 있는 권한을 AWS에 부여해야한다. 
접근 부여 방법은 아래 더보기 클릭

더보기
add a new connection 을 누르면 이동되는 화면

각자가 사용하는 Git Provider를 선택하고, Connect to [Git Provider] 버튼 클릭

Connect to Github를 누르면 나오는 화면

권한을 부여해주기 위해 Authorize AWS Connector for Github 클릭

마지막으로 연결 설정을 하고 Connect 버튼을 눌러주면 된다.

 
이후 각자에 맞는 Git Provider와 리포지토리 그리고 브랜치를 지정
 
 

CloudFormation이 Deployment file을 생성하도록 했으면, 생성할 파일 이름,
직접 생성을 선택했으면, 생성한 파일 이름을 입력
 

IAM role
여기서 지정되는 role은 CloudFormation이 스택에서 수행되는 모든 작업에 사용되는 권한을 부여
 

Stack failure options - 스택이 실패할 경우 옵션

Behavior on provisioning failure
스택이 실패했을 경우 롤백 동작

  • Roll back all stack resources: 스택의 모든 리소스를 이전 상태로 롤백
  • Preserve successfully provisioned resources: 성공한 리소스의 상태는 유지하고, 실패한 리소스는 이전 안정적인 상태로 롤백,이전 안정적인 상태가 없는 리소스는 다음 스택 작업 시 삭제

Delete newly created resources during a rollback
스택이 실패했을 경우 새로 생성된 리소스를 삭제 정책에 따를지 또는 무관하게 삭제할지 지정

  • Use deletion policy: 각 리소스에 정의된 deletion policy에 따라 유지하거나 삭제
  • Delete all newly created resources: 롤백 시 새로 생성된 리소스에 정의된 deletion policy와 무관하게 모두 삭제

 

 

Advanced options

Stack Policy
모든 리소스는 스택 업데이트 동안 업데이트될 수 있는데, 이때 특정 리소스가 의도치 않게 업데이트되는 것을 방지하기 위해 사용
JSON 형식으로 Stack Policy를 작성

  • 예시 정책
    모든 리소스에 대한 업데이트를 방지하는 정책
{
  "Statement": [
    {
      "Effect": "Deny",
      "Action": "Update:*",
      "Principal": "*",
      "Resource": "*"
    }
  ]
}

 

Rollback Configuration
스택 생성 및 업데이트 중 CloudFormation이 스택의 상태를 모니터링하고, 지정된 알람 임계값을 초과하면 해당 작업을 롤백하도록 설정, CloudWatch 알람을 지정하여 모니터링

Notification Options
Amazon SNS 주제를 지정하여 스택 이벤트에 대한 알림 발신

Stack Creation Options

  • Timeout: 스택 생성 작업에 할당할 최대 시간을 지정하는 옵션, 지정된 시간 내에 스택이 생성되지 않으면 스택 생성 작업이 시간 초과로 실패하고 롤백기본적으로 스택 생성에 시간 제한은 없음
  • Termination protection: 스텍을 실수로 삭제하는 것을 방지하는 설정

 
 

 
모든 설정을 마친 후 생성을 하면, git sync 탭에 provisioning status가 Failed로 표시되어있다.
이유는 Git Sync가 연결된 Git 리포지토리의 브런치(여기선 main)에 Stack deployment file이 없기 때문이다.
 
 


 
 
 

5. Git 리포지토리에 AWS가 생성한 pull request 병합

 

연결한 Git 리포지토리로 가보면 pull request가 한건 추가되어있다.
해당 pull request는 Stack deployment file 을 추가하기 위해 권한이 부여된 CloudFormation에서 보낸 요청이다.

 
pull request의 내용:

  • CloudFormation 스택 배포 파일: stack-deployment-file.yaml 파일이 리포지토리에 커밋되었다
  • 자동 업데이트: 이 파일을 사용하여 AWS CloudFormation이 스택을 추적하고 자동으로 업데이트한다. 이 파일은 prac-git-sync 템플릿에 속하는 스택을 찾고, 자동으로 업데이트한다.
  • 변경 내용 적용: 이 변경 사항이 병합되면, AWS CloudFormation이 리포지토리의 변경 내용을 추적하고, 파일에 정의된 스택 및 파라미터를 자동으로 업데이트한다.
  • 검토 권장: 병합 전에 stack-deployment-file.yaml 파일을 검토하여 내용을 확인을 권장한다. 추적 및 동기화는 AWS CloudFormation 콘솔에서 언제든지 비활성화할 수 있다.
  • 작동 방식: stack-deployment-file.yaml 파일에는 Git 리포지토리의 루트부터 CloudFormation 템플릿까지의 경로, 스택의 파라미터 및 태그가 포함되어 있다. 리포지토리에 변경 사항이 커밋되면, CloudFormation이 자동으로 스택과 해당 파라미터, 태그를 업데이트한다.
  • 업데이트 방법: stack-deployment-file.yaml 파일을 편집하고 변경 사항을 리포지토리에 커밋한다.

 

병합이 된 main 브랜치

내용을 확인했으면 병합해준다.
 

병합이 정상적으로 됐으면, CloudFormation이 변경 사항을 트리거하여 업데이트를 진행한다.
 

CloudFormation 콘솔의 Resources탭에 생성 완료로 표시된 GoopangVPC
CloudFormation으로 인해 생성된 goopang-vpc

 
CloudFormation template의 내용대로 정상적으로 생성이 되었다.
 

삭제를 하려면 콘솔에서 Delete 버튼을 눌러주기만 하면 된다.
그러면 생성된 모든 리소스와 함께 스택이 삭제된다.