Skip to content

Commit

Permalink
Merge pull request #57 from gdsc-ssu/week17/rsh
Browse files Browse the repository at this point in the history
[week17] AWS COOK BOOK 2.2 서브넷/라우팅 테이블, 2.3 인터넷 게이트웨이
  • Loading branch information
ryuseunghan authored Sep 24, 2024
2 parents c224142 + 7498dc9 commit 16fce09
Show file tree
Hide file tree
Showing 28 changed files with 271 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
### 문제 설명
- 리소스 분할 및 중복을 위해 개별 IP 공간으로 구성한 VPC 네트워크를 생성해야 함
### 해결 방안
- VPC 내에 라우팅 테이블을 생성한다. VPC의 다른 가용 영역에 서브넷 2개를 생성한다.

### 복습해봅시다 - VPC 생성

*클라우드 리소스를 호스팅한 네트워크 구축*
- 그림 2-1과 같이 AMAZON VPC를 생성하고 이에 대한 CIDR 블록 구성

CIDR 이란?
- IP 주소와 그 서브넷 마스크를 나타내는 방법으로, 네트워크 주소 할당과 라우팅에 사용
- CIDR 표기법은 IP 주소 뒤에 슬래시(`/`)를 붙이고, 그 뒤에 네트워크 프리픽스(서브넷 마스크의 길이)를 적습니다. 예를 들어, `192.168.0.0/24`와 같은 형태
- **Virtual Private Cloud 생성**
Virtual Private Cloud(VPC)는 클라우드 내에서 호스팅되는 프라이빗 디지털 공간입니다. VPC를 사용하면 격리되고 안전한 환경에 워크로드를 프로비저닝할 수 있습니다. VPC는 연결된 디바이스 간에 데이터 패킷을 전송할 때 CIDR IP 주소를 사용합니다.
출처 : AWS 공식 문서

1. IPV4 CIDR 블록을 가진 VPC를 생성. 주소 범위로 10.10.0.0/16을 사용. 주소 범위는 필요에 따라 다른 범위로 수정 가능
```
VPC_ID=$(aws ec2 create-vpc --cidr-block 10.10.0.0/23 \
--tag-specifications \
'ResourceType=vpc,Tags=[{Key=Name,Value=AWSCookbook202}]' \
--output text --query Vpc.VpcId)
```

- **VPC_ID=...**
- 명령의 출력을 변수 `aws ec2`에 저장
- **aws ec2 create-vpc:**
- `create-vpc`는 새로운 VPC를 생성하는 서브 명령어
- **--cidr-block 10.10.0.0/23**:
- `--cidr-block`은 VPC의 IP 주소 범위를 지정
- `10.10.0.0/23`은 이 VPC에 할당된 IP 주소 범위를 나타냅니다. 여기서 `/23`은 서브넷 마스크를 나타내며, 총 512개의 IP 주소를 포함
- **--tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=AWSCookbook202}]'**:
- `--tag-specifications`는 VPC에 태그를 지정
- `'ResourceType=vpc,Tags=[{Key=Name,Value=AWSCookbook202}]'`은 태그의 키가 `Name`이고 값이 `AWSCookbook202`인 태그를 VPC에 추가
- **--output text**:
- `--output` 옵션은 명령의 출력 형식을 지정
- `text`는 출력 형식을 간단한 텍스트 형식으로 지정
- **--query Vpc.VpcId**:
- `--query` 옵션은 출력에서 특정 부분을 추출하는 데 사용
- `Vpc.VpcId`는 생성된 VPC의 ID를 추출
- 유효성 검사 **aws ec2 describe-vpcs --vpc-ids $VPC_ID**
```
$ aws ec2 describe-vpcs --vpc-ids $VPC_ID
{
"Vpcs": [
{
"CidrBlock": "10.10.0.0/23",
"DhcpOptionsId": "dopt-0535c42b101c41626",
"State": "available",
"VpcId": "vpc-0d93a7f74b97eb1e7",
"OwnerId": "951192624022",
"InstanceTenancy": "default",
"CidrBlockAssociationSet": [
{
"AssociationId": "vpc-cidr-assoc-03cda77518ce24302",
"CidrBlock": "10.10.0.0/23",
"CidrBlockState": {
"State": "associated"
}
}
],
"IsDefault": false,
"Tags": [
{
"Key": "Name",
"Value": "AWSCookbook202"
}
]
}
]
}
```

