๊ธฐ์กด์ ๋ฌผ๋ฆฌ์ ์๋ฒ, ์คํ ๋ฆฌ์ง, ๋คํธ์ํฌ ๋ฑ์ ์ ๋ถ ํด๋ฌ์คํฐ๋ก ๋ฌถ๊ณ ์ถ์ํํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ๊ฐ์ํ๋ ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ์์ฑ, ๊ด๋ฆฌ, ํ๊ธฐํ๋ ์ผ๋ จ์ ๊ณผ์ ์ '์ฝ๋ํ ์ธํ๋ผ์คํธ๋ญ์ฒ (IaC; Infrastructrure as Code)'๋ผ๊ณ ํ๋ค. ์ด๋ฒ ํฌ์คํธ์์๋ ํด๋น ๊ณผ์ ์ ์ผ๋ถ์ธ ์๋ํ๋ฅผ Ansible๋ฅผ, AWS EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฐ๋จํ ์์ ๋ฅผ ํตํ์ฌ ๋ค๋ฃจ์ด๋ณด๊ณ ์ ํ๋ค.
์ด ํฌ์คํธ์์๋ ์ ์ ์ Windows PC๊ฐ ๊ด๋ฆฌ ๋ ธ๋๊ฐ ๋๋ฉฐ, ์ ์ ์ PC ==> WSL (Windows Subsystem for Linux) Ubuntu 22.04 LTS + Ansible๋ก ์ง์ AWS์ ์ ๊ทผํ์ฌ EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.
ํ๊ฒฝ ๊ตฌ์ฑ
Ansible์ ์ํ ๊ฒฝ๋ก ์์ฑ
์ด์ EC2 ์์ฑ์ ์ํ playbook๊ณผ, ๊ทธ๋ฆฌ๊ณ ์์์ ๋ฐ๊ธ๋ฐ์ access key๋ฅผ ๋ด์ ๊ฒฝ๋ก๋ฅผ ์ ์ ์ PC์ ์์ฑํ ๊ฒ์ด๋ค. WSL Ubuntu์ ์ ธ์ ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ ํ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ๋ค.
cd ~
์ด์ ํ์๋ค๊ฐ `ansible_aws_tutorial` ํด๋๋ฅผ ์์ฑ, ๊ทธ๋ฆฌ๊ณ ํ์ ํด๋๋ก `group_vars/all`๋ ์์ฑํ๋ค. ์์ฑํ ๋ค์๋ `ansible_aws_tutorial`๋ก ๋ค์ด๊ฐ์ ์ด๋ฐ๊ฐ ์ฌ์ฉํ `playbook.yml`์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋๋๋ค.
mkdir -p ansible_aws_tutorial/group_vars/all/
cd ansible_aws_tutorial
touch playbook.yml
AWS ์ ๊ทผ ํค ์์ฑ
๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ๊ฒ์ Ansible์์ AWS๋ก ์ ๊ทผํ ์ ์๋๋ก ํ ํฐ์ ์์ฑํ๋ ๊ฒ์ด๋ค. ์ด๋ AWS์ IAM ์๋น์ค์์ ํ ์ ์๋ค. ์ฌ๊ธฐ์๋ AWS์ root account๊ฐ ์๋ IAM์ผ๋ก ๊ถํ์ ๋ถ์ฌ๋ฐ์ ๋ณ๋์ ์ ์ ๊ฐ ์๋ ๊ฒ์ผ๋ก ์ ์ ํ๊ณ ์ ๊ทผ ํค ์์ฑ ๋ฐฉ๋ฒ์ ์ค๋ช ํ๊ฒ ๋ค.
์๋์ ๊ฐ์ด, IAM์ ๊ฒ์ํ์ฌ ํด๋น ํ์ด์ง๋ก ๋ค์ด๊ฐ๋ค.
IAM Dashboard๋ก ๊ฐ์, ์๋์ ๊ฐ์ด, ์ ๊ทผ ํค๋ฅผ ๋ฐ๊ธ๋ฐ๊ณ ์ ํ๋ ์ ์ ๋ฅผ ์ ํํ๋ค.
์๋์ ๊ฐ์ด, ํด๋น ์ ์ ์ Security credentials ํญ์ผ๋ก ๊ฐ์ Create access keys๋ฅผ ํด๋ฆญํ๋ค.
Access key ์์ฑ ๊ณผ์ ์์, ์๋์ ๊ฐ์ ์ค๋ฌธ์ ๋ฐ๊ฒ ๋๋ค. ๋งจ ๋ง์ง๋ง 'Other' ์ด์ธ์ ๋ชจ๋ ์ ํ์ง๊ฐ 'Alternatives recommended'๋ผ๋ ๊ฒฝ๊ณ ๊ฐ ๋ฌ๋ค. ํ์ง๋ง ์ ์ ์ PC์ ์ค์น๋ Ansible๋ก AWS์ ์ ๊ทผํ๋ ๊ฒ์ 'Other'์ ํด๋น๋๋ฏ๋ก ์ด๋ฅผ ํด๋ฆญํ์. ๋ค๋ง, ์ด๋ฅผ ํตํด ๋ฐ๊ธ๋ฐ์ access key๋ ์ธ๋ถ์ ์ ์ถ๋์ง ์๋๋ก ๊ทนํ ์ฃผ์ํ์ฌ์ผ ํ๋ค. ์ด๋ฌํ ํค๋ค์ GitHub ์ ์ฅ์ ๋ฑ์ ์๋ฌด๋ ๊ฒ๋ ๋ ธ์ถ์ํฌ ๊ฒฝ์ฐ, ์ง๋๊ฐ๋ ํฌ๋กค๋ง ๋ด์ด ์ด ํค๋ฅผ ์์งํ์ฌ, ๋ฉฐ์น ๋ง ์ง๋๋ ์ ์ ์ Billing dashboard์ ์ฒ๋ฌธํ์ ์ธ ๊ธ์ก์ด ์ฐํ๊ฒ ๋ง๋ค์ง๋ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค.
์์ฑ๋๋ฉด, ์๋์ ๊ฐ์ด access key์ secret access key๋ฅผ ๋ณต์ฌํ ์ ์๊ฒ ๋๋ค.
EC2 ์ธ์คํด์ค๋ค์ ์ ๊ทผ์ ์ํ ํค์ (Key Pair) ์์ฑ
Ansible์ ๊ธฐ๋ณธ์ ์ผ๋ก 'agentless'๋ก, ํ๊น ์๋ฒ์๋ค๊ฐ ๋ณ๋์ agent๋ฅผ ๋๋ ๋์ SSH ์ ์์ ์ด์ฉํ๋ ๋ฐฉ์์ด๋ค. ๋ด PC์์ SSH๋ก EC2 ์ธ์คํด์ค์ ์ ๊ทผํ๊ธฐ ์ํ ํค์์ ์์ฑํด์ผ ํ๋ค. ์๋ ๋ช ๋ น์ด๋ฅผ ์ ธ์ ์ ๋ ฅํ์ฌ `my_ec2_key`๋ผ๋ ๊ณต๊ฐํค ๋ฐ ๋น๋ฐํค๋ฅผ ์์ฑํ ์ ์๋ค. Passphrase๋ ํ์ํ ๊ฒฝ์ฐ์๋ ์ ๋ ฅํ๊ฒ ์ง๋ง ์ฌ๊ธฐ์๋ ์๋ตํ๋ค.
ssh-keygen -t rsa -b 4096 -f my_ec2_key
์์ฑ ํ, ์๋์ ๊ฐ์ด `ls -al`์ ์ ๋ ฅํ๋ฉด ์ค์ ๋ก ๋ง๋ค์ด์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
Ansible ์ค์น
์ด์ ์ ์ ์ PC์ Ansible์ ์ค์นํ๋ค. ์๋ ๋ช ๋ น์ด๋ฅผ ์ ธ์ ์ ๋ ฅํ์ฌ ์ ๋ฐ์ดํธํ๊ณ Ansible์ ์ค์นํ๋ค.
sudo apt update;sleep 1;sudo apt upgrade -y;sleep 1
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
์ดํ ์ ธ์ `ansible --version`์ ์คํํ์ฌ ์๋์ ๊ฐ์ด ๋ฒ์ ์ ํ์ธํ๋ค.
AWS Access Key ์ ์ฅ
AWS Access Key๋ฅผ ์ํธํํจ๊ณผ ๋์์ playbook์ ๋ง์น ์ด๋ฏธ ์กด์ฌํ๋ ๋ณ์์ฒ๋ผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ `ansible-vault`์ ์ฌ์ฉํด์ผ ํ๋ค. ์ด๋, `ansible-vault`๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํธํ๋ฅผ ์ํ ํจ์ค์๋, ๋๋ ํจ์คํค ํ์ผ์ ํ์๋ก ํ๋ค.
์ด ํฌ์คํธ์์๋ ํจ์ค์๋๋ก ์ํธํํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๋ค. ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ ํ์ฌ ํด๋์ ํ์์ ์์นํ `group_vars/all`์ `pass.yml`์ ์๋ก ์์ฑํ๋ค.
ansible-vault create ./group_vars/all/pass.yml
์ด๋, ์๋์ ๊ฐ์ด, ๊ทธ ์ ๋ช ํ(...) `vim` ์๋ํฐ๊ฐ ๋ฑ์ฅํ ๊ฒ์ด๋ค. ๊ฐ๊ธ์ `vim` ํํ ๋ฆฌ์ผ์ ํ๋ฒ ๋ณด๊ณ ์งํํ๊ธฐ๋ฅผ ๋ฐ๋๋ค.
๋๋ ์๋์ฒ๋ผ ์๋ํฐ๋ฅผ `nano`๋ก ์ง์ ์ง์ ํ์ฌ ์ด ์๋ ์๋ค.
env EDITOR=nano ansible-vault create group_vars/all/pass.yml
์๋ฌดํผ ์๋ํฐ๊ฐ ์ด๋ ธ๋ค๋ฉด ์๋์ ๊ฐ์ด AWS ํค๋ฅผ ๋ฃ๊ณ ์ ์ฅํ๋ค.
ec2_access_key: AK****************7
ec2_secret_key: KeJ/sg**************************HT8
์ด์ ์ด `pass.yml`์๋ ํด๋น ํค์ (key pair)์ด ์ํธํ๋ ์ฑ๋ก ์ ์ฅ๋๋ค. ์ค์ ๋ก `nano group_vars/all/pass.yml`์ ํตํด `pass.yml`์ ๊ทธ๋ฅ ์ด ๊ฒฝ์ฐ ๊ทธ ์๋ณธ์ ๋ณผ ์ ์๋ค.
์ด๋ ๊ฒ ๋ชจ๋ ํ๊ฒฝ ๊ตฌ์ฑ์ด ๋๋ฌ๋ค. ๋ค์์ Ansible์ playbook์ ์์ฑํ๊ณ ์ด๋ฅผ ์คํํด๋ณด๊ฒ ๋ค.
Ansible ๊ตฌ์ฑ ๋ฐ ์คํ
Ansible Playbook YAML ์์ฑ
์๊น ์์ฑํ๋ `playbook.yml`ํ์ผ์ ์ด๊ธฐ ์ํด, ์ ธ์ `nano playbook.yml`์ ์ ๋ ฅํ๋ค. ๊ทธ๋ฆฌ๊ณ ์๋์ ๊ฐ์ด ์์ฑํ์ฌ ์ ์ฅํ๋ค.
์๋ region, AMI ์ด๋ฏธ์ง ๊ณ ์ ID, ์๋ธ๋ท ๊ณ ์ ID, ๋ณด์๊ทธ๋ฃน ๊ณ ์ ID, EC2์ ์ฌ์ฉํ ํค์ ํ์ผ ๊ฒฝ๋ก ๋ฑ์ ๋ณธ์ธ ์ํฉ์ ๋ง๋๋ก ์์ ํ๋ค. ์ด๋ AMI ์ด๋ฏธ์ง ๊ณ ์ ID๋ EC2 ์๋น์ค์ ์ข์ธก ๋ฉ๋ด์ ์๋ 'AMI Catalog'๋ฅผ ๋ณด๋ฉด ํ์ธํ ์ ์๋ค (์๋๋ฉด Amazon Linux 2023 AMI ami-081a36454cdf357cb, ๋๋ Ubuntu Server 22.04 LTS (HVM) ami-0382ac14e5f06eb95, ๋๋ ๋ณธ์ธ์ด ๋ฏธ๋ฆฌ ์ ์ฅํด๋จ๋ AMI)
# AWS playbook
---
- hosts: localhost
connection: local
gather_facts: False
vars:
key_name: my_ec2_key # Key used for SSH
region: ap-northeast-2 # Region may affect response and pricing
image: ami-<์ด๋ฏธ์ง ๊ณ ์ ID> # look in ec2 > ami (filter owner alias: amazon) or amis of manually launched instances
id: "example testing"
instance_type: t2.micro # Choose instance type, check AWS for pricing
vpc_subnet_id: subnet-<์๋ธ๋ท ๊ณ ์ ID>
sec_group: "sg-<๋ณด์๊ทธ๋ฃน ๊ณ ์ ID>"
tasks:
- name: Provisioning EC2 instances
block:
- name: Amazon EC2 | Create Key Pair # Create key pair for ssh
ec2_key:
name: "{{ key_name }}"
region: "{{ region }}"
aws_access_key: "{{ec2_access_key}}" # From vault as defined
aws_secret_key: "{{ec2_secret_key}}" # From vault as defined
key_material: "{{ item }}"
with_file: ~/ansible_aws_tutorial/my_ec2_key.pub
- name: Start an instance with a public IP address
ec2_instance:
name: "public-compute-instance"
key_name: "{{ key_name }}"
vpc_subnet_id: "{{ vpc_subnet_id }}"
instance_type: "{{ instance_type }}"
security_group: "{{ sec_group }}"
aws_access_key: "{{ ec2_access_key }}"
aws_secret_key: "{{ ec2_secret_key }}"
region: "{{ region }}"
network:
assign_public_ip: true
image_id: "{{ image }}"
tags:
Environment: Testing
# Always require the 'create_ec2' tag to provision EC2 instance
tags: ['never', 'create_ec2']
- name: Facts
block: # this block prints out instance data
- name: Get instances facts
ec2_instance_info:
aws_access_key: "{{ ec2_access_key }}"
aws_secret_key: "{{ ec2_secret_key }}"
region: "{{ region }}"
register: result
- name: Instances ID
debug:
msg: "ID: {{ item.instance_id }} - State: {{ item.state.name }} - Public DNS: {{ item.public_dns_name }}"
loop: "{{ result.instances }}"
- name: Gather information about all subnets
ec2_vpc_subnet_info:
aws_access_key: "{{ ec2_access_key }}"
aws_secret_key: "{{ ec2_secret_key }}"
region: "{{ region }}"
register: subnets
- name: Print the subnet information
debug:
msg: "{{ subnets }}"
tags: always
Ansible ์คํ
์ด์ ๋ชจ๋ ์ค๋น๊ฐ ๋๋ฌ์ผ๋ฉฐ ์คํ๋ง ํ๋ฉด ๋๋ค. ์ ธ์์ ์๋๋ฅผ ์ ๋ ฅํ์ฌ ์คํํ๋ค.
ansible-playbook playbook.yml --tags create_ec2 --ask-vault-pass
์ด๋ Ansible๊ฐ ํจ์ค์๋๋ฅผ ์๊ตฌํ ๊ฒ์ด๋ค. Vault์ ์ ์ฅํด๋ ํจ์ค์๋๋ฅผ ์ ๋ ฅํ๋ฉด ๋๋ค.
๋ง์ฝ, ํจ์ค์๋๊ฐ ์๋๋ผ ํจ์คํค ํ์ผ์ ๋ฐ๋ก ๋๋ค๋ฉด, ์๋์ ๊ฐ์ด ์ ๋ ฅํ๋ฉด ๋๋ค.
ansible-playbook playbook.yml --tags create_ec2 --vault-password-file vaultํ์ผ.pass
Ansible ์คํ ๊ฒฐ๊ณผ
๋ง์ฝ ์ฑ๊ณตํ ๊ฒฝ์ฐ ํฐ๋ฏธ๋์๋ ์๋์ ๊ฐ์ด ๋์จ๋ค.
๋ง์ฝ ์คํจํ ๊ฒฝ์ฐ ํฐ๋ฏธ๋์๋ ์๋์ ๊ฐ์ด ๋์จ๋ค.
AWS ์ฝ์์์ ๊ฒฐ๊ณผ ํ์ธ
์ฑ๊ณตํ์ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด AWS ์ฝ์์ ์๋ก์ด EC2 ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด์ก์์ ํ์ธํ ์ ์๋ค.
๋ง๋ค์ด์ง ์์ ์ญ์ ํ๊ธฐ
์ผ๋จ ๊ฐ์ฅ ๋จผ์ AWS access key ์ญ์ ==> (ํด๋น๋๋ ๊ฒฝ์ฐ) ์๋ธ๋ท ์ญ์ ==> VPC ์ญ์ ==> (ํด๋น๋๋ ๊ฒฝ์ฐ) ์ง์ ์์ฑํ AMI ์ญ์ ==> EC2 ์ธ์คํด์ค ์ญ์
'๊ฐ๋ฐ&IT > Infra. & Arch. & Cloud' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
VM์ ๋ก๊ทธ์ธ ์ ธ์ด `nologin`์ธ ๊ณ์ ์ ๋ด public key๋ฅผ ์ฌ๊ธฐ (0) | 2024.08.12 |
---|---|
PowerShell์์ ์ผ์์ ์ผ๋ก ํ๊ฒฝ๋ณ์ ์์ ํ๊ธฐ (0) | 2024.04.02 |
Ubuntu ๋จธ์ ๋ณต์ ์ IP ์ฃผ์ ๊ฒน์นจ ๋ฌธ์ ํด๊ฒฐ (0) | 2024.03.29 |
Nextcloud ์ ๋ฐ์ดํธ๋ฅผ ์น ๋์ ์ฝ์์ฐฝ์์ ํ๊ธฐ (0) | 2023.06.22 |
SSH ์๋ฒ๋ก SOCKS5 ํ๋ก์ ๊ตฌ์ฑํ๊ธฐ (0) | 2022.02.07 |
Dedicated Server Port Forwarding to VPS Using iptables (and OpenVPN) (0) | 2021.07.21 |
CurrPorts - TCP/IP ์ก์์ ๋ง ํฌํธ ๋ฐ ์ฐ๊ฒฐ ์ํ ๋ชจ๋ํฐ๋ง ๋๊ตฌ (0) | 2013.08.09 |
์๋ ํ์ธ์.
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!