IaC/Infrastructure Provisioning

2. Pulumi 활용

Somaz 2023. 10. 4. 21:12
728x90
반응형

Overview

지난 시간에 Pulumi에 대해서 알아보았다. 이번에는 활용을 해보려고 한다.

2023.09.13 - [IaC/Infrastructure Provisioning] - 1. Pulumi란?

 

1. Pulumi란?

Overview 오늘은 pulumi에 대해서 공부해보려고 한다. Pulumi란? pulumi는 프로그래밍 언어를 사용하여 인프라 코드를 작성한다. IDE를 사용하여 인프라를 정의하는 문장을 자동 완성도 할 수 있다. 그리

somaz.tistory.com

출처 : https://www.pulumi.com/product/pulumi-deployments/

 

이번에 공부해볼 내용은 아래와 같다.

  • Pulumi state 관리
  • Pulumi resource file을 잃어버렸을때 state 삭제 방법
  • Pulumi VPC , GCE 배포
  • Github에서 Pulumi 소스 코드를 가져와 사용하는 방법

 

그리고 모든 실습은 GCP를 활용해서 진행할 예정이다. 언어는 Python을 사용한다.

 


 

Pulumi State 관리

Pulumi는 스택이라는 개념을 사용하여 인프라 상태를 관리한다.

각 스택은 개발, 스테이징 또는 프로덕션과 같은 다양한 환경에 대응할 수 있는 별도의 버전이 지정된 인프라 인스턴스이다. 상태는 모든 관리 리소스와 해당 속성의 현재 버전을 기록하는 직렬화된 형식으로 저장된다.

백엔드 스토리지: 상태는 선택한 백엔드에 저장된다. Pulumi는 여러 백엔드 옵션을 지원한다.

  • Pulumi 서비스(기본=Pulumi Cloud): Pulumi에서 제공하는 무료 관리형 서비스이다. 이는 기본 백엔드이며 대부분의 사용자, 특히 Pulumi를 처음 시작하는 사용자에게 권장된다.
  • 자체 관리형 개체 스토리지: 여기에는 AWS S3, Google Cloud Storage, Azure Blob Storage 등과 같은 클라우드 스토리지 솔루션이 포함된다.

Pulumi Cloud 화면

 


 

Pulumi State 관리 실습

 

아래의 소스코드를 참고하길 바란다.

 

 

Project 실행

pulumi new gcp-python
This command will walk you through creating a new Pulumi project.

Enter a value or leave blank to accept the (default), and press <ENTER>.
Press ^C at any time to quit.

project name (managed-gcs-state):
project description (A minimal Google Cloud Python Pulumi program): Pulumi state is managed by GCS
Created project 'managed-gcs-state'

Please enter your desired stack name.
To create a stack in an organization, use the format <org-name>/<stack-name> (e.g. `acmecorp/dev`).
stack name (dev): somaz
Created stack 'somaz'

gcp:project: The Google Cloud project to deploy into: somaz
Saved config

Pulumi Cloud 생성 확인
Pulumi Cloud 에서 친절하게 알려준다.

 

 

Stack 작성후 배포 

  • Pulumi State backend로 사용할 bucket을 배포한다.
cat __main__.py

"""A Google Cloud Python Pulumi program"""

import pulumi
from pulumi_gcp import storage

# Create a GCP resource (Storage Bucket) with uniform access control, explicit name, and versioning
bucket = storage.Bucket('somaz-state-resource',
                        name="somaz-state",  # This sets the exact name of the bucket
                        location="asia-northeast3",
                        uniform_bucket_level_access=True,  # Enable uniform bucket-level access
                        versioning=storage.BucketVersioningArgs(enabled=True))  # Enable bucket versioning

# Export the DNS name of the bucket
pulumi.export('bucket_name', bucket.url)

 

pulumi up
Previewing update (somaz)

View in Browser (Ctrl+O): https://app.pulumi.com/somaz94/managed-gcs-state/somaz/previews/fa4fa586-d632-4e6d-ace5-c7df1d9f163b

     Type                   Name                     Plan
 +   pulumi:pulumi:Stack    managed-gcs-state-somaz  create
 +   └─ gcp:storage:Bucket  somaz-state-resource     create
...
Outputs:
    bucket_name: "gs://somaz-state"

Resources:
    + 2 created

Duration: 6s

gsutil ls
gs://somaz-state/

 

State Migration 진행 후 확인

