[Cloud] 2일차 수업 정리

soyeon·2022년 10월 14일
post-thumbnail

AWS Global Infrastructure

AWS 지역 분포

업계에서 가장 안전하고 광범위하고 안정적인 클라우드 플랫폼
전 세계 데이터 센터를 통해 완전한 기능을 갖춘 200개 이상의 서비스 제공

단 몇 분만에 전세게에 배포가 가능하다. 원하는 지역을 선택해서 서비스를 배포한다.

Global Infrastructure 3요소

Region

: 지리적 위치(국가 단위, 도시 단위)

각 Amazon EC2 Region은 다른 Amazon EC2 Region에서 격리되도록 설계되어 있다.
한 계정당 한 Region에서 사용할 수 있는 VPC는 5개이다. -> Support에서 풀 수 있다.

각 AWS Region은 세 개 이상의 가용 영역으로 구성되어 있다.
=> 안정성(=내결함성 유지)

사용자는 Region 간 데이터 복제를 활성화하고 제어 할 수 있다.(교차 Region)
Region 간 통신은 AWS 백본 네트워크 인프라를 사용한다.
인터넷도 사용할 수 있지만 대량의 데이터는 AWS 전용망을 쓰는 것이 유리할 수 있다.

Region 선택 요소

  • 지연 시간 최소화(근접 지역)
    : 고객의 위치와 가깝게 선택한다.

  • 비용 최소화(전송비용)

  • 규정 준수 및 데이터 보존
    : 기업의 데이터를 어떻게 관리하는지, 기업이 불법을 저질렀을 때 어떻게 하는지 다르기 때문에 region을 선택할 때 규정을 확인해야 한다.

  • 서비스 가용성

AZ(Availability Zone)

: 각 Region 내의 데이터 센터와 연결된 논리적 그룹(단위)
region 안에는 Availability Zones(가용영역)이 있다.

지연 시간이 짧은 프라이빗 링크를 통해 다른 가용 영역과 상호 연결되어 있다.
ㄴ프라이빗 링크(Data center 간의 연결, 가용 영역 간의 연결)

가용영역을 지정 서비스비지정 서비스로 구분한다.
-> AZ 안에 있는 서비스와 AZ 밖에 있는 서비스
가용 영역을 지정하는 서비스는 주로 VPC 내에 위치한다.(EC2, RDS, Redshift, Elasticcache ...)
독립적으로 구성되어 있지만 동일 가용 영역과 다른 가용 영역의 속도 차이는 발생할 수 있다.

Data Center

: 단일 데이터 센터에서 수만 개의 서버를 운영한다.(IDC)

모든 데이터 센터는 온라인으로 연결되어 있다.(hot-line)

가용영역은 데이터센터들의 집합이다. 데이터센터는 소규모로 구성해야 장애영역을 줄일 수 있다.

서비스 간의 전송은 초 단위 과금

Edge Location(CDN)

웹서비스 구현 case 1) local
Route 53 -> DNS -> Domain
S3 -> 정적 웹 호스팅

웹서비스 구현 case 2) global
Route 53 -> DNS -> Domain
CloudFront -> CDN(비용이 비싸다)
S3 -> 정적 웹 호스팅

비디오 스트리밍 서비스를 하고 있는데 고객은 서울에 있다. 멀기 때문에 지연시간이 발생할 수 있다. Edge location으로 서비스를 배포하면 고객이 접근하는 순간 Edge location에서 가져다 쓰기 때문에 지연시간이 발생하지 않는다.

CDN(Content Delivery Network)
: 콘텐츠를 사용자들이 빠르게 받을 수 있도록 전 세계 곳곳에 위치한 캐시 서버에 복제해주는 서비스이다.
cache 서비스는 2번째 이용부터 효과가 발생한다.

CDN benefit

  • 캐싱
    : CDN을 통해 전세계의 각지역에 효율적인 속도로 컨텐츠를 제공한다.

  • 부하분산
    : CloudFront에 배치되지 않은 원본 서버를 Origin server라고 한다.
    CloudFront를 이용하지 않으면 모든 트래픽이 Origin server에 집중되므로 CloudFront를 통해 부하분산을 할 수 있다.

Amazon EC2 & EBS

EC2(Elastic Compute Cloud)

: 확장 가능한 컴퓨팅 용량(instance type)을 제공한다. -> 수평적/수직적 확장 가능
: 인스턴스(휘발성 서버) -> 가상 컴퓨팅 환경

