Overview
지난 시간에 Pulumi에 대해서 알아보았다. 이번에는 활용을 해보려고 한다.
2023.09.13 - [IaC/Infrastructure Provisioning] - 1. Pulumi란?
이번에 공부해볼 내용은 아래와 같다.
- 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 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
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
'IaC > Infrastructure Provisioning' 카테고리의 다른 글
1. Pulumi란? (0) | 2023.09.13 |
---|---|
Terraformer란? (0) | 2023.05.04 |
5. Terraform의 다양한 Expression (0) | 2023.04.13 |
4. Terraform의 다양한 Function(함수) (0) | 2023.04.11 |
3. Terraform 다양한 변수(variable, local, data...output, input) - AWS (0) | 2023.04.09 |