본문 바로가기

KOSA 클라우드 솔루션즈 아키텍트 양성과정

[6.29] ad hoc

DevOps 카테고리
1. IaC - 구성 및 설정 자동화 - Terragorm, Ansible
2. Container 기술 및 오케스트레이션 - Docker, Kubernetes
3. CI/CD (Continuous Integration/Continuous Deployment, Delivery) - Jenkins, Git, Gitlab

 

adhoc

- 한 줄 한 줄 세팅하는 것


 VirtualBox 가상머신 생성


 VirtualBox 가상머신 시작

스왑 메모리는 사용하지 않음


 mobaXterm 접속

 

--- CentOS7 설정


# yum install -y bash-completion wget unzip rdate
# rdate -s time.bora.net
# setenforce 0
# sed -i s/^SELINUX=.*$/SELINUX=disabled/ /etc/selinux/config
# cd /tmp
# systemctl disable --now firewalld
# yum update -y
# poweroff

timedatectl : 어떤 지역의 시간으로 설정되어 있는지 확인

 

rdate -s time.bora.net : 정확한 시간 설정하는 명령어

 

sed -i s/^SELINUX=.*$/SELINUX=disabled/ /etc/selinux/config :

=> config 경로 안의 SELINUX= 이라고 되어 있는 부분을  disabled로 바꾸는 명령어   


업데이트 후 poweroff => OVA 파일 만들기


AWS CLI 설치

--- AWS CLI 설치

# cd /tmp   => 데이터를 일정 시간 가지고 있다가 자동으로 지워주는 임시 폴더
# curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
# unzip awscliv2.zip
# ./aws/install   => 현재 위치의 aws 폴더의 install 이라는 실행 파일을 실행시켜라

# vi .bash_profile => bash completion을 위한 설정 파일
# complete -C '/usr/local/bin/aws_completer' aws => bash completion 을 실행하기 위해 넣어줘야 할 명령어
# aws --version
# aws configure

 

tmp 폴더에 curl 명령어를 이용해 압축 파일 내려 받기

 

설치된 압축파일을 해제한 후 현재 경로의 aws 폴더 내부에 있는 intall 실행 파일 실행 시켜주기

 

 

일반적으로 aws s3 ls로 configure(로그인) 되어 있는지 확인

 

aws Key ID가 아직 없으니 만들러 aws 콘솔로 가자


aws IAM으로 이동하여 CLI를 위한 사용자 생성

 

사용자 추가

 

 

 

.csv 파일 다운로드


IAM 사용자로 로그인

.csv 파일에 있는 KEY ID와 Access Key를 사용

 

aws s3 ls를 통해 s3에 로그인 되었는지 확인


VPC와 서브넷 만들기

# aws ec2 create-vpc --cidr-block 192.168.0.0/16 --tag-specification "ResourceType=vpc,Tags=[{Key=Name,Value=NEW-VPC}]" --output text  => ec2가 먼저 탄생해서 vpc를 생성하는 명령어가 ec2 뒤에 오게 됨
# NEW_VPC=vpc-0b9644604c489e833
# echo $NEW_VPC
# aws ec2 create-subnet --vpc-id $NEW_VPC --cidr-block 192.168.0.0/20 --availability-zone ap-northeast-2a --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=NEW-PUBLIC-SUBNET-2A}]"
# aws ec2 create-subnet --vpc-id $NEW_VPC --cidr-block 192.168.16.0/20 --availability-zone ap-northeast-2b --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=NEW-PUBLIC-SUBNET-2B}]"
# aws ec2 create-subnet --vpc-id $NEW_VPC --cidr-block 192.168.32.0/20 --availability-zone ap-northeast-2c --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=NEW-PUBLIC-SUBNET-2C}]"
# aws ec2 create-subnet --vpc-id $NEW_VPC --cidr-block 192.168.48.0/20 --availability-zone ap-northeast-2d --tag-specification "ResourceType=subnet,Tags=[{Key=Name,Value=NEW-PUBLIC-SUBNET-2D}]"
# aws ec2 describe-subnets --filters "Name=vpc-id,Values=$NEW_VPC" --query 'Subnets[*{AZ:AvailabilityZone,CIDR:CidrBlock}'

 

 

* aws ec2 create-vpc --cidr-block 192.168.0.0/16 --tag-specification "ResourceType=vpc,Tags=[{Key=Name,Value=NEW-VPC}]" --output text

=> --output : output 포멧을 텍스트 형태로 볼 것

 

* vpc-0b9644604c489e833 => 생성된 vpc의 아이디는 추후 변수로 만들어 줄 것

 

vpc의 아이디를 변수에 바인딩

 

변수가 생성되었는지 확인

 

* create 후 --output text와 같이 포멧을 지정해주지 않으면 기본 포멧인 json으로 출력됨

 

콘솔에서 새로 생성한 NEW-VPC와 서브넷들 확인

 

* aws ec2 describe-subnets --filters "Name=vpc-id,Values=$NEW_VPC" --query 'Subnets[*].{AZ:AvailabilityZone,CIDR:CidrBlock}'