pulumi login gs://somaz-state
Logged in to AD01769994 as somaz (gs://somaz-state)

pulumi whoami -v
User: somaz
Organizations:
Backend URL: gs://somaz-state

gsutil ls gs://somaz-state/.pulumi
gs://somaz-state/.pulumi/meta.yaml
gs://somaz-state/.pulumi/backups/
gs://somaz-state/.pulumi/history/
gs://somaz-state/.pulumi/stacks/

 

Backend Bucket 리소스 분리 후 새로운 GCS Bucket 생성

  • 이렇게 하면 GCS Backend Bucket에 리소스 State가 관리되는 걸 확인할 수 있다.
cp __main__.py __main__.py.backend_state

cat __main__.py
"""A Google Cloud Python Pulumi program"""

import pulumi
from pulumi_gcp import storage

# Create a GCP resource (Storage Bucket) with uniform access control, explicit name, and versioning
bucket = storage.Bucket('somaz-bucket-resource',
                        name="somaz-bucket",  # This sets the exact name of the bucket
                        location="asia-northeast3",
                        uniform_bucket_level_access=True,  # Enable uniform bucket-level access
                        versioning=storage.BucketVersioningArgs(enabled=True))  # Enable bucket versioning

# Export the DNS name of the bucket
pulumi.export('bucket_name', bucket.url)

 


Tip.  GCS Backend Bucket → Pulumi Cloud

GCS Backend Bucket 에서 Pulumi Cloud로 다시 변경하는 방법은 아래와 같다.

# Backup current state
pulumi stack export > backup.json

# Login to Pulumi Cloud
pulumi login --cloud-url https://api.pulumi.com

# Import the saved state to Pulumi Cloud
export PULUMI_CONFIG_PASSPHRASE=<your password>

export PULUMI_CONFIG_PASSPHRASE=somaz@2023
pulumi stack import < backup.json

# Ensure Resources are Migrated
pulumi stack
Current stack is somaz:
    Owner: somaz94
    Last updated: 5 minutes ago (2023-09-12 14:07:59.723816088 +0900 KST)
    Pulumi version used: v3.81.0
Current stack resources (0):
    No resources currently in this stack

More information at: https://app.pulumi.com/somaz94/managed-gcs-state/somaz

Use `pulumi stack select` to change stack; `pulumi stack ls` lists known ones

pulumi whoami -v
User: somaz94
Organizations: somaz94
Backend URL: https://app.pulumi.com/somaz94

# Destroy Resources
pulumi destroy

# Delete the Stack
pulumi stack rm

pulumi stack rm somaz
This will permanently remove the 'somaz' stack!
Please confirm that this is what you'd like to do by typing `somaz`: somaz
Stack 'somaz' has been removed!

# Manual Cleanup of GCS Bucket
gsutil rm -r gs://somaz-state

 


 

Pulumi resource file을 잃어버렸을때 state 삭제 방법

아래의 방법으로 강제로 삭제해주면 된다!

pulumi login --cloud-url https://api.pulumi.com
Logged in to pulumi.com as somaz94 (https://app.pulumi.com/somaz94)

pulumi stack ls --all
NAME                             LAST UPDATE     RESOURCE COUNT  URL
somaz94/managed-gcs-state/somaz  22 minutes ago  3               https://app.pulumi.com/somaz94/managed-gcs-state/somaz

pulumi stack rm --force -s somaz94/managed-gcs-state/somaz
This will permanently remove the 'somaz94/managed-gcs-state/somaz' stack!
Please confirm that this is what you'd like to do by typing `somaz94/managed-gcs-state/somaz`: somaz94/managed-gcs-state/somaz
Stack 'somaz94/managed-gcs-state/somaz' has been removed!

확인 완료!

 


Pulumi VPC , GCE 배포

vpc-gce-gcs 프로젝트는 backend-setup과 main-infra라는 두 가지 기본 스택으로 구성된다. 

 

파일 구조

vpc-gce-gcs/
├── Pulumi.yaml
├── README.md
├── __main__.py
├── __main__function.py.bak
├── backend-setup.json
├── bucket_backend.py
├── compute_engine.py
├── compute_engine_function.py.bak
├── config.py
├── requirements.txt
├── utils.py
├── utils_function.py.bak
├── vpc.py
└── vpc_funtion.py.bak

 

전제 조건

pulumi 및 gsutil이 설치되어 있고 필수 클라우드 제공업체를 통해 인증되었는지 확인한다.

 


 

1. backend-setup Stack

 

초기화

 

GCP 프로젝트를 구성한다.

pulumi config set gcp:project <YOUR_GCP_PROJECT_ID>

 

백엔트 설정 스택을 초기화한다.

pulumi stack init backend-setup

 

스택을 확인한다.

pulumi stack ls

 

백엔드 설정

 

백엔드 버킷을 생성하려면 `main.py`에서 다음 Python 코드를 사용한다.

import pulumi
from pulumi_gcp import storage
from bucket_backend import create_backend_bucket

# Call the function
create_backend_bucket()

 

변경사항을 적용한다.

pulumi up

 

Pulumi Cloud → GCS Backend Bucket

 

Pulumi 백엔드를 GCS bucket으로 변경한다.

# Change Pulumi backend to the GCS bucket
pulumi login gs://somaz-state

# Re-initialize the stack and protect your config/secrets
pulumi stack init backend-setup

# Import the stack
pulumi stack import --file=backend-setup.json

# To delete the stack resources on Pulumi cloud, do the following
pulumi login --cloud-url https://api.pulumi.com
pulumi stack rm --force backend-setup

 


 

2. main-infra Stack

 

초기화

 

GCS 버킷에 로그인한다.

pulumi login gs://somaz-state

 

main-infra 스택을 초기화하고 구성/비밀을 보호한다.

pulumi stack init main-infra

 

 

main-infra 스택을 선택한 후 프로젝트 변수를 설정한다.

pulumi stack select main-infra

pulumi config set gcp:project <YOUR_GCP_PROJECT_ID>

 

인프라 구축

 

변경 사항을 적용한다.

pulumi up

 

생성된 인스턴스에 SSH를 통해 연결할 수 있다.

ssh -i ~/.ssh/id_rsa_somaz94 somaz@<INSTANCE_IP>
  • `ex) ssh -i ~/.ssh/id_rsa_somaz94 somaz@34.64.93.60`

 

 

Cleanup

 

배포된 리소스를 삭제한다.

pulumi destroy

 

스택을 확인하고 제거한다.

pulumi stack ls
pulumi stack rm main-infra --force

 

마지막으로 GCS bucket을 삭제한다.

gsutil rm -r gs://somaz-state/

 


 

Github와 같은 코드 저장소에서 Pulumi 소스 코드를 가져와 사용하는 방법

 

 

Git Clone

git clone git@github.com-somaz94:somaz94/pulumi-study.git

cd pulumi-study/gcp/vpc-gce-gcs

pulumi login
Logged in to pulumi.com as somaz94 (https://app.pulumi.com/somaz94)

 

Stack 초기화 후 확인

pulumi stack init vpc-gce-gcs
Created stack 'vpc-gce-gcs'

pulumi stack ls
NAME    LAST UPDATE  RESOURCE COUNT  URL
somaz*  n/a          n/a             https://app.pulumi.com/somaz94/vpc-gce-gcs/somaz

pulumi config set gcp:project somaz

 

Pulumi Stack 배포

pulumi up
Previewing update (somaz)

View in Browser (Ctrl+O): https://app.pulumi.com/somaz94/vpc-gce-gcs/somaz/previews/ee4f512b-6bf5-4e51-bd10-cd50c9e87010

     Type                          Name               Plan
 +   pulumi:pulumi:Stack           vpc-gce-gcs-somaz  create
 +   ├─ gcp:compute:GlobalAddress  somaz-igw          create
 +   ├─ gcp:compute:Network        somaz-vpc          create
 +   ├─ gcp:compute:Address        somaz-bastion-ip   create
 +   ├─ gcp:compute:Subnetwork     somaz-subnet       create
 +   ├─ gcp:compute:Firewall       somaz-allow-ssh    create
 +   └─ gcp:compute:Instance       somaz-instance     create


Outputs:
    igw_name            : "somaz-igw"
    instance_external_ip: output<string>
    instance_name       : "somaz-instance"
    subnet_name         : "somaz-subnet"
    vpc_name            : "somaz-vpc"

Resources:
    + 7 to create

Do you want to perform this update? yes
Updating (somaz)

View in Browser (Ctrl+O): https://app.pulumi.com/somaz94/vpc-gce-gcs/somaz/updates/1

     Type                          Name               Status
 +   pulumi:pulumi:Stack           vpc-gce-gcs-somaz  created (56s)
 +   ├─ gcp:compute:GlobalAddress  somaz-igw          created (13s)
 +   ├─ gcp:compute:Network        somaz-vpc          created (13s)
 +   ├─ gcp:compute:Address        somaz-bastion-ip   created (2s)
 +   ├─ gcp:compute:Subnetwork     somaz-subnet       created (24s)
 +   ├─ gcp:compute:Firewall       somaz-allow-ssh    created (12s)
 +   └─ gcp:compute:Instance       somaz-instance     created (14s)


Outputs:
    igw_name            : "somaz-igw"
    instance_external_ip: "34.64.254.109"
    instance_name       : "somaz-instance"
    subnet_name         : "somaz-subnet"
    vpc_name            : "somaz-vpc"

Resources:
    + 7 created

Duration: 58s

 


Reference

https://www.pulumi.com/docs/concepts/state/

https://github.com/somaz94/pulumi-study

728x90
반응형