Infra/cloud

[AFOS] 4주차 스토리지 서비스 - 실습 : EBS

미니문92 2021. 7. 13. 12:32

6. 실습

CloudFormation 스택 생성

실습 구성


 

1. CloudFormation - 스택 생성 - 새 리소스 사용

2. Amazon S3 URL 입력

3. 스택 이름, 파라미터 지정

4. 스택 옵션 구성 - 기본값

5. 검토 : AWS CloudFormation에서 사용자 지정 이름으로 IAM 리소스를 생성할 수 있음을 승인합니다. 체크

  • 보안성 있는 서비스에 접근 가능하게 할꺼냐는 항목/ 하지않으면 중간에 roll back 됨

 


Storage.yaml 파일 내용

Parameters:
  KeyName:
    Description: Name of an existing EC2 KeyPair to enable SSH access to the instances. Linked to AWS Parameter
    Type: 'AWS::EC2::KeyPair::KeyName'
    ConstraintDescription: must be the name of an existing EC2 KeyPair.
  LatestAmiId:
    Description: (DO NOT CHANGE)
    Type: 'AWS::SSM::Parameter::Value<AWS::EC2::Image::Id>'
    Default: '/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2'
    AllowedValues:
      - /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2

Resources:
# IAM Role Instance Profile
  STGLabInstanceRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: STGLabInstanceRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          -
            Effect: Allow
            Principal:
              Service:
                - ec2.amazonaws.com
            Action:
              - sts:AssumeRole
      Path: /
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
        - arn:aws:iam::aws:policy/AmazonS3FullAccess

  STGLabRoleForInstanceProfile:
    Type: AWS::IAM::InstanceProfile
    Properties:
      InstanceProfileName: STGLabRoleForInstances
      Path: /
      Roles:
        - !Ref STGLabInstanceRole

# VPC
  ELBVPC:
    Type: AWS::EC2::VPC
    Properties:
     CidrBlock: 10.40.0.0/16
     EnableDnsSupport: true
     EnableDnsHostnames: true
     Tags:
        - Key: Name
          Value: ELB-VPC

  ELBIGW:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: ELB-IGW

  ELBIGWAttachment:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      InternetGatewayId: !Ref ELBIGW
      VpcId: !Ref ELBVPC

  ELBPublicRT:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref ELBVPC
      Tags:
        - Key: Name
          Value: ELB-Public-RT

  ELBDefaultPublicRoute:
    Type: AWS::EC2::Route
    DependsOn: ELBIGWAttachment
    Properties:
      RouteTableId: !Ref ELBPublicRT
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref ELBIGW

  ELBPublicSN1:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref ELBVPC
      AvailabilityZone: !Select [ 0, !GetAZs '' ]
      CidrBlock: 10.40.1.0/24
      Tags:
        - Key: Name
          Value: ELB-Public-SN-1

  ELBPublicSN2:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref ELBVPC
      AvailabilityZone: !Select [ 2, !GetAZs '' ]
      CidrBlock: 10.40.2.0/24
      Tags:
        - Key: Name
          Value: ELB-Public-SN-2

  ELBPublicSNRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref ELBPublicRT
      SubnetId: !Ref ELBPublicSN1

  ELBPublicSNRouteTableAssociation2:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      RouteTableId: !Ref ELBPublicRT
      SubnetId: !Ref ELBPublicSN2

# Security Group
  ELBSG:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Enable 
      VpcId: !Ref ELBVPC
      Tags:
        - Key: Name
          Value: ELBSG
      SecurityGroupIngress:
      - IpProtocol: tcp
        FromPort: '80'
        ToPort: '80'
        CidrIp: 0.0.0.0/0
      - IpProtocol: tcp
        FromPort: '2049'
        ToPort: '2049'
        CidrIp: 10.40.0.0/16
      - IpProtocol: tcp
        FromPort: '22'
        ToPort: '22'
        CidrIp: 0.0.0.0/0
      - IpProtocol: icmp
        FromPort: -1
        ToPort: -1
        CidrIp: 0.0.0.0/0

