Pulumi 시작하기(1) - Introduction
Pulumi 시작하기(2) - 코드 작성 및 배포
Pulumi 시작하기(3) - API Gateway v2 + Lambda 예제
Pulumi 시작하기(4) - S3와 Lambda를 이용한 썸네일 추출기
Pulumi란?
Pulumi는 모던 Infrastructure as Code (IaC) "플랫폼"이다. 플랫폼이라고 부르는 이유는 Pulumi SDK 뿐만 아니라 웹 대시보드와 같은 부가적인 기능이 서비스의 주축을 이루고 있기 때문이다.
Pulumi가 요즘 뜨고 있는 이유는 바로 다양한 프로그래밍 언어를 가지고 바로 IaC 구현이 가능하다는 점 때문이다. Terraform과 같이 Terraform 전용 언어를 사용해지 않아도 되기 때문이다. 현재 Pulumi에서 지원하는 언어는 다음과 같다.
- TypeScript
- JavaScript
- Python
- Go
- .NET
IaC에서 중요한 점은 클라우드 플랫폼에 대한 지원 여부와 확장성인데, Pulumi는 다음과 같은 플랫폼을 지원하고 있다.
- AWS
- Google Cloud Platform (GCP)
- Azure
- Kubernetes
K8s가 최근 플랫폼으로 급격히 성장하고 있어서 Pulumi에서 K8s가 지원되는 점은 정말 큰 장점으로 작용할 것 같다는 생각이 든다.
Pulumi 프로젝트의 구성
Pulumi는 폴더 단위의 프로젝트로 구성돼 있다. aws-python
템플릿의 경우, 기본적인 폴더의 구조는 다음과 같다.
.
├── Pulumi.dev.yaml
├── Pulumi.yaml
├── __main__.py
├── requirements.txt
└── venv
Pulumi.yaml
: 프로젝트 정의
name: test
runtime: python
description: A minimal AWS Python Pulumi program
Pulumi.{stack_name}.yaml
: 스택 정의. 각 스택마다 서로 다른 정의를 사용할 수 있다.
config:
aws:region: us-east-1
config
를 코드에서 사용하려면 다음과 같다.
config = pulumi.Config();
name = config.require('name');
lucky = config.get_int('lucky') or 42
print(f'Hello, {name} -- I see your lucky number is {lucky}!')
__main__.py
: 스택 리소스 정의
"""An AWS Python Pulumi program"""
import pulumi
from pulumi_aws import s3
# Create an AWS resource (S3 Bucket)
bucket = s3.Bucket('my-bucket')
# Export the name of the bucket
pulumi.export('bucket_name', bucket.id)
프로젝트
깃허브 레포와 비슷한 개념으로, 소스코드와 메타데이터를 모아놓은 디렉터리다.
프로그램
프로그래밍 언어로 작성되는 클라우드 인프라의 구조이다. 리소스 객체를 인프라에 할당해서 사용한다. 프로그램 작성이 끝나면 Pulumi CLI를 사용해 인프라를 비교하고 배포할 수 있다. 이 명령어를 통해 격리된 환경인 스택(Stack)이 생성된다.
스택
프로젝트의 인스턴스와 같은 개념으로 서로 분리된 구성을 가지고 있다. 예를 들어, 프로젝트 foo
는 서로 다른 개발 환경을 가지고 있는 dev
, test
, prod
와 같은 스택을 가지고 있을 수 있다. 이것은 서로 다른 클라우드 공급자(AWS, GCP, Azure 등)로 구성되거나 리전(region)이 다른 경우도 포함된다.
예시
다음 예시에서는 t2.micro
크기의 EC2 인스턴스를 생성하는 방법을 소개한다. 인스턴스를 생성하기 위해서는 Security group이 필요한데, 여기서는 web-sg
라는 이름으로 생성했다.
import pulumi
import pulumi_aws as aws
group = aws.ec2.SecurityGroup('web-sg',
description='Enable HTTP access',
ingress=[
{ 'protocol': 'tcp', 'from_port': 80, 'to_port': 80, 'cidr_blocks': ['0.0.0.0/0'] }
])
server = aws.ec2.Instance('web-server',
ami='ami-6869aa05',
instance_type='t2.micro',
vpc_security_group_ids=[group.name] # reference the security group resource above
)
pulumi.export('public_ip', server.public_ip)
pulumi.export('public_dns', server.public_dns)
코드에서도 알 수 있듯이, 생성된 group
과 server
객체는 다른 서비스와의 의존성(dependency)를 모두 가지고 있다.
만일 CLI에서 인프라의 특정 정보를 보고 싶다면 해당 정보를 pulumi.export
를 통해 output으로 설정해 주어야 한다. 이렇게 설정한 값은 CLI에서 pulumi stack output
에서 볼 수 있다.