인프라스트럭처 코드란 무엇인가

SST는 여러분의 인프라스트럭처 코드를 클라우드 프로바이더에 대한 일련의 API 호출로 변환합니다. 내부적으로는 PulumiTerraform을 사용하며, 이에 대해서는 아래에서 더 자세히 설명합니다. SST 설정은 프로젝트의 일부로 생성하려는 인프라스트럭처를 설명하는 것입니다. 여기서는 Lambda 함수, API Gateway 엔드포인트, DynamoDB 테이블, S3 버킷 등을 정의할 것입니다.

AWS 콘솔을 사용해 이 설정을 할 수 있지만, 많은 클릭이 필요합니다. 인프라스트럭처를 프로그래밍 방식으로 설정하는 것이 훨씬 더 좋습니다.

이 일반적인 패턴을 인프라스트럭처 코드라고 하며, 몇 가지 큰 이점이 있습니다. 첫째, 전체 프로세스를 완전히 자동화할 수 있습니다. 앱 전체를 생성하려면 설정 파일과 CLI만 있으면 됩니다. 둘째, 수동으로 작업하는 것보다 오류가 발생할 가능성이 적습니다.

또한, 전체 인프라스트럭처를 코드로 설명하면 여러 환경을 쉽게 생성할 수 있습니다. 예를 들어, 작업 중에 모든 변경 사항을 만들고 테스트할 수 있는 개발 환경을 생성할 수 있습니다. 그리고 이를 사용자가 상호작용하는 프로덕션 환경과 분리해 유지할 수 있습니다.

Terraform

Terraform은 모든 클라우드 프로바이더를 위한 _프로바이더_를 관리하는 대형 오픈 소스 프로젝트입니다. 각 프로바이더는 클라우드 프로바이더가 제공하는 거의 모든 것을 정의할 수 있는 리소스를 포함하고 있습니다.

Terraform은 리소스를 정의하기 위해 HCL이라는 것을 사용합니다. 예를 들어, DynamoDB 테이블의 Terraform 정의는 다음과 같습니다.

resource "aws_dynamodb_table" "example" {
  name         = "example-table"
  billing_mode = "PAY_PER_REQUEST"

  attribute {
    name = "id"
    type = "S"
  }

  attribute {
    name = "sort_key"
    type = "N"
  }

  hash_key = "id"
  range_key = "sort_key"

  tags = {
    Name        = "example-table"
    Environment = "production"
  }
}

Pulumi

위에서 설명한 정의의 문제점 중 하나는 복잡한 애플리케이션을 다룰 때 정의가 매우 커진다는 것입니다.

HCL(또는 YAML, JSON)은 시작하기 쉽지만, 재사용하거나 합성하기는 어려울 수 있습니다. 이를 해결하기 위해 Pulumi는 이러한 프로바이더를 TypeScript(및 다른 프로그래밍 언어)로 변환합니다.

따라서 Pulumi에서 동일한 DynamoDB는 다음과 같이 표현됩니다.

import * as aws from "@pulumi/aws";

const table = new aws.dynamodb.Table("exampleTable", {
  attributes: [
    { name: "id", type: "S" },
    { name: "sort_key", type: "N" },
  ],
  hashKey: "id",
  rangeKey: "sort_key",
  billingMode: "PAY_PER_REQUEST",
  tags: {
    Name: "example-table",
    Environment: "production",
  },
});

전통적인 IaC의 문제점

전통적인 IaC(Infrastructure as Code)는 Terraform이나 Pulumi와 같은 도구에서 볼 수 있듯이, 저수준 리소스로 구성됩니다. 이로 인해 몇 가지 문제가 발생합니다:

  1. 각 저수준 리소스가 어떻게 동작하는지 이해해야 합니다. 리소스의 속성이 어떤 역할을 하는지 알아야 합니다.
  2. 이러한 저수준 리소스가 많이 필요합니다. 예를 들어, AWS에 Next.js 앱을 배포하려면 약 70개의 저수준 리소스가 필요합니다.

이로 인해 대부분의 개발자에게 IaC는 매우 부담스러운 도구가 됩니다. 간단한 CRUD 앱을 배포하는 데에도 매우 구체적인 AWS 지식이 필요하기 때문입니다. 결과적으로, IaC는 전통적으로 DevOps나 플랫폼 엔지니어만 사용해 왔습니다.

또한, 전통적인 IaC 도구는 로컬 개발을 지원하지 않습니다. 이 도구들은 인프라를 정의하고 배포하는 방법에만 초점을 맞추고 있습니다.

이 문제를 해결하기 위해 SST를 만들었습니다. SST는 이러한 리소스를 감싸는 고수준 컴포넌트를 제공하며, 합리적인 기본값을 설정해 줍니다. 따라서 Next.js 앱을 만드는 것은 다음과 같이 간단합니다.

new sst.aws.Nextjs("MyWeb");

또한, sst dev 커맨드를 통해 완전한 로컬 개발 환경을 제공합니다.

IaC 작업하기

이전에 IaC를 사용해 본 적이 없다면 처음에는 익숙하지 않을 수 있습니다. 하지만 몇 가지를 기억한다면 문제없이 사용할 수 있습니다.

  1. SST는 여러분의 앱에 정의된 AWS 리소스를 자동으로 관리합니다.
  2. AWS 콘솔에서 수동으로 변경할 필요가 없습니다.

SST 워크플로우에 대해 더 알아볼 수 있습니다.

이제 첫 번째 SST 앱을 만들 준비가 되었습니다.