# EC2 Instance
  EC2STG1:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: !Ref LatestAmiId
      IamInstanceProfile: STGLabRoleForInstances
      KeyName: !Ref KeyName
      Tags:
        - Key: Name
          Value: EC2-STG1
      NetworkInterfaces:
        - DeviceIndex: 0
          SubnetId: !Ref ELBPublicSN1
          GroupSet:
          - !Ref ELBSG
          AssociatePublicIpAddress: true
          PrivateIpAddress: 10.40.1.10
      UserData:
        Fn::Base64:
          !Sub |
            #!/bin/bash
            hostnamectl --static set-hostname EC2-STG1
            yum install httpd tree tmux amazon-efs-utils -y
            systemctl start httpd && systemctl enable httpd
            echo "<html><h1>AFOS Study - Web Server 1</h1></html>" > /var/www/html/index.html
            curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
            unzip awscliv2.zip
            ./aws/install --bin-dir /usr/bin --install-dir /usr/bin --update

  EC2STG2:
    Type: AWS::EC2::Instance
    Properties:
      InstanceType: t2.micro
      ImageId: !Ref LatestAmiId
      IamInstanceProfile: STGLabRoleForInstances
      KeyName: !Ref KeyName
      Tags:
        - Key: Name
          Value: EC2-STG2
      NetworkInterfaces:
        - DeviceIndex: 0
          SubnetId: !Ref ELBPublicSN2
          GroupSet:
          - !Ref ELBSG
          AssociatePublicIpAddress: true
          PrivateIpAddress: 10.40.2.10
      UserData:
        Fn::Base64:
          !Sub |
            #!/bin/bash
            hostnamectl --static set-hostname EC2-STG2
            yum install httpd tree tmux amazon-efs-utils -y
            systemctl start httpd && systemctl enable httpd
            echo "<html><h1>AFOS Study - Web Server 2</h1></html>" > /var/www/html/index.html
            curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
            unzip awscliv2.zip
            ./aws/install --bin-dir /usr/bin --install-dir /usr/bin --update

 


 

다음과 같이 나오면 STACK 생성 완료

 


 

EBS 기본 정보 확인

  • 루트 볼륨 확인
# df(disk free) 디스크 여유 공간 출력
[root@EC2-STG1 ~]# df -hT /dev/xvda1
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/xvda1     xfs   8.0G  1.8G  6.2G  23% /

# lsblk 사용 가능한 디스크 디바이스와 마운트 포인트(해당하는 경우)를 출력
[root@EC2-STG1 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /

# file -s 볼륨에 파일 시스템이 있는지 확인, data만 출력 시 파일 시스템이 없으므로 생성해야함
[root@EC2-STG1 ~]# file -s /dev/xvda
/dev/xvda: x86 boot sector; partition 1: ID=0xee, starthead 0, startsector 1, 16777215 sectors, extended partition table (last)\011, code offset 0x63

# 파일 시스템이 있으면 파일 시스템의 유형에 관한 정보 출력
[root@EC2-STG1 ~]# file -s /dev/xvda1
/dev/xvda1: SGI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)

# 디바이스의 UUID 찾기
[root@EC2-STG1 ~]# blkid
/dev/xvda1: LABEL="/" UUID="26620198-186a-404b-b9a1-12d957d7c826" TYPE="xfs" PARTLABEL="Linux" PARTUUID="bb798dfd-f745-4ebc-912f-e59071e955da"

# 디바이스의 탑재 시점 확인
[root@EC2-STG1 ~]# cat /etc/fstab
#
UUID=26620198-186a-404b-b9a1-12d957d7c826     /           xfs    defaults,noatime  1   1

 


 

EBS 신규 볼륨 생성(az1) 및 연결

  • [EC2 - EBS - 볼륨] 볼륨 생성 - 유형(SSD gp2) , 크기(20GiB) , AZ(az1) , 스냅샷ID(-) , 태그(Name : Data1) ⇒ 새로고침
  • [EC2 - EBS - 볼륨] 작업 - 볼륨 연결 - 인스턴스(EC2-STG1) , 디바이스 ⇒ EC2스토리지확인 (종료 시 수동 삭제 필요)

Name : data1-mym으로 수정후 생성


 

EC2-STG1 신규 볼륨 사용 설정