Server및 가상머신과 유사 -> VM image = AMI
Workload에 따라 인텔 x86, AMD, Arm 기반의 아키텍처 기반의 EC2 선택

Gravition3 => Amazon

AMI(Amazon Machine Image)
서버에 필요한 운영체제와 여러 소프트웨어들이 적절히 구성된 상태로 제공되는 시작 템플릿으로 인스턴스를 쉽게 만들 수 있다.

시작 템플릿은 auto scaling에서 사용된다.

VM - OVF, container - OCI

하드웨어에 선 투자할 필요가 없어 더 빠르게 애플리케이션을 개발하고 배포가 가능하다
=> 온디멘드 방식(종량과금제) 쓴 만큼 돈내세요

원하는 만큼 가상 서버를 구축하고 보안(보안그룹) 및 네트워크 구성(VPC)과 스토리지(S3, EBS, ...) 관리가 가능하다. + NACL (접근제어)

요구사항이나 갑작스러운 인기 증대 등 변동 사항에 따라 신속하게 규모를 확대하거나 축소할 수 있어 서버 트래픽 예측 필요성이 감소한다. => 운영의 효율성

MacOS Instance 지원을 통해 개발자 환경 지원
: 인프라 대신 코드에 집중, DevOps Pipeline 통합(자동화), 다양한 AWS 서비스와 통합 가능

키 페어(*.pem => *.ppk)를 사용하여 인스턴스 로그인 정보보호(AWS는 퍼블릭 키를 저장하고 사용자는 개인 키를 안전한 장소에 보관하는 방식)

instance 유형(type, spec)

: 인스턴스를 위한 CPU, 메모리, 스토리지, 네트워킹 용량의 여러 가지 구성을 제공

EC2 instace type의 선택은 한번에 최적의 타입을 선택하는 것이 아닌 지속적인 관찰을 통해 최적화 하는 과정이다. (최적화 도구, AWS Compute Optimizer)

실무에서는...
워크로드에 적합한 효율적인 instance를 사용중인가? -> 성능, 비용 최적화
불필요한 비용 절감을 위해 비용 효율적으로 EC2 자원을 사용하고 있는가?
=> 성능과 비용을 함께 고려해야 한다.

2022년 현재.
다양한 목적이나 특화된 워크로드에 적합한 450개 이상의 instance type 제공

EC2 instance 표기법

: Application workload에 맞는 instance 선택

  • instance family
    : M, T, C, X, R ...

  • instance 세대
    : instance family에 따른 1~6 세대 선택

  • 추가기능
    a - AMD 프로세서
    g - AWS Gravition 프로세서
    i - 인텔 프로세서
    d - 인스턴스 스토어 볼륨(ephemeral volume)
    n - 네트워크 최적화
    b - 블록 스토리지 최적화
    e - Enhanced performance
    ...

  • instance size
    nano, micro, small, medium, large, xlarge, 2xlarge, ...

요금

클라우드 운영팀
워크로드 증가로 인해 데이터베이스(RDS)를 하나 추가하여 이번 탈 클라우드 사용 비용이 증가할 예정입니다.

재무팀
RDS 추가 시 이번 달 예산이 초과됩니다. 비용 절약을 위해 RDS 예약 인스턴스(RI) 구매를 통해 하는게 어떨까요?

클라우드 운영팀
일정한 워크로드가 예상되니 RI 사용이 비용절감에 도움이 될 것 같네요. 이번 RDS 추가는 RI를 통해 진행하겠습니다.

재무팀
반영해 주셔서 감사합니다. RI 구매로 인해 이번 달 예산은 초과되지 않고 예산에 맞게 진행할 수 있을 것 같습니다.

실습

APM(Apache + PHP + MySQL) server -> APM EC2 Instance -> shellscript

  • EC2 인스턴스 시작
  • AMI 선택
  • 인스턴스 유형 선택 - t2.micro
  • 키 페어 생성
  • 다운로드 확인 - pem 파일 생성
  • 키 페어 선택
  • 네트워크 설정

=> 기본 VPC 사용, subnet도 기본 설정 사용

  • 만든 보안그룹 사용
  • 스토리지 구성
  • 사용자 데이터 넣기
  • 성공
  • 인스턴스가 만들어졌다.
  • putty로 연결하기
  • IP와 이름 설정
  • username 설정
  • key 넣기
  • 보안그룹에서 22를 열지 않아서 연결이 안된다. 인바운드 규칙을 넣어주어야 한다.

  • 다시 로그인하면 연결이 성공된다.
  • httpd와 mariadb running 중인지 확인