### 서브넷과 라우팅 테이블을 포함한 네트워크 티어 생성
![[Pasted image 20240629175514.png]]
v
![[Pasted image 20240629175442.png]]

**라우팅 테이블 (Route Table)**
- VPC의 서브넷 내의 트래픽이 어디로 향할지를 결정하는 규칙 집합
- 각 서브넷은 하나의 라우팅 테이블과 연결되어 있음

**라우팅 테이블을 만드는 이유**
- 라우터란 목적지이고 라우팅 테이블은 각 목적지에 대한 이정표
- 데이터는 라우터로 향하게 되며 네트워크 요청은 각각 정의 된 라우팅 테이블에 따라 작동
![[Pasted image 20240629180227.png]]
- 서브넷 A의 라우팅 테이블은 172.31.0.0/16 즉 VPC안의 네트워크 범위를 갖는 네트워크 요청은 로컬에서 찾도록 되어있음

1. **라우팅 테이블 생성, 이제 연결된 서브넷에 사용자 지정 트래픽 경로를 만들 수 있음.
```
ROUTE_TABLE_ID=$(aws ec2 create-route-table --vpc-id $VPC_ID --tag-specifications \ 'ResourceType=route-table,Tags=[{Key=Name,Value=AWSCookbook282}]' --output text --query RouteTable.RouteTableId)
```
- `ROUTE_TABLE_ID=$(...)`: 명령의 출력을 `ROUTE_TABLE_ID` 변수에 저장
- `aws ec2 create-route-table`: 새로운 라우트 테이블을 생성하는 AWS CLI 명령
- `--vpc-id $VPC_ID`: 이전에 생성한 VPC의 ID를 지정-
- `--tag-specifications 'ResourceType=route-table,Tags=[{Key=Name,Value=AWSCookbook282}]'`: 생성된 라우트 테이블에 태그를 지정, `Key``Name`, `Value``AWSCookbook202`
- `--output text`: 출력 형식을 텍스트로 지정
- `--query RouteTable.RouteTableId`: 출력에서 라우트 테이블 ID만 추출

2. **각 AZ에 2개의 서브넷을 생성한다. 이제 VPC 용 리소스를 생성하기 위한 주소 공간을 사용할 수 있다.
**VPC에서 사용하는 사설 아이피 대역
- 10.0.0.0 ~ 10.255.255.255(10/8 prefix)
- 172.16.0.0 ~ 172.31.255.255(182.16/12 prefix)
- 192.168.0.0 ~ 192.168.255.255(192.168/16 prefix)

