
업계에서 가장 안전하고 광범위하고 안정적인 클라우드 플랫폼
전 세계 데이터 센터를 통해 완전한 기능을 갖춘 200개 이상의 서비스 제공
단 몇 분만에 전세게에 배포가 가능하다. 원하는 지역을 선택해서 서비스를 배포한다.

: 지리적 위치(국가 단위, 도시 단위)
각 Amazon EC2 Region은 다른 Amazon EC2 Region에서 격리되도록 설계되어 있다.
한 계정당 한 Region에서 사용할 수 있는 VPC는 5개이다. -> Support에서 풀 수 있다.
각 AWS Region은 세 개 이상의 가용 영역으로 구성되어 있다.
=> 안정성(=내결함성 유지)
사용자는 Region 간 데이터 복제를 활성화하고 제어 할 수 있다.(교차 Region)
Region 간 통신은 AWS 백본 네트워크 인프라를 사용한다.
인터넷도 사용할 수 있지만 대량의 데이터는 AWS 전용망을 쓰는 것이 유리할 수 있다.
지연 시간 최소화(근접 지역)
: 고객의 위치와 가깝게 선택한다.
비용 최소화(전송비용)
규정 준수 및 데이터 보존
: 기업의 데이터를 어떻게 관리하는지, 기업이 불법을 저질렀을 때 어떻게 하는지 다르기 때문에 region을 선택할 때 규정을 확인해야 한다.
서비스 가용성
: 각 Region 내의 데이터 센터와 연결된 논리적 그룹(단위)
region 안에는 Availability Zones(가용영역)이 있다.
지연 시간이 짧은 프라이빗 링크를 통해 다른 가용 영역과 상호 연결되어 있다.
ㄴ프라이빗 링크(Data center 간의 연결, 가용 영역 간의 연결)
가용영역을 지정 서비스와 비지정 서비스로 구분한다.
-> AZ 안에 있는 서비스와 AZ 밖에 있는 서비스
가용 영역을 지정하는 서비스는 주로 VPC 내에 위치한다.(EC2, RDS, Redshift, Elasticcache ...)
독립적으로 구성되어 있지만 동일 가용 영역과 다른 가용 영역의 속도 차이는 발생할 수 있다.
: 단일 데이터 센터에서 수만 개의 서버를 운영한다.(IDC)
모든 데이터 센터는 온라인으로 연결되어 있다.(hot-line)
가용영역은 데이터센터들의 집합이다. 데이터센터는 소규모로 구성해야 장애영역을 줄일 수 있다.
서비스 간의 전송은 초 단위 과금
웹서비스 구현 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을 통해 전세계의 각지역에 효율적인 속도로 컨텐츠를 제공한다.
부하분산
: CloudFront에 배치되지 않은 원본 서버를 Origin server라고 한다.
CloudFront를 이용하지 않으면 모든 트래픽이 Origin server에 집중되므로 CloudFront를 통해 부하분산을 할 수 있다.
: 확장 가능한 컴퓨팅 용량(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는 퍼블릭 키를 저장하고 사용자는 개인 키를 안전한 장소에 보관하는 방식)
: 인스턴스를 위한 CPU, 메모리, 스토리지, 네트워킹 용량의 여러 가지 구성을 제공
EC2 instace type의 선택은 한번에 최적의 타입을 선택하는 것이 아닌 지속적인 관찰을 통해 최적화 하는 과정이다. (최적화 도구, AWS Compute Optimizer)
실무에서는...
워크로드에 적합한 효율적인 instance를 사용중인가? -> 성능, 비용 최적화
불필요한 비용 절감을 위해 비용 효율적으로 EC2 자원을 사용하고 있는가?
=> 성능과 비용을 함께 고려해야 한다.

2022년 현재.
다양한 목적이나 특화된 워크로드에 적합한 450개 이상의 instance type 제공
: 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 구매로 인해 이번 달 예산은 초과되지 않고 예산에 맞게 진행할 수 있을 것 같습니다.







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












[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 주소가 몇개 필요할지 확인히 필요하다.- 보안 그룹 클릭
- 보안 그룹생성
: 인바운드, 아웃바운드 규칙
나가는 것은 모두 허용하고, 들어오는 것은 모두 거부한다.
[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


[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


## 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


개발자가 접근할 때
1) 임시 SSH key를 관리자(root)로 부터 발급받아서 접근
2) ppk를 이용한 SSH 접근 -> 내장된 key-pair로 인증
: 관리자가 IAM을 이용해서 AuthN과 AuthZ를 제공한다.
제공받은 사용자는 SSM을 이용해서 접근을 시도한다. systems manager의 session manager가 서비스를 제공한다.
ssmrole 생성 후 EC2에 보안의 권한 변경
Audit(감사) 수행 가능
: 누가 언제 들어가서 무슨 명령어를 쳤는지 알 수 있다.
1) CloudWatch에 log push(제공)
2) S3의 bucket에 logfile을 저장
IAM의 역할 탭 들어가기

역할만들기

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

이름 지정

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

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

IAM에서 만든 역할을 선택

연결 성공

S3에서 버킷 만들기



버킷 생성 확인

CloudWatch에서 로그 그룹 탭 클릭

로그 그룹 생성

확인

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

기본 설정 구성









cloudwatch에서 로그 확인 가능

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



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

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








EC2 접근방식