[ec2-user@ip-172-31-1-231 ~]$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/httpd.service.d
           └─php-fpm.conf
   Active: active (running)

[ec2-user@ip-172-31-1-231 ~]$ sudo systemctl status mariadb
● mariadb.service - MariaDB 10.2 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; enabled; vendor preset: disabled)
  Drop-In: /usr/lib/systemd/system/mariadb.service.d
           └─tokudb.conf
   Active: active (running)
   
[ec2-user@ip-172-31-1-231 ~]$ mysql -uroot
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.2.38-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

putty 연결에는 ppk로 workbench 연결에는 pem을 사용한다.
pem -> ppk로 변경

  • putty gen 실행해서 Load 선택
  • 다운로드 받은 pem 파일 선택
  • save private key 선택


  • kakao-oeckikek.ppk로 이름 설정해서 저장

VPC 설정

  • VPC에서 EC2에서 설정한 것과 같은 이름인 것을 확인할 수 있다

    기본 VPC에는 subnet이 4개가 존재한다.

    => 설계할 때 IP 주소가 몇개 필요할지 확인히 필요하다.
  • 보안 그룹 클릭
  • 보안 그룹생성

: 인바운드, 아웃바운드 규칙
나가는 것은 모두 허용하고, 들어오는 것은 모두 거부한다.

  • meta-data 확인하기
[ec2-user@ip-172-31-1-231 ~]$ curl http://169.254.169.254/latest/meta-data
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
events/
hostname
identity-credentials/
instance-action
instance-id
instance-life-cycle
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
services/
system

## public ip 확인하기
[ec2-user@ip-172-31-1-231 ~]$ curl http://169.254.169.254/latest/meta-data/public-ipv4
3.34.200.148

## 보안 그룹 확인
[ec2-user@ip-172-31-1-231 ~]$ curl http://169.254.169.254/latest/meta-data/security-groups
myapm-sg
  • http://3.34.200.148/phpinfo.php 연결하려면 인바운드 규칙을 추가해야 한다.
  • 다시 접속해보면 된다.
  • index.html 새로 만들어서 /var/www/html/ 경로로 넣어준다.
