AWS CloudFormation, Cloud Development Kit(CDK)

../main.png

Infrastructure as Code (IaC)

IaC(Infrastructure as Code)는 인프라를 코드로 정의하고 관리하는 방법론이다. 이를 통해 인프라를 일관되게 배포하고 관리할 수 있으며, 버전 관리와 협업이 용이하다.

주요 특징

  1. 일관성: 코드로 정의된 인프라는 일관되게 배포된다.
  2. 재사용성: 코드로 작성된 인프라는 여러 환경에서 재사용할 수 있다.
  3. 버전 관리: 인프라 코드도 애플리케이션 코드와 같이 버전 관리가 가능하다.
  4. 자동화: 인프라 배포와 관리를 자동화하여 효율성을 높일 수 있다.

AWS CloudFormation

CloudFormation은 AWS 인프라의 모든 리소스를 선언적으로 정의할 수 있는 서비스다. 코드로 인프라를 정의하여 자동으로 리소스를 생성하고 관리할 수 있다.

주요 특징

  1. 선언적 프로그래밍: 필요한 리소스를 선언적으로 정의하면 CloudFormation이 자동으로 생성해준다.
  2. 모든 인프라 코드화: 인프라를 코드로 관리하여 일관성과 재사용성을 보장한다.
  3. 비용 절감: 스택 내 리소스의 비용을 쉽게 추정하고 관리할 수 있다.
  4. 생산성 향상: 인프라를 즉시 생성하고 삭제할 수 있어 생산성이 높아진다.

사용 사례

  • 보안 그룹과 EC2 인스턴스 구성: 보안 그룹을 정의하고, 이를 사용하는 여러 EC2 인스턴스를 생성.
  • 웹 애플리케이션 배포: 로드 밸런서, EC2 인스턴스, 데이터베이스 등을 포함한 전체 웹 애플리케이션 스택을 배포.

사용 예시: S3 버킷과 EC2 인스턴스 생성

아래는 CloudFormation을 사용하여 S3 버킷과 EC2 인스턴스를 생성하는 예시 템플릿이다.

AWSTemplateFormatVersion: '2010-09-09'
Resources:
  MyS3Bucket:
    Type: 'AWS::S3::Bucket'
    Properties:
      BucketName: 'my-cloudformation-bucket'
  
  MyEC2Instance:
    Type: 'AWS::EC2::Instance'
    Properties:
      InstanceType: 't2.micro'
      ImageId: 'ami-0c55b159cbfafe1f0'
      KeyName: 'my-key-pair'
      SecurityGroups:
        - !Ref MySecurityGroup

  MySecurityGroup:
    Type: 'AWS::EC2::SecurityGroup'
    Properties:
      GroupDescription: 'Allow SSH access'
      SecurityGroupIngress:
        - IpProtocol: 'tcp'
          FromPort: '22'
          ToPort: '22'
          CidrIp: '0.0.0.0/0'

AWS Cloud Development Kit (CDK)

AWS CDK는 익숙한 프로그래밍 언어로 클라우드 인프라를 정의할 수 있게 해준다. JavaScript, TypeScript, Python, Java, .NET 등 다양한 언어를 지원하며, 코드로 인프라를 작성하여 CloudFormation 템플릿으로 컴파일된다.

주요 특징

  1. 프로그래밍 언어 지원: 익숙한 프로그래밍 언어로 인프라를 정의할 수 있다.
  2. 형식 안정성: 프로그래밍 언어의 형식 안정성을 통해 오류를 줄일 수 있다.
  3. 코드 재사용: 코드의 재사용성과 모듈화를 통해 생산성을 높일 수 있다.
  4. 자동 컴파일: CDK 코드가 CloudFormation 템플릿으로 자동 컴파일되어 배포된다.

사용 사례

  • Lambda 함수와 DynamoDB 테이블 정의: Python으로 작성된 CDK 애플리케이션에서 Lambda 함수와 DynamoDB 테이블을 정의하고 배포.
  • ECS 클러스터와 ALB 구성: JavaScript 또는 TypeScript로 VPC, ECS 클러스터, ALB를 정의하여 Fargate 서비스로 배포.

사용 예시: S3 버킷과 Lambda 함수 생성

from aws_cdk import (
    aws_s3 as s3,
    aws_lambda as _lambda,
    core,
)

class MyStack(core.Stack):

    def __init__(self, scope: core.Construct, id: str, **kwargs) -> None:
        super().__init__(scope, id, **kwargs)

        # S3 Bucket
        bucket = s3.Bucket(self, 
            "MyBucket",
            bucket_name="my-cdk-bucket"
        )

        # Lambda Function
        function = _lambda.Function(self, 
            "MyFunction",
            runtime=_lambda.Runtime.PYTHON_3_8,
            handler="index.handler",
            code=_lambda.Code.from_asset("lambda")
        )

app = core.App()
MyStack(app, "MyStack")
app.synth()

번외: Terraform

Terraform은 HashiCorp에서 개발한 IaC 도구로, AWS뿐만 아니라 다양한 클라우드 제공업체에서 인프라를 코드로 관리할 수 있다.

주요 특징

  1. 멀티 클라우드 지원: AWS, Azure, Google Cloud 등 다양한 클라우드 제공업체를 지원한다.
  2. 상태 관리: Terraform은 인프라 상태를 관리하여 변경 사항을 추적하고 적용한다.
  3. 모듈화: 코드의 모듈화를 통해 재사용성과 가독성을 높일 수 있다.
  4. 커뮤니티 지원: 다양한 커뮤니티 모듈과 플러그인을 제공한다.

사용 사례

  • 멀티 클라우드 인프라 관리: 여러 클라우드 제공업체에 걸쳐 있는 인프라를 통합 관리.
  • 복잡한 인프라 구성: 다양한 리소스를 포함한 복잡한 인프라 스택을 정의하고 배포.

사용 예시: S3 버킷과 EC2 인스턴스 생성

provider "aws" {
  region = "us-west-2"
}

resource "aws_s3_bucket" "my_bucket" {
  bucket = "my-terraform-bucket"
}

resource "aws_instance" "my_instance" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
  key_name      = "my-key-pair"

  tags = {
    Name = "MyInstance"
  }
}