**서브넷
- VPC를 잘개 쪼개는 과정
- 서브넷은 VPC 안에 있는 VPC보다 더 작은 단위이기 때문에 당연히 서브넷 마스크가 더 높아지고 아이피범위가 더 작은 값을 가짐
- 서브넷을 나누는 이유는 더 많은 네트워크망을 만들기 위함
```
# 첫 번째 서브넷 생성
SUBNET_ID_1=$(aws ec2 create-subnet --vpc-id $VPC_ID \
--cidr-block 10.10.0.0/24 --availability-zone ${AWS_REGION}a \
--tag-specifications \
'ResourceType=subnet,Tags=[{Key=Name,Value=AWSCookbook202a}]' \
--output text --query Subnet.SubnetId)
# 두 번째 서브넷 생성
SUBNET_ID_2=$(aws ec2 create-subnet --vpc-id $VPC_ID \
--cidr-block 10.10.1.0/24 --availability-zone ${AWS_REGION}b \
--tag-specifications \
'ResourceType=subnet,Tags=[{Key=Name,Value=AWSCookbook202b}]' \
--output text --query Subnet.SubnetId)
```
- **`create-subnet`**: 새로운 서브넷을 생성
- **`--vpc-id $VPC_ID`**: 이전에 생성한 VPC의 ID를 지정
- **`--cidr-block 10.10.0.0/24`**: 서브넷의 CIDR 블록을 지정
- **`--availability-zone ${AWS_REGION}a`**: 서브넷이 속할 가용 영역을 지정
- **`--tag-specifications 'ResourceType=subnet,Tags=[{Key=Name,Value=AWSCookbook202a}]'`**: 서브넷에 태그를 지정
- **`--output text --query Subnet.SubnetId`**: 출력 형식을 텍스트로 지정하고, 서브넷 ID를 추출

3. **라우팅 테이블을 2개의 서브넷과 연결
```
# 첫 번째 서브넷에 라우팅 테이블 연결
aws ec2 associate-route-table \
--route-table-id $ROUTE_TABLE_ID --subnet-id $SUBNET_ID_1
# 두 번째 서브넷에 라우팅 테이블 연결
aws ec2 associate-route-table \
--route-table-id $ROUTE_TABLE_ID --subnet-id $SUBNET_ID_2
```
- **`associate-route-table`**: 라우팅 테이블을 서브넷에 연결하는 명령어
- **`--route-table-id $ROUTE_TABLE_ID`**: 이전에 생성한 라우팅 테이블의 ID를 지정
- **`--subnet-id $SUBNET_ID_1`**: 첫 번째 서브넷의 ID를 지정
4. **서브넷 정보 조회**
```
aws ec2 describe-subnets --subnet-ids $SUBNET_ID_1 $SUBNET_ID_2
```
- **`describe-subnets`**: 지정된 서브넷에 대한 정보를 반환하는 AWS CLI 명령어
![[Pasted image 20240629183256.png]]
```
aws ec2 describe-route-tables --route-table-ids $ROUTE_TABLE_ID
```
![[Pasted image 20240629184023.png]]
1. **RouteTables**:
- 라우팅 테이블의 리스트
2. **Associations**:
- 이 라우팅 테이블과 연관된 서브넷이나 게이트웨이의 리스트
3. **PropagatingVgws**:
- 경로 전파를 허용하는 가상 게이트웨이 리스트
4. **RouteTableId**:
- 라우팅 테이블의 ID
5. **Routes**:
- 이 라우팅 테이블에 정의된 경로들의 리스트
- **DestinationCidrBlock**: 대상 CIDR 블록, `10.10.0.0/23`으로 설정되어 있음
- **GatewayId**: 이 경로를 처리하는 게이트웨이의 ID, `local`은 VPC 내의 로컬 경로임을 의미
- **Origin**: 경로의 생성 원본, `CreateRouteTable`은 이 경로가 라우팅 테이블 생성 시 기본적으로 만들어진 것임을 의미
- **State**: 경로의 상태, `active`는 이 경로가 활성 상태임을 나타냅니다.
6. **Tags**:
- 라우팅 테이블에 설정된 태그들의 리스트
7. **VpcId**:
- 이 라우팅 테이블이 속한 VPC의 ID
8. **OwnerId**:
- 라우팅 테이블의 소유자 AWS 계정 ID