=> 셋팅했던 내용들을 보여주는 명령어, sort까지 해서 보여주지는 않음

=> Name 필드 중 vpc-id 부분과 그 중 값이 NEW_VPC인 것만 추려서 보겠음

=> 추린 정보 내에서도 AZ와 CIDR을 보여달라는 의미


인터넷 게이트웨이 만들기(서브넷을 퍼블릭 서브넷으로 만들기)

# aws ec2 create-internet-gateway --tag-specification "ResourceType=internet-gateway,Tags=[{Key=Name,Value=NEW-IGW}]" --output text
# NEW_IGW=igw-07bcf6f436dc7df46
# aws ec2 attach-internet-gateway --vpc-id $NEW_VPC --internet-gateway-id $NEW_IGW
# aws ec2 describe-internet-gateways --output table
# aws ec2 describe-route-tables --filter "Name=vpc-id,Values=$NEW_VPC"
# NEW_RTB=rtb-0c92dd389865be7e3
# aws ec2 create-route --route-table-id $NEW_RTB --destination-cidr-block 0.0.0.0/0 --gateway-id $NEW_IGW

 

인터넷 게이트웨이 생성됨, 변수 생성 위해 igw-05df38cd134fdcbf3가 사용될 것

 

IGW를 VPC에 연결하기

 

IGW와 VPC가 attach 된 것 확인


라우트 테이블 설정(서브넷, 엔드포인트 주소)

# aws ec2 create-tags --resources $NEW_RTB --tags "Key=Name,Value=NEW-PUBLIC-SUBNET-RTB"
# aws ec2 describe-route-tables --route-table-id $NEW_RTB --output table
# aws ec2 describe-subnets --filters "Name=vpc-id,Values=$NEW_VPC" --query 'Subnets[*].{ID:SubnetId,CIDR:CidrBlock}'
# NEW_SID1=subnet-0bceb2f51a80c06bc
# NEW_SID2=subnet-06fe9b40311b9a26a
# NEW_SID3=subnet-047f6bb00f677beaa
# NEW_SID4=subnet-09f730447b37f1237
# aws ec2 associate-route-table  --subnet-id $NEW_SID1 --route-table-id $NEW_RTB
# aws ec2 associate-route-table  --subnet-id $NEW_SID2 --route-table-id $NEW_RTB
# aws ec2 associate-route-table  --subnet-id $NEW_SID3 --route-table-id $NEW_RTB
# aws ec2 associate-route-table  --subnet-id $NEW_SID4 --route-table-id $NEW_RTB
# aws ec2 modify-subnet-attribute --subnet-id $NEW_SID1 --map-public-ip-on-launch
# aws ec2 modify-subnet-attribute --subnet-id $NEW_SID2 --map-public-ip-on-launch
# aws ec2 modify-subnet-attribute --subnet-id $NEW_SID3 --map-public-ip-on-launch
# aws ec2 modify-subnet-attribute --subnet-id $NEW_SID4 --map-public-ip-on-launch
# aws ec2 modify-vpc-attribute --vpc-id $NEW_VPC --enable-dns-hostnames

라우트 테이블의 ID를 추출

 

라우트 테이블의 ID를 변수에 바인딩

 

라우트 테이블에 라우팅 정보를 넣어주기

 

서브넷의 아이디를 변수에 바인딩 하기 위해 서브넷 아이디를 describe함

 

앞서 생성한 서브넷 아이디를 변수에 바인딩

 

associate : 콘솔에서 명시적 서브넷 연결과 같은 의미

 

서브넷 설정편집

=> 퍼블릭 IPv4 주소 자동할당 활성화를 활성화 시키는 것

 

 

dns-hostnames를 enable 시켜줘야만 퍼블릭 엔드포인트 주소를 사용할 수 있게 됨

 


키 페어 및 보안 그룹 생성

# aws ec2 create-key-pair --key-name new-key --query 'KeyMaterial' --output text > new-key.pem
# chmod 400 new-key.pem
# aws ec2 create-security-group --group-name NEW-SG-WEB --description "Security group for HTTP_SSH access" --vpc-id $NEW_VPC
# NEW_SG=sg-05fff0c87d3731fdc
# aws ec2 authorize-security-group-ingress --group-id $NEW_SG --protocol tcp --port 22 --cidr 0.0.0.0/0
# aws ec2 authorize-security-group-ingress --group-id $NEW_SG --protocol tcp --port 80 --cidr 0.0.0.0/0
# aws ec2 authorize-security-group-ingress --group-id $NEW_SG --protocol icmp --port -1 --cidr 0.0.0.0/0

=> icmp는 포트번호가 없음, -1은 icmp의 여러 가지 로직 모두를 의미하는 것, 기존의 포트 번호와는 다른 개념

 

퍼블릭 키를 생성하면서 new-key.pem키의 텍스트 형식을 표준 출력으로 내보내기 함

 

키 페어 생성 후 퍼미션 400 부여

 

VPC의 보안 그룹 생성

 

