☁️
AWS CloudFormation, Cloud Development Kit(CDK), IaC
July 17, 2024
AWS CloudFormation, Cloud Development Kit(CDK)
Infrastructure as Code (IaC)
IaC(Infrastructure as Code)는 인프라를 코드로 정의하고 관리하는 방법론이다. 이를 통해 인프라를 일관되게 배포하고 관리할 수 있으며, 버전 관리와 협업이 용이하다.
주요 특징
- 일관성: 코드로 정의된 인프라는 일관되게 배포된다.
- 재사용성: 코드로 작성된 인프라는 여러 환경에서 재사용할 수 있다.
- 버전 관리: 인프라 코드도 애플리케이션 코드와 같이 버전 관리가 가능하다.
- 자동화: 인프라 배포와 관리를 자동화하여 효율성을 높일 수 있다.
AWS CloudFormation
CloudFormation은 AWS 인프라의 모든 리소스를 선언적으로 정의할 수 있는 서비스다. 코드로 인프라를 정의하여 자동으로 리소스를 생성하고 관리할 수 있다.
주요 특징
- 선언적 프로그래밍: 필요한 리소스를 선언적으로 정의하면 CloudFormation이 자동으로 생성해준다.
- 모든 인프라 코드화: 인프라를 코드로 관리하여 일관성과 재사용성을 보장한다.
- 비용 절감: 스택 내 리소스의 비용을 쉽게 추정하고 관리할 수 있다.
- 생산성 향상: 인프라를 즉시 생성하고 삭제할 수 있어 생산성이 높아진다.
사용 사례
- 보안 그룹과 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 템플릿으로 컴파일된다.
주요 특징
- 프로그래밍 언어 지원: 익숙한 프로그래밍 언어로 인프라를 정의할 수 있다.
- 형식 안정성: 프로그래밍 언어의 형식 안정성을 통해 오류를 줄일 수 있다.
- 코드 재사용: 코드의 재사용성과 모듈화를 통해 생산성을 높일 수 있다.
- 자동 컴파일: 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뿐만 아니라 다양한 클라우드 제공업체에서 인프라를 코드로 관리할 수 있다.
주요 특징
- 멀티 클라우드 지원: AWS, Azure, Google Cloud 등 다양한 클라우드 제공업체를 지원한다.
- 상태 관리: Terraform은 인프라 상태를 관리하여 변경 사항을 추적하고 적용한다.
- 모듈화: 코드의 모듈화를 통해 재사용성과 가독성을 높일 수 있다.
- 커뮤니티 지원: 다양한 커뮤니티 모듈과 플러그인을 제공한다.
사용 사례
- 멀티 클라우드 인프라 관리: 여러 클라우드 제공업체에 걸쳐 있는 인프라를 통합 관리.
- 복잡한 인프라 구성: 다양한 리소스를 포함한 복잡한 인프라 스택을 정의하고 배포.
사용 예시: 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"
}
}