# 라이브 상태에서 디바이스 추가 확인
[root@EC2-STG1 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0  20G  0 disk

# 볼륨 ID 확인
[root@EC2-STG1 ~]# lsblk -o +SERIAL
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT SERIAL
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0  20G  0 disk

# data만 출력되므로 현재는 파일 시스템이 없음 - 생성해줘야함 
[root@EC2-STG1 ~]# file -s /dev/xvdf
/dev/xvdf: data

# 볼륨 포맷하여 파일시스템 생성
[root@EC2-STG1 ~]# mkfs -t xfs /dev/xvdf
meta-data=/dev/xvdf              isize=512    agcount=4, agsize=1310720 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=0
data     =                       bsize=4096   blocks=5242880, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0


# 디렉터리 생성 후 마운트
[root@EC2-STG1 ~]# mkdir /data
[root@EC2-STG1 ~]# mount /dev/xvdf /data

# 파일 생성 후 확인
[root@EC2-STG1 ~]# echo "EBS Test" > /data/memo.txt
[root@EC2-STG1 ~]# cat /data/memo.txt
EBS Test

# 디바이스 확인
[root@EC2-STG1 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0  20G  0 disk /data
[root@EC2-STG1 ~]#
[root@EC2-STG1 ~]# df -hT /dev/xvdf
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/xvdf      xfs    20G   53M   20G   1% /data

 


 

심화/옵션 : EC2 재부팅시에도 자동 mount 되게 설정 (실제 실습 X)

# 혹시 모르니 fstab 파일 백업
# fstab 에 대해서 추가 공부 필요(linux)
[root@ST1 ~]# cp /etc/fstab /etc/fstab.orig

# 재부팅이후에도 볼륨 자동 탑재를 위한 fstab 설정 (nofail:볼륨 없어도 부팅 가능)
[root@ST1 ~]# blkid
/dev/xvda1: LABEL="/" UUID="55da5202-8008-43e8-8ade-2572319d9185" TYPE="xfs" PARTLABEL="Linux" PARTUUID="591e81f0-99a2-498d-93ec-c9ec776ecf42"
/dev/xvdf: UUID="24c1a297-6d1f-4a69-8246-04643fcf58e9" TYPE="xfs"

echo "UUID=위blkid의자신의UUID입력  /data  xfs  defaults,nofail  0  2" >> /etc/fstab
[root@ST1 ~]# echo "UUID=999027bb-6f7a-4b22-866b-ca5e213720d0  /data  xfs  defaults,nofail  0  2" >> /etc/fstab

[root@ST1 ~]# cat /etc/fstab
UUID=55da5202-8008-43e8-8ade-2572319d9185     /           xfs    defaults,noatime  1   1
UUID=aebf131c-6957-451e-8d34-ec978d9581ae  /data  xfs  defaults,nofail  0  2

# 위 항목 설정이 잘 되었는지 확인을 위해서 탑재를 해제 후 다시 탑재합니다. 오류가 있을 시 문제를 출력합니다
[root@ST1 ~]# umount /data
[root@ST1 ~]# mount -a

# 재부팅 이후 자동으로 디바이스 탑재 및 생성한 파일 확인
[root@ST1 ~]# reboot
...
(재부팅 이후)
...

# 정상적으로 디스크 디바이스가 보이고 마운트 되어 있으며 생성한 파일을 확인 할 수 있다
[root@ip-172-31-0-26 ~]# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
xvda    202:0    0    8G  0 disk
└─xvda1 202:1    0    8G  0 part /
xvdf    202:80   0  100G  0 disk

[root@ip-172-31-0-26 ~]# cat /data/memo.txt
EBS Test

 


 

EC2-STG1 루트 볼륨 확장 및 볼륨 유형 변경 (탄력적 볼륨, 라이브 상태)

  • 볼륨 수정 : [EC2 - EBS - 볼륨] 루트볼륨 작업 - 볼륨 수정 - 볼륨 유형(gp3) , 크기(20 GiB) → 3~4분 정도 소요됨

  • 파일 시스템 확장 : 볼륨이 optimizing 상태가 되자마자 파일 시스템 크기 조정을 할 수 있다
    1. 파티션 늘림
    2. 파일시스템 늘림
# 현재 루트 볼륨이 20G로 반영되어 있는데 아직 xvda1 파티션 크기가 8G 이므로 파티션 확장 필요
[root@EC2-STG1 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  20G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0  20G  0 disk /data


# xvda1 크기 8G
[root@EC2-STG1 ~]# df -hT /dev/xvda1
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/xvda1     xfs   8.0G  1.8G  6.2G  23% /

# 1. growpart 명령어로 파티션 늘림
[root@EC2-STG1 ~]# growpart /dev/xvda 1
CHANGED: partition=1 start=4096 old: size=16773087 end=16777183 new: size=41938911 end=41943007

# 파티션 반영
[root@EC2-STG1 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  20G  0 disk
└─xvda1 202:1    0  20G  0 part /
xvdf    202:80   0  20G  0 disk /data

# 파일 시스템 반영 안됨
[root@EC2-STG1 ~]# df -hT /dev/xvda1
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/xvda1     xfs   8.0G  1.8G  6.2G  23% /


# 2. xfs_gorwfs 명령어로 볼륨의 파일 시스템 확장
[root@EC2-STG1 ~]# xfs_growfs -d /
meta-data=/dev/xvda1             isize=512    agcount=4, agsize=524159 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1 spinodes=0
data     =                       bsize=4096   blocks=2096635, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 2096635 to 5242363

# 최종적으로 파일시스템까지 20G 용량으로 확장
[root@EC2-STG1 ~]# df -hT /dev/xvda1
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/xvda1     xfs    20G  1.9G   19G  10% /

------------(심화 메모)---------------
# ext4 볼륨의 경우 아래 명령어로 확장한다
resize2fs /dev/xvda1
  • 추가로 EBS 볼륨을 연결 후 다시 해당 볼륨을 확장 시에도 위와 동일한 작업을 진행하면 됨

 


 

심화/옵션 : EC2-STG1의 루트 볼륨(EBS) Snapshot - 증분 백업 확인

# 더미 파일 생성
fallocate -l 10G /home/10G.dummy //의미없는 파일 생성
ls -alh /home/10G.dummy
df -hT /dev/xvda1
du -hs /home
  • [EC2 - EBS - 볼륨] 스냅샷 생성(루트 볼륨) - 설명(FirstSnatshot) 스냅샷 생성 클릭
  • [EC2 - EBS - 스냅샷] 클릭 후 진행 상황 확인 => 시간 확인하면 엄청 빠르다

증분 백업은 변경된 부분만 스냅샷 백업으로 빠름