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/
'IT > 가상화' 카테고리의 다른 글
[가상화] 베어메탈 vs 가상화 vs 컨테이너 차이 (2) | 2024.11.18 |
---|---|
docker 설치 이후 실행 에러 해결 하기 (permission,Cannot connect) (0) | 2022.02.28 |
docker로 tomcat 실행 시 404 이슈 해결 하기 (0) | 2022.02.28 |
[가상화] multipass란? (Ubuntu 서버 가상환경 구축) (0) | 2021.11.19 |
[가상화] 가상화란 무엇인가? (8) | 2019.09.26 |