### REFERENCE
https://aws.amazon.com/ko/what-is/cidr/
https://medium.com/harrythegreat/aws-%EA%B0%80%EC%9E%A5%EC%89%BD%EA%B2%8C-vpc-%EA%B0%9C%EB%85%90%EC%9E%A1%EA%B8%B0-71eef95a7098
https://velog.io/@chchaeun/AWS-%ED%81%B4%EB%9D%BC%EC%9A%B0%EB%93%9C-%EA%B5%AC%EC%B6%95-2-VPC-%EA%B5%AC%EC%B6%95%EC%84%9C%EB%B8%8C%EB%84%B7-%EB%9D%BC%EC%9A%B0%ED%8C%85-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%9D%B8%ED%84%B0%EB%84%B7-%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
### 문제 설명
- VPC의 서브넷에서 기존에 실행 중인 EC2 인스턴스가 인터넷을 통해 클라이언트와 통신해야한다.
### 해결 방안
- 인터넷 게이트웨이를 생성해 VPC에 연결한다. EC2 인스턴스의 서브넷에서 인터넷 게이트웨이로 트래픽을 보내는 경로를 추가한다. 마지막으로 그림과 같이 탄력적 IP 주소를 생성해 인스턴스와 연결한다.
![[Pasted image 20240629192635.png]]
**인터넷 게이트웨이가 필요한 이유**
- 라우터와 라우팅 테이블을 통해 데이터는 라우터로 향하게 되며 네트워크 요청은 각각 정의된 라우팅 테이블에 따라 작동.
- 이때 라우팅 테이블은 VPC 안의 네트워크 범위를 갖는 네트워크 요청은 로컬에서 찾음
- 하지만 네트워크 범위 외에 외부로 통하는 트래픽은 처리할 수 없기에 인터넷 게이트웨이 사용

**인터넷게이트웨이**
![[Pasted image 20240629193607.png]]
- VPC와 인터넷을 연결해주는 하나의 관문
- 서브넷 B의 라우팅테이블에서 0.0.0.0/0으로 정의되어 있으며, 이는 모든 트래픽에 대하여 IGA(인터넷게이트웨이) A로 향한다는 뜻
- 라우팅 테이블은 가장 먼저 목적지의 주소가 172.31.0.0/16에 매칭되는지를 확인한 후 매칭되지 않는다면 IGA A로 보냄
- 인터넷과 연결 된 서브넷을 퍼블릭 서브넷, 인터넷과 연결 되지 않은 서브넷을 프라이빗 서브넷이라고 칭함

1. **인터넷 게이트웨이를 생성한다.
```
INET_GATEWAY_ID=$(aws ec2 create-internet-gateway \
--tag-specifications \
'ResourceType=internet-gateway,Tags=[{Key=Name,Value=AWSCookbook202}]' \
--output text --query InternetGateway.InternetGatewayId)
```
- `INET_GATEWAY_ID=$(...)`: 명령의 출력을 `INET_GATEWAY_ID` 변수에 저장
- `aws ec2 create-internet-gateway`: 새로운 인터넷 게이트웨이를 생성하는 AWS CLI 명령
- `--tag-specifications 'ResourceType=internet-gateway,Tags=[{Key=Name,Value=AWSCookbook202}]'`: 생성된 인터넷 게이트웨이에 태그를 지정, `Key``Name`, `Value``AWSCookbook202`
- `--output text`: 출력 형식을 텍스트로 지정
- `--query InternetGateway.InternetGatewayId`: 출력에서 인터넷 게이트웨이 ID만 추출

2. **인터넷 게이트웨이를 가진 기존 VPC에 연결한다
```
aws ec2 attach-internet-gateway \
--internet-gateway-id $INET_GATEWAY_ID --vpc-id $VPC_ID
```
- `aws ec2 attach-internet-gateway`: 인터넷 게이트웨이를 VPC에 연결
- `--internet-gateway-id $INET_GATEWAY_ID`: 이전에 생성한 인터넷 게이트웨이의 ID를 지정, 변수 `$INET_GATEWAY_ID`에 저장된 값
- `--vpc-id $VPC_ID`: 인터넷 게이트웨이를 연결할 VPC의 ID를 지정