[ec2-user@ip-172-31-1-231 ~]$ vi index.html
<html>
 <head>
  <title>AWS EC2 http Running Sample App</title>
   <style>body {margin-top: 40px; background-color: #333;} </style>
  <meta http-equiv="refresh" content="3" >
 </head>
 <body>
  <div style=color:white;text-align:center>
   <h1> AWS EC2 http Application. </h1>
   <h2> Great Works! </h2>
    <p>Application is now good running on a AWS EC2 http.</p>
  </div>
 </body>
</html>
[ec2-user@ip-172-31-1-231 ~]$ sudo cp index.html /var/www/html/index.html
## 패스워드 설정
[ec2-user@ip-172-31-1-231 ~]$ sudo /usr/bin/mysql_secure_installation
enter
Y
pass123#
pass123#
Y
n
Y
Y

## 패스워드로 접속
[ec2-user@ip-172-31-1-231 ~]$ mysql -uroot -p

## 이 주소를 workbench 연결할 때 Hostname으로 사용한다.
[ec2-user@ip-172-31-1-231 ~]$ ifconfig
...
        inet 172.31.1.231  netmask 255.255.240.0  broadcast 172.31.15.255
  • workbench 연결
  • sql 실행
  • 데이터베이스의 데이터 확인해보기
## index.php 파일 작성
[ec2-user@ip-172-31-1-231 ~]$ vi index.php
<?php

     $mysql_hostname = 'ip-172-31-1-231.ap-northeast-2.compute.internal';
     $mysql_username = 'root';
     $mysql_password = 'pass123#';
     $mysql_database = 'prod';

     $connect = mysqli_connect($mysql_hostname, $mysql_username, $mysql_password, $mysql_database);

     if(!$connect){
        echo '[connection fail] : '.mysql_error().'';
        die('MySQL 접속 실패.');
     } else {
        echo "[Kevin Web:첫 번째 EC2 에서 MySQL 서버 접근 성공!]\n";
     }

     $sql = "SELECT * FROM product";
     $result = mysqli_query($connect, $sql);
     echo "Table query result : ";
     var_dump($result->num_rows);

     $result2 = mysqli_query($connect,"SELECT * FROM product");
     echo "<table border='1'> <tr> <th>prod_id</th> <th>prod_name</th>";
     $n = 1;
     while($row = mysqli_fetch_array($result2)){
     echo "<tr>";
     echo "<td>" . $row['prod_id'] . "</td>";
     echo "<td>" . $row['prod_name'] . "</td>";
     echo "</tr>";
     $n++;
     }
     echo "</table>";
     mysqli_close($conn);
?>

## 복사
[ec2-user@ip-172-31-1-231 ~]$ sudo cp index.php /var/www/html/index.php
## index.php 파일 작성
[ec2-user@ip-172-31-1-231 ~]$ vi index.php
<?php

     $mysql_hostname = 'ip-172-31-1-231.ap-northeast-2.compute.internal';
     $mysql_username = 'root';
     $mysql_password = 'pass123#';
     $mysql_database = 'prod';

     $connect = mysqli_connect($mysql_hostname, $mysql_username, $mysql_password, $mysql_database);

     if(!$connect){
        echo '[connection fail] : '.mysql_error().'';
        die('MySQL 접속 실패.');
     } else {
        echo "[Kevin Web:첫 번째 EC2 에서 MySQL 서버 접근 성공!]\n";
     }

     $sql = "SELECT * FROM books";
     $result = mysqli_query($connect, $sql);
     echo "Table query result : ";
     var_dump($result->num_rows);

     $result2 = mysqli_query($connect,"SELECT * FROM product");
     echo "<table border='1'> <tr> <th>ISBN</th> <th>Title</th> <th>Author</th> <th>Format</th>";
     $n = 1;
     while($row = mysqli_fetch_array($result2)){
     echo "<tr>";
     echo "<td>" . $row['ISBN'] . "</td>";
     echo "<td>" . $row['Title'] . "</td>";
     echo "<td>" . $row['Author'] . "</td>";
     echo "<td>" . $row['Format'] . "</td>";
     echo "</tr>";
     $n++;
     }
     echo "</table>";
     mysqli_close($conn);
?>

## 복사
[ec2-user@ip-172-31-1-231 ~]$ sudo cp index.php /var/www/html/index.php

EC2 접근 방식

개발자가 접근할 때
1) 임시 SSH key를 관리자(root)로 부터 발급받아서 접근
2) ppk를 이용한 SSH 접근 -> 내장된 key-pair로 인증

AWS SSM(AWS Session Manager)

: 관리자가 IAM을 이용해서 AuthN과 AuthZ를 제공한다.
제공받은 사용자는 SSM을 이용해서 접근을 시도한다. systems manager의 session manager가 서비스를 제공한다.
ssmrole 생성 후 EC2에 보안의 권한 변경

Audit(감사) 수행 가능
: 누가 언제 들어가서 무슨 명령어를 쳤는지 알 수 있다.
1) CloudWatch에 log push(제공)
2) S3의 bucket에 logfile을 저장

실습

Session Manager 연결하기

  • IAM의 역할 탭 들어가기

  • 역할만들기

  • 권한 정책 선택 (SSM - 감사)

  • 이름 지정

  • 역할생성 클릭하면 생성된다.

  • EC2에서 보안 - IAM 역할 수정 클릭

  • IAM에서 만든 역할을 선택

  • 연결 성공

  • S3에서 버킷 만들기

  • 버킷 생성 확인

  • CloudWatch에서 로그 그룹 탭 클릭

  • 로그 그룹 생성

  • 확인

  • Systems Manager에서 세션 관리자 탭 클릭

  • 기본 설정 구성

  • EC2 재부팅
  • 연결 버튼이 활성화되었다.
  • 들어가서 로그 남겨보기 (exit까지 해야 로그가 남겨진다.)

  • cloudwatch에서 로그 확인 가능

  • s3에서 정책 작성 (bucket에 log를 저장하기 위해서)

s3 bucket에도 log가 생긴 것 확인 가능

생성한 것 버리기

: 안에 있는컨텐츠 먼저 버리고 삭제한다.

  • CloudWatch에서 Enable 한것 체크 해제
  • S3에서 log 삭제

  • S3에서 bucket 삭제

  • CloudWatch에서 로그 그룹 삭제
  • IAM에서 역할 삭제
  • instance 삭제

EC2 접근방식

0개의 댓글