Skip to Content
문서서버클라우드 초기화

클라우드 초기화

cloud-init는 클라우드 인스턴스 초기화를 위한 업계 표준 도구로, 처음 부팅할 때 시스템 구성을 자동으로 완료합니다. Ubuntu 26.04 Server는 cloud-init가 사전 설치되어 제공되며 AWS, Azure, GCP 등과 같은 주요 클라우드 플랫폼을 지원합니다.

작동 방식

cloud-init는 인스턴스 시작 중에 다음 단계를 통해 실행됩니다.

  1. 생성기 - 인스턴스가 클라우드 환경에서 실행 중인지 감지합니다.
  2. 로컬 - 로컬 데이터 소스에서 네트워크 구성을 가져옵니다.
  3. 네트워크 - 메타데이터 및 사용자 데이터를 가져옵니다.
  4. 구성 - 구성 모듈을 실행합니다.
  5. 최종 - 최종 모듈을 실행합니다(예: 스크립트 실행).
# Check cloud-init version cloud-init --version # Check cloud-init status cloud-init status # View detailed status cloud-init status --long

데이터 소스

메타데이터

인스턴스 ID, IP 주소, 호스트 이름 등을 포함하여 클라우드 플랫폼에서 제공하는 인스턴스 메타데이터:

# Retrieve metadata on AWS EC2 (IMDSv2) TOKEN=$(curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600") curl -H "X-aws-ec2-metadata-token: $TOKEN" http://169.254.169.254/latest/meta-data/ # Retrieve metadata on GCP curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/ # Retrieve metadata on Azure curl -H "Metadata: true" "http://169.254.169.254/metadata/instance?api-version=2021-02-01"

사용자 데이터

다양한 형식을 지원하는 사용자 정의 초기화 구성입니다.

사용자 데이터 구성

클라우드 구성 형식(가장 일반적)

#cloud-config으로 시작하는 YAML 파일:

#cloud-config # Set hostname hostname: web-server-01 fqdn: web-server-01.example.com # Create users users: - name: deploy groups: sudo, docker shell: /bin/bash sudo: ALL=(ALL) NOPASSWD:ALL ssh_authorized_keys: - ssh-ed25519 AAAA... deploy@workstation - name: monitor groups: [] shell: /bin/bash ssh_authorized_keys: - ssh-ed25519 AAAA... monitor@management # Set timezone timezone: America/New_York # NTP configuration ntp: enabled: true servers: - pool.ntp.org - time.google.com # Locale locale: en_US.UTF-8 # Change APT mirror apt: primary: - arches: [default] uri: http://archive.ubuntu.com/ubuntu # Install packages packages: - nginx - docker.io - fail2ban - htop - curl - vim # Upgrade all packages package_update: true package_upgrade: true package_reboot_if_required: true # Write files write_files: - path: /etc/nginx/sites-available/default content: | server { listen 80; server_name _; root /var/www/html; index index.html; } owner: root:root permissions: '0644' - path: /etc/sysctl.d/99-custom.conf content: | net.ipv4.ip_forward = 1 net.core.somaxconn = 65535 owner: root:root permissions: '0644' # Run commands (executed during cloud-init config stage) runcmd: - sysctl -p /etc/sysctl.d/99-custom.conf - systemctl enable --now nginx - systemctl enable --now fail2ban - ufw allow ssh - ufw allow 80/tcp - ufw allow 443/tcp - ufw --force enable # Enable/disable SSH password login ssh_pwauth: false # SSH key configuration ssh_keys: ed25519_private: | -----BEGIN OPENSSH PRIVATE KEY----- ... -----END OPENSSH PRIVATE KEY----- ed25519_public: ssh-ed25519 AAAA... # Set passwords (hashed) chpasswd: expire: false users: - name: deploy type: RANDOM # Final message final_message: "Cloud-init complete! Took $UPTIME seconds." # Post-boot action power_state: mode: reboot message: "cloud-init configuration complete, rebooting..." timeout: 30 condition: true

쉘 스크립트 형식

#!/bin/bash으로 시작:

#!/bin/bash set -euxo pipefail # Update the system apt update && apt upgrade -y # Install base tools apt install -y nginx docker.io # Configure the firewall ufw allow ssh ufw allow 80/tcp ufw --force enable # Custom script echo "Setup complete at $(date)" > /var/log/cloud-init-custom.log

다중 부분 형식(MIME 다중 부분)

여러 형식 결합:

# Use the cloud-init tool to create a multi-part message cloud-init devel make-mime \ --attach script.sh:text/x-shellscript \ --attach config.yaml:text/cloud-config \ > combined-userdata.txt

일반적인 사용 사례

Docker 환경 초기화

#cloud-config packages: - docker.io - docker-compose-v2 groups: - docker users: - name: deploy groups: sudo, docker shell: /bin/bash sudo: ALL=(ALL) NOPASSWD:ALL ssh_authorized_keys: - ssh-ed25519 AAAA... write_files: - path: /etc/docker/daemon.json content: | { "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } runcmd: - systemctl enable --now docker - docker pull nginx:alpine

디스크 초기화

#cloud-config disk_setup: /dev/vdb: table_type: gpt layout: true overwrite: false fs_setup: - label: data filesystem: ext4 device: /dev/vdb1 overwrite: false mounts: - ["/dev/vdb1", "/data", "ext4", "defaults,noatime", "0", "2"] runcmd: - mkdir -p /data

클러스터에 가입

#cloud-config runcmd: - curl -sfL https://get.k3s.io | K3S_URL=https://master:6443 K3S_TOKEN=mytoken sh -

로컬 테스트

멀티패스 사용

# Install Multipass sudo snap install multipass # Launch an instance with cloud-config multipass launch 26.04 --name test --cloud-init cloud-config.yaml # Enter the instance multipass shell test # View cloud-init logs multipass exec test -- cat /var/log/cloud-init-output.log

LXD 사용

# Test cloud-init via LXD lxc launch ubuntu:26.04 test --config=user.user-data="$(cat cloud-config.yaml)" lxc exec test -- cloud-init status --wait lxc exec test -- cat /var/log/cloud-init-output.log

로컬에서 구성 검증

# Validate cloud-config syntax cloud-init schema --config-file cloud-config.yaml # Use the devel subcommand for debugging cloud-init devel render /path/to/userdata.yaml

로그 및 디버깅

# Main log file sudo cat /var/log/cloud-init.log # Output log sudo cat /var/log/cloud-init-output.log # View executed modules sudo cat /run/cloud-init/result.json # View user data sudo cat /var/lib/cloud/instance/user-data.txt # View instance data sudo cloud-init query --all # Query specific fields sudo cloud-init query instance_id sudo cloud-init query region sudo cloud-init query local_hostname

cloud-init 다시 실행

# Clear cloud-init state (for testing) sudo cloud-init clean # Clear and reboot to re-execute sudo cloud-init clean --reboot # Clear logs only sudo cloud-init clean --logs # Manually trigger specific stages sudo cloud-init init sudo cloud-init modules --mode config sudo cloud-init modules --mode final

클라우드 초기화 비활성화

클라우드가 아닌 환경에서는 cloud-init를 비활성화할 수 있습니다.

# Method 1: Create a disable marker file sudo touch /etc/cloud/cloud-init.disabled # Method 2: Via GRUB kernel parameter # Add the following to GRUB_CMDLINE_LINUX in /etc/default/grub: # cloud-init=disabled # Method 3: Uninstall sudo apt remove cloud-init -y sudo rm -rf /etc/cloud /var/lib/cloud