3. **VPC의 각 라우팅 테이블에서 기본 경로 대상을 인터넷 게이트웨이로 설정하는 경로를 생성한다
```
aws ec2 create-route --route-table-id $ROUTE_TABLE_ID_1 \
--destination-cidr-block 0.0.0.0/0 --gateway-id $INET_GATEWAY_ID
aws ec2 create-route --route-table-id $ROUTE_TABLE_ID_2 \ --destination-cidr-block 0.0.0.0/0 --gateway-id $INET_GATEWAY_ID
```
- `aws ec2 create-route`: 새로운 라우트를 생성
- `--route-table-id $ROUTE_TABLE_ID_1`: 첫 번째 라우트 테이블의 ID를 지정, 변수 `$ROUTE_TABLE_ID_1`에 저장된 값
- `--destination-cidr-block 0.0.0.0/0`: 기본 경로를 지정하여 모든 트래픽을 라우트
- `--gateway-id $INET_GATEWAY_ID`: 인터넷 게이트웨이의 ID를 지정, 변수 `$INET_GATEWAY_ID`에 저장된 값
4. **EIP(탄력적 ip 주소)를 생성한다
```
ALLOCATION_ID=$(aws ec2 allocate-address --domain vpc \
--output text --query AllocationId)
```
- `ALLOCATION_ID=$(...)`: 명령의 출력을 `ALLOCATION_ID` 변수에 저장
- `aws ec2 allocate-address`: 새로운 탄력적 IP 주소를 할당
- `--domain vpc`: 탄력적 IP 주소를 VPC에 할당하도록 지정
- `--output text`: 출력 형식을 텍스트로 지정
- `--query AllocationId`: 출력에서 탄력적 IP 주소의 할당 ID만 추출

5. **EIP를 기존 EC2 인스턴스와 연결한다
```
aws ec2 associate-address \
--instance-id $INSTANCE_ID --allocation-id $ALLOCATION_ID
```
- `aws ec2 associate-address`: 탄력적 IP 주소를 인스턴스에 연결
- `--instance-id $INSTANCE_ID`: 탄력적 IP 주소를 연결할 인스턴스의 ID를 지정
- `--allocation-id $ALLOCATION_ID`: 탄력적 IP 주소의 할당 ID를 지정
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file added Pasted image 20240629175442.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Pasted image 20240629175514.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Pasted image 20240629180227.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Pasted image 20240629183256.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Pasted image 20240629184023.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Pasted image 20240629192635.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Pasted image 20240629193008.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added Pasted image 20240629193607.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Empty file added Untitled.md
Empty file.
22 changes: 22 additions & 0 deletions review/week17/유승한.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
### CloudWatch
AWS에서 제공하는 AWS 내 자원과 애플리케이션에 대한 모니터링 및 관리 서비스
CloudWatch는 대시보드, 이벤트, 경보, 로그, 지표로 구성되어 있습니다.
### CloudWatch 지표

CloudWatch 지표는 **언제** 어떤 **항목******이 무엇이었는지를 기록한 값으로 AWS 내의 대부분의 서비스 이력이 기록됩니다.

예를 들어 EC2 인스턴스의 CPU 사용량, 네트워크 전송량, AutoScaling 그룹이 관리하는 인스턴스 수등의 값들이 지표로 남습니다.

이런 값들을 별도로 설정하지 않아도 서비스를 이용하면 AWS에서 자동으로 기록해줍니다.

기본으로 제공되는 지표 외에도 사용자가 지정한 지표들(회원 수, 비동기 작업 수, 접속자 수) 등의 값을 기록할 수 있습니다.

단순 지표 뿐만 아니라 그래프 등 다양한 방법으로 시각화할 수 있습니다.

ex ) 만약 EC2 인스턴스의 CPU 점유율을 보고 싶다

EC2 → namespace

CPU 점유율 → 지표 값

이때 인스턴스 개별로 보거나 유형으로 묶어서 보거나 오토스케일링 그룹으로 묶어서 보는 것 → dimension

0 comments on commit 16fce09

Please sign in to comment.