보안 그룹 ID를 변수에 바인딩

 

32는 특수비트로 IP 한 개만을 의미, SSH 프로토콜로는 해당 IP의 인바운드 트래픽만 허용


볼륨 및 인스턴스 만들기

# vi mapping.json
[
    {
        "DeviceName": "/dev/xvda",     => xvda : a는 루트 볼륨이라는 것을 의미, 윈도우에서는 C 드라이버, 리눅스에서는 a
        "Ebs": {
            "VolumeSize": 8
        },
    }

   {
        "DeviceName": "/dev/xvdb",     
        "Ebs": {
            "VolumeSize": 8
        }
    }

]

# vi my_script.txt
#!/bin/bash
yum install -y httpd
systemctl enable --now httpd
echo "<h1>Hello AWS CLI</h1>" > /var/www/html/index.html

# aws ec2 run-instances \                                 => create가 아니고 run을 사용
--image-id ami-0fd0765afb77bcca7 \
--count 1 \
--instance-type t2.micro \
--key-name new-key \
--security-group-ids $NEW_SG \
--subnet-id $NEW_SID1 \
--block-device-mappings file://mapping.json \
--user-data file://my_script.txt \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=NEW-WEB}]' 'ResourceType=volume,Tags=[{Key=Name,Value=NEW-ROOT}]'

# NEW_IID=i-0c49036485c1ce2bd
# aws ec2 describe-instances --instance-id $NEW_IID | grep PublicIp
# ssh -i "new-key.pem" ec2-user@3.38.165.0
# curl 3.38.165.0

 

 

aws에 존재하는 이미지 ID를 사용할 수 있음

 

EC2 생성, InstanceId 복사해서 변수 선언 하기

 

인스턴스 ID를 변수에 바인딩

 

EC2 인스턴스의 퍼블릭IP를 describe하기

 

 

 


EC2로 SSH 세션 접속(xvdb 를 사용할 수 있도록 마운트)

 

 

xvdb를 마운트 하지 않았기 때문에 아직 추가볼륨으로 사용하지 않고 있는 상태

 

먼저 포멧 해주기, Block size 단위(4096)로 데이터를 저장, 해당 크기가 넘어가면 Fragment(조각)로 나눠서 저장

 

mnt 폴더에 xvdb를 마운트

 

마운트 완료(이제 추가 볼륨  xvdb를 사용하는 상태)

 

xvda, xvdb처럼 볼륨 이름 앞에 x가 붙는 이유 : xen 서버를 하이퍼바이저로 사용하기 때문임(t2.micro의 경우)


서비스 삭제

.aws 폴더 내의 config 파일을 수정하여 출력 형태를 변경할 수 있음

 

EC2를 종료, 출력 형식이 table이므로 table로 표시됨

 

보통 create의 경우만 테이블로 결과가 출력되고, delete 작업에서는 그냥 프롬프트가 떨어지게 됨

 

인터넷 게이트웨이와 VPC를 분리해야만, 인터넷 게이트웨이 삭제할 수 있음(콘솔의 경우 VPC 삭제 시 전부 삭제됨)

 

인터넷 게이트웨이 삭제

 

VPC 삭제


CloudFormation

# vi new-vpc.yaml
AWSTemplateFormatVersion: 2010-09-09
Resources:
  VPC:                                     => 원하는 이름 임의로 입력 가능, 식별자의 역할(태그X)
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 192.168.0.0/16
      EnableDnsSupport: true
      EnableDnsHostnames: true
      InstanceTenancy: default    => 공용 자원으로 사용할 것이라면 default 입력 
      Tags:
        - Key: Name
          Value: NEW-VPC
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: NEW-IGW
  VPCGatewayAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway
  SubnetA:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: ap-northeast-2a
      VpcId: !Ref VPC
      CidrBlock: 192.168.0.0/20
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: NEW-PUBLIC-SUBNET-2A
  SubnetB:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: ap-northeast-2b
      VpcId: !Ref VPC
      CidrBlock: 192.168.16.0/20
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: NEW-PUBLIC-SUBNET-2B
  SubnetC:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: ap-northeast-2c
      VpcId: !Ref VPC
      CidrBlock: 192.168.32.0/20
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: NEW-PUBLIC-SUBNET-2C
  SubnetD:
    Type: AWS::EC2::Subnet
    Properties:
      AvailabilityZone: ap-northeast-2d
      VpcId: !Ref VPC
      CidrBlock: 192.168.48.0/20
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: NEW-PUBLIC-SUBNET-2D
  RouteTableA:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: NEW-PUBLIC-RTB
  InternetRoute:
    Type: AWS::EC2::Route
    DependsOn: InternetGateway
    Properties:
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway
      RouteTableId: !Ref RouteTableA
  SubnetARouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTableA
      SubnetId: !Ref SubnetA
  SubnetBRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTableA
      SubnetId: !Ref SubnetB
  SubnetCRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTableA
      SubnetId: !Ref SubnetC
  SubnetDRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref RouteTableA
      SubnetId: !Ref SubnetD