IT/가상화

[가상화기술] cloud-init이란? (AWS EC2 UserData)

반응형

Intro

EC2는 AWS의 가상머신(Virtual Machine) 서비스 입니다. 이 EC2가 처음 가동될때 네트워크, SSH, 스토리지 관련 초기 설정을 가능하게 해주는 기능이 EC2의 UserData 입니다.

AWS EC2의 UserData는 cloud-init이라는 오픈소스 솔루션을 사용합니다. 사실 AWS뿐만 아니라 다양한 클라우드 제공자들이 이 cloud-init을 사용하는데요.

오늘은 cloud-init이 무엇인지 자세히 알아보고 어떻게 활용할 수 있는지 알려드리도록 하겠습니다.

cloud-init 이란?

cloud init은 클라우드 인스턴스 초기화를 위한 업계 표준 다중 배포 오픈소스 솔루션입니다. 주요 퍼블릭 클라우드 제공업체, 프라이빗 클라우드 인프라용 프로비즈닝 시스템, 베어메탈 설치에서 사용됩니다.

OS가 부팅될때 제공된 메타데이터를 읽고 그에 따라 시스템을 초기화 할 수 있습니다. 예를 들어 SSH엑세스 키, 네트워크, 스토리지 설정등이 포함될 수 있습니다.

cloud-init 이 지원하는 리눅스 distribution

  • Alpine Linux
  • ArchLinux
  • Debian
  • Fedora
  • FreeBSD
  • Gentoo Linux
  • NetBSD
  • OpenBSD
  • RHEL/CentOS
  • SLES/openSUSE
  • Ubuntu

cloud-init 이 지원하는 Public Cloud

  • Amazon Web Services
  • Microsoft Azure
  • Google Cloud Platform
  • Oracle Cloud Infrastructure
  • Softlayer
  • Rackspace Public Cloud
  • IBM Cloud
  • Digital Ocean
  • Bigstep
  • Hetzner
  • Joyent
  • CloudSigma
  • Alibaba Cloud
  • OVH
  • OpenNebula
  • Exoscale
  • Scaleway
  • CloudStack
  • AltCloud
  • SmartOS

cloud-init은 OS boot 시점에 발생하며, 5 가지의 단계를 거치게 됩니다.

  • Generator
  • Local
  • Network
  • Config
  • Final

인스턴스를 재부팅하면 cloud-init이 /etc/cloud/cloud.cfg의 정보를 읽어들여 5 가지 단계를 거쳐 모듈과 설정 정보들을 실행하여 반영합니다.

저는 EC2를 centOS로 생성하였는데요, cloud.cfg 파일을 확인해보니 아래와 같이 구성이 되어있습니다. (AWS 클라우드 엔지니어 형들이 열일 해주셨네요)

# cat /etc/cloud/cloud.cfg

users:
 - default

disable_root: 1
ssh_pwauth:   1

mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.requires=cloud-init.service', '0', '2']
resize_rootfs_tmp: /dev
ssh_deletekeys:   0
ssh_genkeytypes:  ~
syslog_fix_perms: ~
disable_vmware_customization: false

cloud_init_modules:
 - disk_setup
 - migrator
 - bootcmd
 - write-files
 - growpart
 - resizefs
 - set_hostname
 - update_hostname
 - update_etc_hosts
 - rsyslog
 - users-groups
 - ssh

cloud_config_modules:
 - mounts
 - locale
 - set-passwords
 - rh_subscription
 - yum-add-repo
 - package-update-upgrade-install
 - timezone
 - puppet
 - chef
 - salt-minion
 - mcollective
 - disable-ec2-metadata
 - runcmd

cloud_final_modules:
 - rightscale_userdata
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - ssh-authkey-fingerprints
 - keys-to-console
 - phone-home
 - final-message
 - power-state-change

system_info:
  default_user:
    name: centos
    lock_passwd: true
    gecos: Cloud User
    groups: [wheel, adm, systemd-journal]
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    shell: /bin/bash
  distro: rhel
  paths:
    cloud_dir: /var/lib/cloud
    templates_dir: /etc/cloud/templates
  ssh_svcname: sshd

# vim:syntax=yaml

cloud-init 활용하기

OS상에서 cloud-init 초기 모듈과 함께 클라우드 초기화 설정을 실행

/usr/bin/cloud-init -d init

OS상에서 모든 모듈을 실행

/user/bin/cloud-init -d modules

SSH 접속이 불가할 때 keypair 변경하기

만약 ssh public key를 분실하였을 경우 새로운 public key를 생성하고 이를 EC2 UserData에 넣어서 추가할 수 있습니다. (단, UserData를 변경하기 위해서는 EC2 Instanc 상태가 stop상태이어야 합니다.)

  • AWS에서 keypair생성후 public key로 변환하여 PublicKeypair 자리에 입력 (ssh-rsa AAAA...)
Content-Type: multipart/mixed; boundary="//"
MIME-Version: 1.0

--//
Content-Type: text/cloud-config; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cloud-config.txt"

#cloud-config
cloud_final_modules:
- [users-groups, once]
users:
  - name: ec2-user
    ssh-authorized-keys:
    - PublicKeypair

https://aws.amazon.com/ko/premiumsupport/knowledge-center/user-data-replace-key-pair-ec2/

반응형