AWS 네트워크 구성

VPC (Virtual private cloud)

공식 문서

AWS 상에서 내가 사용할 클라우드 자원의 네트워크를 직접 구성하는 서비스이다.

네트워크 망 구성도
VPC 구성도

일반적인 네트워크 망은 수많은 물리적 장비를 직접 설치하고 구성 및 구축까지 해야하지만

VPC는 클라우드 서비스이므로 물리적 장비를 직접 설치할 필요가 없다.

망의 논리적인 구조를 웹 콘솔에서 관리하고 네트워크 정책을 설정할 수 있다.

관련 서비스로는 Subnet, Internet gateway, Route table, Security group 등이 존재한다.

VPC 생성

AWS의 VPC 메뉴로 접속하여 생성 버튼을 누른다.

적절한 이름을 생성하고 IP 주소는 CIDR 주소로 입력한다.

미리 정의된 사설 IP 대역(참고)을 활용하여 적절한 C 클래스의 주소를 넣어보자.

C 클래스의 경우 서브넷마스크가 255.255.255.0 이기 때문에 이 VPC 망에서 사용 가능한 호스트는 256개이다.

(왜 256개인지 이해되지 않는다면 CIDR 표기법을 다시 공부해야 한다)

참고로 여기에 입력하는 IP 주소는 private 주소가 되며 VPC 망 내에서만 인식이 가능하다.

public IP 주소는 AWS가 직접 관리하기 때문에 사용자가 컨트롤할 수 없다.

이번 실습에서는 10.20.30.0/24 대역을 사용한다.

서브넷

서브넷마스크와 유사한 서비스이다.

할당된 네트워크를 더욱 작은 단위로 쪼개어 효율적으로 망을 구성할 수 있도록 돕는다.

즉, VPC가 하나의 큰 망이면 서브넷은 작은 단위의 망이라고 볼 수 있다.

위에서 만든 VPC는 최대 256개의 호스트를 갖는데, 이 안에서 더 세밀하게 망을 구성해본다.


  • 관리용으로 사용할 Subnet: 32개의 호스트
    • bastion 서버로 사용 (아래에서 따로 설명)
  • 내부망으로 사용할 Subnet: 32개의 호스트
    • Database 등 외부에 직접 노출하지 않을 인프라 구성
    • VPC 내부에서만 접근 가능
  • 외부망으로 사용할 Subnet: 64개의 호스트, 2개 구성
    • 외부에서 접속 가능한 Application 구성
    • 외부의 트래픽을 견뎌야 하기 때문에 호스트의 수를 가장 많이 할당(총 128개)
    • 리전은 서울로 선택
    • Availability Zone(가용영역, AZ)은 ap-northeast-2a, 2b, 2c, 2d가 존재
      • AZ는 데이터 센터를 의미한다.
      • 특정 AZ가 장애가 발생해도 서비스를 유지하려면 2개의 subnet을 다른 AZ로 생성하는 것이 좋다.
      • 2b는 EC2 인스턴스가 생성되지 않는다. 2a와 2c에 1개씩 구성한다.

서브넷 생성

서브넷 메뉴로 접속하면 아래와 같은 화면이 나타난다.

방금 생성한 VPC를 선택하면 아래 서브넷 설정 탭의 내용이 변경된다.

  1. 서브넷 이름은 용도에 맞게 적당히 넣어주면 된다.
  2. 가용 영역(AZ)는 한 곳에 집중되지 않게 선택한다. 특히 외부망 2개 서브넷은 꼭 다른 AZ를 선택한다.
  3. CIDR 블록이 여기서 또 나오는데, IP를 어떻게 구성할지를 먼저 생각해보자.
    1. 0번 호스트부터 관리망 32개, 내부망 32개, 외부망 64개, 외부망 64개 순으로 사용한다고 가정한다.
    2. 사용할 개수는 2의 멱승개로 구성했다. CIDR로 표기하기 위함이다.
    3. 관리망: 10.20.30.0/27
    4. 내부망: 10.20.30.32/27
    5. 외부망1: 10.20.30.64/26
    6. 외부망2: 10.20.30.128/26

서브넷마스크는 왜 /27, /26일까?

VPC의 서브넷마스크가 /24 이므로 일단 24보다 큰 숫자 중에서 골라야 한다.

/27이면 호스트 개수가 5개 비트만큼, /26이면 호스트 개수가 6개 비트만큼 할당된다.

  • 32 - 27 = 5 ⇒ $2^5$ = 32개
  • 32 - 26 = 6 ⇒ $2^6$ = 64개

32개, 64개 호스트 주소를 할당했지만 실제로 그만큼 사용할 수는 없다.

몇 개의 호스트의 쓰임새는 이미 예약되어 있기 때문이다. (이 문서에서 확인)

Bastion 서버

Bastion [ˈbæstiən]. "요새", "보루"를 뜻하는 영어 단어

오버워치에서 자리만 잘 잡으면 말도 안되는 화력을 보여주었던 이 녀석하고 스펠링이 같다.

bastion 서버는 외부의 공격으로부터 서버를 효과적으로 방어하기 위한 수단이다.

외부에서 EC2에 접속하기 위해서는 일반적으로 SSH를 사용하는데,

bastion에만 외부 SSH 접속을 허용하고 그 외 모든 서버는 bastion을 통해서만 접속할 수 있게 통제한다.

  • 장점
    • 서비스 트래픽과 관리자용 트래픽 구분 가능
    • bastion에만 보안을 집중하면 되기 때문에 효율적
    • bastion이 공격으로 인해 피해를 보면 bastion만 재구성하면 되므로 서비스 영향을 최소화할 수 있음.

Internet gateway

공식 문서

VPC에 속한 클라우드 자원이 외부 인터넷과 통신할 수 있게 만들어주는 서비스이다.

생성하고 VPC를 선택하면 끝이다.

Route table

공식 문서

라우터와 비슷한 역할을 하는 서비스이다.

라우터는 네트워크 계층에 속하는 장비로, 서로 다른 네트워크 간의 통신을 중계한다.

목적지 정보(MAC 주소)를 테이블에 가지고 있다면 forwading 시켜주고 아니면 drop한다.

Route table 생성

  1. 생성한 VPC를 선택하고 용도에 맞는 적당한 이름을 기입하여 Route table을 생성
  2. 관리망, 내부망, 외부망 전용 총 3개를 만들어도 되고, 인터넷 접근 가능 1개/불가능 1개를 만들어도 된다.
  3. 생성된 Route table 정보로 들어가면 라우팅 정보와 연결할 서브넷을 편집할 수 있다.
    • VPC 내부망끼리는 모두 통신이 가능해야 한다. 10.20.30.0/24 는 모든 라우팅에 추가한다.
    • 인터넷에 접근하려면 위에서 생성한 Internet gateway를 라우팅에 추가한다.
      • 외부망은 외부에서 application에 접근해야 하기 때문에 인터넷 통신이 필요하다.
      • 관리망은 외부에서 SSH를 통해 관리 목적으로 접근해야 하기 때문에 인터넷 통신이 필요하다.

Security group

공식 문서

AWS 클라우드 자원의 인바운드 및 아웃바운드 정책을 관리하는 방화벽 서비스이다.

Security group 생성

관리망, 외부망, 내부망 순으로 보안 그룹을 생성한다.

순서는 바뀌어도 상관이 없으나, 허용 대상을 보안 그룹으로 선택할 수 있기 때문에

순서를 맞춰서 만들면 왔다갔다 하는 귀찮음을 줄일 수 있다.

각 망의 쓰임새에 맞는 인바운드 포트만 개방하고 아웃바운드는 건드리지 않는다.

또한 보안을 위해 내 IP 혹은 특정 대역에만 포트를 열어두는 것이 좋다.

  • 관리망 (bastion)

    1. 접근이 필요하므로 SSH(22) 포트를 개방한다.

    2. (Optional) bastion 서버가 살아있는지 보기 위해 ping을 사용하려면 ICMP - IPv4을 개방한다.

  • 외부망 (application)
    1. 외부에서 HTTP 포트로 접근하여 어플리케이션을 사용한다. HTTP 포트를 모두에게 개방한다. Anywhere-IPv4, IPv6을 선택하면 된다. HTTP 기본 포트가 아니라 다른 포트를 사용한 경우 TCP를 선택하고 해당 포트를 개방한다.
    2. HTTPS까지 사용하는 경우엔 HTTPS까지 개방한다.
    3. bastion에서 SSH로 접근해야 한다. 관리망 보안 그룹을 허용 대상으로 선택하면 해당 보안 그룹에 속한 모든 자원에 공통적으로 적용된다.
    4. (Optional) 관리망 보안 그룹에 대해 ICMP 포트를 개방하여 ping을 사용할 수 있다.
    5. (Optional) 관리망 보안 그룹에 대해 telnet 포트를 개방하면 특정 포트가 살아있는지 확인할 수 있다.

'모두' 를 대상으로 개방
보안 그룹을 대상으로 선택

  • 내부망 (인프라)
    1. mysql을 사용할 예정이기 때문에 mysql 기본 포트 3306을 개방한다. 대상은 외부망 보안 그룹으로 지정한다.
    2. 기타 다른 인프라를 사용하는 경우 해당 포트를 외부망 보안 그룹에게 개방한다.
    3. bastion에서 SSH로 접근해야 한다. 이전에 설정한 관리망 보안 그룹을 선택하면 보안 그룹에 속한 모든 자원으로부터 SSH 접근이 가능하다.
    4. (Optional) 관리망 보안 그룹에 대해 ICMP 포트를 개방하면 ping을 사용하여 확인할 수 있다.
    5. (Optional) 관리망 보안 그룹에 대해 telnet 포트를 개방하면 특정 포트가 살아있는지 확인할 수 있다.
    6. (Optional) 보안 그룹 이야기는 아니지만, 구축 초기에 mysql 설치 등 이유로 인터넷에 접근이 필요할 수 있다. 그런 경우 서브넷 메뉴에 가서 내부망 그룹의 라우팅 테이블에 인터넷 게이트웨이를 임시로 추가하여 사용한다.

EC2 생성

여기서는 구성한 망을 적용하는 방법에 대해서만 다룬다.

  1. EC2 생성 메뉴로 접속한다.
  2. OS는 입맛대로 선택한다. 가급적이면 LTS인 버전이 안정적이다.
  3. 네트워크는 생성한 VPC를, 서브넷은 EC2의 용도에 따라 알맞게 선택한다.
  4. 나머지 옵션은 필요에 따라 적절하게 선택하고 생성하면 된다.

CIDR 표기법

사이더(Classless Inter-Domain Routing, CIDR)는 클래스 없는 도메인 간 라우팅 기법으로 1993년 도입되기 시작한, 최신의 IP 주소 할당 방법이다.

네트워크를 잘 모르는 사람도 IP 주소가 무엇인지, 그리고 어떻게 생겼는지는 얼추 알고 있는 경우가 많다.

CIDR 표기법은 IP 주소에 특별한 의미를 가진 숫자를 더하여 표기한다. (192.168.50.0/24 같은 방식)

CIDR을 제대로 이해하기 위해서는 IP 주소와 서브넷마스크에 대한 이해가 선행되어야 한다.

IP 주소

  • 네트워크 자산의 논리적인 주소
  • 표기법
    • 0부터 255까지의 숫자를 4개 사용
    • 192.168.0.1 와 같은 방식으로 사용
  • 영역
    • IP 주소는 Network 영역과 Host 영역을 합쳐서 쓰는 형태이다.
    • 192.168.0.1 의 예시에서
      • 192.168이 네트워크 영역이라고 가정
      • 네트워크 영역이 아닌 부분은 모두 호스트 영역이다. 여기선 뒤의 두 개 숫자가 호스트 영역이 된다.
      • 192.168.x.x 의 형태로 사용할 수 있다.
      • x는 0 ~ 255 범위이므로 192.168 네트워크 대역의 호스트 개수는 256 * 256 = 65536개이다.

네트워크 클래스

Reference

  • IP 주소를 효율적으로 사용하기 위해 정한 국제적인 규칙
  • A, B, C, D, E 클래스가 존재
  • IP 주소 중 첫 숫자를 2진법으로 변환한 뒤 시작 비트를 확인하면 클래스를 구분할 수 있다.
  1. A 클래스
    • 비트가 0으로 시작하는 숫자 (0000 0000 ~ 0111 1111 ⇒ 0 ~ 127)
    • 첫 번째 주소만 네트워크 주소이고 나머지 3개는 호스트 주소이다.
    • 124.0.0.1 는 A 클래스에 속한다.
  2. B 클래스
    • 비트가 10으로 시작하는 숫자 (1000 0000 ~ 1011 1111 ⇒ 128 ~ 191)
    • 앞의 두 숫자만 네트워크 주소이고 남은 2개는 호스트 주소이다.
    • 168.35.0.0 은 B 클래스에 속한다.
  3. C 클래스
    • 비트가 110으로 시작하는 숫자 (1100 0000 ~ 1101 1111 ⇒ 192 ~ 223)
    • 앞의 3개 숫자가 네트워크 주소이고 마지막 1개는 호스트 주소이다.
    • 200.200.0.0 은 C 클래스에 속한다.
  4. D 클래스
    • 비트가 1110으로 시작하는 숫자 (1110 0000 ~ 1110 1111 ⇒ 224 ~ 239)
    • 멀티캐스트를 위해 사용하는 주소 대역이다.
  5. E 클래스
    • 비트가 1111로 시작하는 숫자 (1111 0000 ~ 1111 1111 ⇒ 240 ~ 255)
    • 예약된 주소

A → E로 갈수록 시작 비트에 포함되는 1의 개수가 증가하는 것을 볼 수 있다.

서브넷 마스크

클래스만 사용하면 할당받은 IP 대역이 낭비되는 문제가 있다.

이러한 문제를 해결하기 위해 서브넷 마스크 주소를 사용하여 IP를 조금 더 세밀하게 나누는 기법을 사용한다.

어느 회사가 B 클래스 대역 1개를 할당받은 상황
  - B 클래스의 범위는  128.0.0.0 ~ 191.255.255.255
  - 여기서 네트워크 주소는 앞 2개 숫자를 사용한다.
  - 할당받은 대역이 130.10.x.x라고 가정
  - 앞의 두 개 숫자에 해당하는 130.10은 네트워크 영역이라 고정
  - 호스트 영역에 해당하는 x.x는 256개 * 256개 = 65536개이므로 최대 65536개의 IP를 사용할 수 있다.
  - 그러나 실제로 사용하는 IP가 10000개 뿐이라면 55536개가 낭비된다.
  1. 서브넷 마스크는 연속된 1이 먼저 나타나고 그 이후 0만 나타나도록 구성한다.
    1. 255.255.255.0 ⇒ 11111111 11111111 11111111 00000000
    2. 255.255.255.240 ⇒ 11111111 11111111 11111111 11110000
  2. 1의 개수로 네트워크 주소와 호스트 주소를 다시 나눈다. 네트워크 주소는 1이 닿는 범위까지이다.
    1. 255.255.255.0은 24개의 1을 사용
      1. 130.10.20.30 이라는 IP가 있다면 130.10.20이 네트워크 주소
    2. 255.255.255.240은 28개의 1을 사용
      1. 네트워크 주소가 앞 28개 비트, 호스트 주소가 뒤 4개 비트밖에 없다.
      2. 이 대역은 호스트 주소가 16개이다.

CIDR

CIDR을 이해하기 위한 준비가 끝났다.

CIDR은 IP주소 + 서브넷마스크를 같이 표기한 것이다.

  • 192.168.50.0/24 의 예시
    • /24 는 앞의 24개 비트를 네트워크 영역으로 사용하겠다는 의미이다.
    • 따라서 192.168.50이 네트워크 주소이고 192.168.50.0 ~ 255 범위 내에서 호스트를 사용한다.
  • 192.168.30.32/28
    • 서브넷마스크가 8의 배수로 나누어 떨어지지 않아 계산이 조금 난감할 수 있다.
    • IP 주소의 전체 비트 수는 32개이고 28개 비트가 네트워크 영역이므로 호스트는 2^4 = 16개이다.
    • 시작 호스트는 32부터이다. 즉, 사용할 수 있는 IP는 192.168.30.32 ~ 192.168.30.47 이 된다.

잘못된 정보에 대한 지적 및 내용 보충은 언제든지 환영합니다.

Amazon Web Service의 무제한 스토리지, S3

S3 (Simple Storage Service)

AWS의 스토리지 특화 서비스.

생성 즉시 용량 한도 없는 스토리지가 할당되며 사용한 만큼 금액을 지불하여 사용한다.

EC2와의 비교

  1. EC2는 VM Computing Machine으로, 일반적인 PC 1대의 컴퓨팅 파워를 제공하고 있다.
    • 인스턴스를 새로 만들 때 정해진 양 만큼의 스토리지를 할당한다.
    • 스토리지를 더 추가하고 싶다면 고정된 양의 스토리지인 EBS를 추가하고 마운트한다.
  2. S3는 데이터 저장에 특화된 서비스이다. 용량 제한이 없는 스토리지를 생성하여 사용하기 때문에 EC2처럼 추가 스토리지 할당/마운트 작업이 불필요하다.

구성요소

  1. 버킷

    • 데이터를 저장하는 컨테이너
    • 버킷 하나가 하나의 저장소
  2. 객체

    • S3에 저장되는 기본 개체
    • 객체 잠금 기능을 사용하면 write-once-read-many 정책을 적용할 수 있다.
    • 버킷 내 객체의 고유 식별자로, 객체는 반드시 하나의 키를 가져야 한다.

    • 버킷 + 키 + 버전으로 여러 버킷에서 고유한 파일을 식별할 수 있다.

        http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.swdl
        위의 URL에서 버킷명은 doc이며 2006-03-01/AmazonS3.swdl은 키이다.
  3. 리전

    • 버킷의 지리적 위치
    • 사용자가 객체를 다른 위치로 전송하지 않는 한 해당 리전을 벗어나지 않는다.
    • 리전과 리전 사이 data replication을 지원한다.

스토리지 클래스

S3는 저장소의 활용 목적에 따라 각기 다른 과금 정책을 부여한다.

저장소가 어떻게 활용되는지를 분석하고 적절한 클래스를 선택해야 비용을 효과적으로 절감할 수 있다.

  1. Standard

    • 클라우드 애플리케이션, 컨텐츠 배포, 게임, 빅데이터 분석 등 다용도로 사용 가능

    • 짧은 지연 시간, 많은 처리량

    • 요금

      • 스토리지 요금

  2. Intelligent-Tiering

    • 사용자가 스토리지를 사용하는 패턴을 모니터링하고 비용 절감에 효과적인 스토리지 클래스로 자동 전환

    • 분류 규칙에 따라 Standard / Standard-IA로 자동 스위칭

    • 요금

      • 스토리지 요금

      • 다른 클래스와는 달리 모니터링 요금이 추가된다.

  3. Standard-IA (Infrequent Access)

    • 자주 액세스하진 않지만 필요 시 빠르게 접근해야 하는 유형으로, 30일 이상 액세스가 잘 이루어지지 않는다면 고려해볼만한 클래스

    • 이슈성 데이터에도 적합 (업로드 시 잦은 액세스, 시간이 지나며 트래픽 감소, 특정 시기에 트래픽 다시 급등하는 경우)

    • 요금

      • 스토리지 요금

  4. One Zone-IA

    • S3는 사용자가 모르게 3곳 이상의 물리적 영역에 백업이 되지만, One Zone은 1곳의 물리적 영역에만 데이터를 저장

    • One Zone이라는 특성으로 인해 처리가 곤란하지만 약간 유실되어도 서비스에 큰 영향을 주지 않는 데이터 백업에 저장 (로그형 데이터)

    • 요금

      • 스토리지 요금

  5. Glacier

    • 가장 저렴한 스토리지 요금

    • 가장 비싼 트래픽 요금

    • 백업이 필요하지만 거의 접근하지 않는 데이터에 적합

    • 요금

      • 스토리지 요금 (Glacier/Glacier Deep Archive)


  • 각 클래스의 트래픽 요금

    • Standard의 트래픽 요금이 가장 저렴하다.
    • 스토리지 요금이 저렴할 수록 트래픽 요금은 비싸게 책정되어 있다.

S3 버킷 생성

https://aws.amazon.com/ko/s3/ 에 접속하여 시작하기 버튼을 누르면 S3용 콘솔창이 나타난다.

먼저 버킷을 생성해야 한다.

리전과 이름만 변경하고 초기 옵션 그대로 생성했다.

  • 객체 잠금 옵션은 모든 데이터를 읽기 전용으로 저장한다.
    • 보존 기간을 설정할 수 있다. 설정하지 않으면 영구적으로 보존한다.

AWS SDK for Java

Reference (AWS SDK 1.11)

Run Sample Code

  1. 샘플 프로젝트 다운로드

     git clone https://github.com/awslabs/aws-java-sample.git
  2. 액세스 키 구성

    1. http://aws.amazon.com/security-credentials 접속

    2. 액세스 키 탭 클릭 후 생성

    3. 키는 생성 즉시 다운로드 해서 보관하지 않으면 다시 찾을 수 없다. (아래 사진 참조)

    4. 액세스 키 파일 생성

      • Windows

        • C:\Users\{USER_NAME}\.aws\credentials
      • Linux

        • ~/.aws/credentials
      • 파일 내용 (value 값을 본인의 ID로 교체)

          [default]
          aws_access_key_id = YOUR_ACCESS_KEY_ID
          aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
  3. 샘플 프로젝트 컴파일/실행

     mvn clean compile exec:java
    • 만약 메이븐 빌드 중 501 에러가 발생한다면 보통은 central repository의 프로토콜 정책 변경 때문이다. pom 파일에 아래의 내용을 추가한다. (Reference)

        <pluginRepositories>
            <pluginRepository>
                <id>central</id>
                <name>Central Repository</name>
                <url>https://repo.maven.apache.org/maven2</url>
                <layout>default</layout>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
                <releases>
                    <updatePolicy>never</updatePolicy>
                </releases>
            </pluginRepository>
        </pluginRepositories>
        <repositories>
            <repository>
                <id>central</id>
                <name>Central Repository</name>
                <url>https://repo.maven.apache.org/maven2</url>
                <layout>default</layout>
                <snapshots>
                    <enabled>false</enabled>
                </snapshots>
            </repository>
        </repositories>
    • 실행하면 임시 버킷 생성 - 버킷 목록 - 임의의 파일 업로드 - 파일 다운로드 - 파일 삭제 - 버킷 삭제 순으로 동작한다.

    • 실행이 완료되면 로그를 확인한다. 계정이 잘 연결되었다면 목록 중 {USER_BUCKET_NAME}에 내가 생성한 버킷의 이름이 나타난다.

        ===========================================
        Getting Started with Amazon S3
        ===========================================
      
        Creating bucket my-first-s3-bucket-bb3cc539-ade5-4dbb-b27f-190cd21bf0f4
      
        Listing buckets
            - my-first-s3-bucket-bb3cc539-ade5-4dbb-b27f-190cd21bf0f4
            - {USER_BUCKET_NAME}

Develop Example Code

Sample Code는 임시 버킷을 생성해서 API를 어떻게 활용하는지를 보여주었다.

예제 코드를 바탕으로, 필요 위주로 재구성을 해보았다.

참고로 예제는 AWS SDK 1.9.6 버전을 사용하고 있다.

  • 개발 환경
    • AWS SDK 1.11
    • JDK 1.7

JDK 1.7을 사용한 이유는 AWS SDK를 적용해야 할 사내 서버가 1.7이기 때문이다.

만약 AWS SDK 2.0+을 사용할 경우 JDK도 1.8 이상을 사용해야 한다.

DynamoDB와 같은 기능은 2.0 이상에서 아직 지원되지 않으니 목적에 맞는 SDK를 선택한다. (Reference)

  1. Maven

    • 예제에선 Region을 US-WEST-2로 설정하고 임시 버킷을 생성했다. 서울 리전에 생성한 내 버킷을 직접 연결한다.

    • AWS SDK 1.9.6에는 서울 리전 코드 Regions.AP_NORTHEAST_2 가 포함되어 있지 않다. SDK를 최신 버전으로 교체했다.

       <dependencies>
           <dependency>
               <groupId>com.amazonaws</groupId>
               <artifactId>aws-java-sdk</artifactId>
               <version>1.11.749</version>
           </dependency>
       </dependencies>
  2. AmazonS3 인스턴스 생성

    • AmazonS3Client 생성자는 최신 버전에 Deprecated 되었다. 빌더를 사용하여 인스턴스를 할당했다.

      String accessKey = "";
      String secretKey = "";
      
      AmazonS3 s3 = AmazonS3ClientBuilder.standard()
          .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey)))
          .withRegion(Regions.AP_NORTHEAST_2)
          .build();
    • withCredentials로 인증을 시도한다. 액세스 키를 이 곳에 등록하여 사용한다.

    • withRegion로 가져오려는 버킷의 리전을 설정한다.

  3. 버킷 목록 가져오기

    • 예제 코드와 달라진 것이 없다.

      public static void listingBucket(AmazonS3 s3) {
          System.out.println("Listing buckets");
          for (Bucket bucket : s3.listBuckets()) {
              System.out.println(bucket.getName());
          }
      }
  4. 파일 업로드

    • 시험용 이미지로 많이 쓰이는 Lenna.png를 업로드한다.

    • resources에 Lenna.png를 포함시켰다.

    • objectKey는 버킷 내 유일하게 존재해야 하는 파일 식별자이다.

      private static void uploadLennaToS3(AmazonS3 s3) throws Exception {
          String objectKey = "lenna-" + UUID.randomUUID();
          System.out.println("Uploading a new Lenna to S3");
          s3.putObject(new PutObjectRequest(bucketName, objectKey, createLennaPngFile()));
      }
  5. 특정 폴더에 업로드하는 경우

    • key에 폴더명을 prefix로 추가한다.

    • myFolder 아래에 Lenna.png를 업로드하였다.

      private static void uploadLennaToS3Folder(AmazonS3 s3) throws Exception {
          String objectKey = "lenna-" + UUID.randomUUID();
          System.out.println("Uploading a new Lenna to S3");
          s3.putObject(new PutObjectRequest(bucketName, "myFolder/" + objectKey, createLennaPngFile()));
      }
  6. 파일 교체 (업데이트)

    • 이미 존재하는 key에 새 파일을 넣으면 파일이 새 파일로 교체된다.

      private static void updateImage(AmazonS3 s3, String objectKey) throws Exception {
          System.out.println("Updating the lenna to other image.");
          s3.putObject(new PutObjectRequest(bucketName, objectKey, createS3LogoImageFile()));
      }
  7. 파일 목록

    • prefix로 폴더명을 주면 특정 폴더의 파일을 전부 호출할 수 있다.

    • prefix는 파일명을 사용할 수도 있고 폴더명을 사용해도 된다.

      private static void listing(AmazonS3 s3, String prefix) {
          System.out.println("Listing objects (" + prefix + ")");
          ObjectListing objectListing = s3.listObjects(new ListObjectsRequest()
                .withBucketName(bucketName)
                .withPrefix(prefix));
      
          for (S3ObjectSummary summary : objectListing.getObjectSummaries()) {
              System.out.println("key: " + summary.getKey() + ", size: " + summary.getSize());
          }
      }
  8. 파일 다운로드

    • 다운로드 API를 수행하면 객체의 메타데이터와 콘텐츠를 읽기 위한 Input Stream을 반환한다.

      private static void download(AmazonS3 s3, String objectKey) {
          System.out.println("Downloading an object");
          S3Object object = s3.getObject(new GetObjectRequest(bucketName, objectKey));
          System.out.println("Content-Type of Lenna: "  + object.getObjectMetadata().getContentType());
      }

예제 코드는 github에 업로드되어 있다. (Repository Link)

GCP의 무료 크레딧이 무려 300$라는 사실을 알게 되었다.

 

게다가 최초 계정 생성 시 작성하는 신용카드 정보로는 절대 비용을 청구하지 않는다고 한다.

(정보를 받는 이유는 자동 가입을 막기 위함이라고)

 

무료로 쓰기는 AWS보다 훨씬 나은 조건인 것 같아 AWS를 생성한지 하루만에 GCP로 갈아타는 포스팅을 작성하게 되었다.

 

가입은 구글 ID만 있으면 되고 아래 URL에서 진행하면 된다.

 

만약 300$ 크레딧을 위해 재가입을 하고 싶다면, GCP에 등록한 적 없는 카드를 새로 등록해야 한다.

 

https://cloud.google.com/free/docs/gcp-free-tier?hl=ko

 

무료 등급 GCP  |  무료 등급 Google Cloud Platform  |  Google Cloud

무료 등급 Google Cloud Platform에서는 Google Cloud Platform(GCP) 서비스를 직접 체험해 볼 수 있도록 무료 리소스를 제공합니다. 이 플랫폼을 처음 이용하기 때문에 기본사항부터 파악해야 하는 고객이나 새 솔루션을 사용해보려는 기존 고객 모두 무료 등급 GCP를 이용할 수 있습니다. GCP의 무료 등급에는 다음과 같은 2가지 유형이 있습니다. 12개월 무료 체험판 - 모든 GCP 서비스에 사용할 수 있는 $300의 크레딧

cloud.google.com

 

그러나 가끔 GCP 가입 시 첫 화면에서 계속 버튼이 안 눌릴 때가 있다.

왜일까?

크롬 브라우저의 개발자 도구에서 콘솔을 확인하니 페이지가 로딩되는 순간 에러가 발생한다.

뭐 있으면 F12를 눌러 코드를 확인하려는 습관은 개발자의 직업병인 것 같다.

 

어떠한 조건이 있어야 정상적으로 진행되는 것으로 보이지만 GCP 개발자가 아니라서 알 수가 없었다.

 

빨간 선 위치약관에 동의한다는 체크박스가 있어야 한다.

나타나지 않았다면 계속 버튼을 눌러도 다음 단계로 넘어가지 않는다.

 

이럴 때는 다른 경로로 들어가서 가입을 하면 된다.

아래의 링크로 접속하자.

https://cloud.google.com/gcp/getting-started/?hl=ko

 

GCP 시작 방법  |  Google Cloud

Google Cloud Platform을 시작하는 방법을 알아보세요. 대화형 가이드와 기술 문서, 동영상 등을 참고하여 지금 시작해 보세요.

cloud.google.com

그리고 상단의 콘솔 버튼을 클릭한다 (우측 상단 구글 프로필 왼쪽에 있다).

화면 정중앙에 약관 체크박스가 나타나고 정상적으로 계정을 생성할 수 있다.

 

어? 해치웠나?

체크하고 동의 및 계속하기를 눌러 진행하자.

 

 

해치운게 맞는 것 같다.

아까 보이지 않던 서비스 약관 동의 체크박스가 나타나고 정상적으로 진행된다.

 

계정 생성 후 대시보드에 접속한다.

 

아래와 같은 화면을 볼 수 있다.

 

AWS의 EC2는 GCP에서 Compute Engine이다.

 

 

Compute Engine - VM 인스턴스로 들어가서 만들기 버튼을 누른다.

 

 

 

AWS는 서울 리전이 있지만 GCP는 국내 리전이 존재하지 않는다.

도쿄, 오사카, 홍콩, 타이완 정도가 가깝고, 도쿄가 가장 좋은 선택으로 보인다.

(2020년 초 서울 리전이 추가되었다. 한국인이라면 제발 서울 리전 씁시다.)

 

머신의 파워를 적절하게 조절하여 생성한다.

 

 

마지막으로 간편한 원격 접속을 위해 ssh를 설정했다.

key 생성은 아래를 참고하였다.

https://ruuci.tistory.com/6

 

생성된 GCP를 SSH로 접속하기

구글 클라우드 플랫폼(GCP)에 SSH로 접속하는 방법은 1. 브라우저 창에서 열기 2. 맞춤 포트의 브라우저 창에서 열기 3. gcloud 명령 보기 4. 다른 클라이언트 SSH 사용이 있다 현재 사용하고 있는 PC 에서 GCP로..

ruuci.tistory.com

 

GCP에 접속하기 위해 입력해야 하는 커맨드가 너무 귀찮기 때문에 alias도 설정했다.

MAC 환경이고 쉘은 zsh를 사용하고 있다.

 

$ vim ~/.zshrc

적당한 위치에 아래의 명령줄 입력하여 alias 설정 후 저장(wq)
alias conn_gcp="ssh -i {KEY_DIRECTORY}/rsa-gcp-key {USER_NAME}@{GCP_ADDRESS}"

$ source ~/.zshrc

 

설정이 잘 되었다면 쉘에 conn_gcp를 입력했을 때 비밀번호 입력을 하라고 나타날 것이다.

 

학창 시절 진행하던 프로젝트에서 AWS를 서버로 사용한 적이 있었다.

 

그 때 서버 담당이 내가 아니었기 때문에 단순 이용하는 정도로 그쳤었다.

 

폐쇄망/사내망에 설치되는 솔루션 서버 개발을 하고 있지만,

 

서버 개발을 하는 사람이 클라우드 서버를 안 써본다는 것이 말이 안된다고 생각하여 사용해보게 되었다.

 

 

 

1. 인스턴스 종류 선택

AWS에서 생성할 수 있는 서버 인스턴스의 종류는 굉장히 많다.

 

많은 기업들이 클라우드 서버에서 다양한 비즈니스를 수행하고 있고, 그 비즈니스 요건을 충족시키기 위한 것 같다.

 

자신의 용도에 따라서 선택하면 된다.

 

나는 하둡 등 빅데이터 처리 솔루션 스터디로 사용할 목적이었기 때문에 EC2를 선택했다.

 

위키백과의 EC2 항목에 따르면, VM 하나 생성, OS 설치, 네트워크 연결까지 해 준 빈 깡통 컴퓨터 하나를 EC2라고 한다.

 

또한 서버를 실행한 시간에 비례하여 비용을 부과하기 때문에 사용에 주의해야 한다.

 

특히 필요가 없어진 시점에 바로 꺼버리는 것이 좋다.

 

 

2. OS

OS는 익숙한 우분투 18.04를 선택했다.

 

우분투 진영에서 최신 버전에 가깝기도 하고 LTS(장기 지원 버전)라는 점이 좋아서 이 버전을 개인용 VM으로도 사용하고 있다.

 

 

3. 컴퓨팅 자원 선택

프리 티어에서는 1 Core CPU / 1 GB 메모리를 사용할 수 있다.

 

선택권이 없어서 고르긴 했는데 지금 시대에 이 환경으로 뭘 하라고?

 

매우 꼬았는데 돈을 지불해야 한다고 생각하니 꼬움이 사라졌다. ㅠㅠ

 

나중에 부족하면 돈 내고 올려보는 것을 생각해봐야겠다.

 

생성 전엔 몰랐는데, 네트워크 성능도 선택이 가능하다.

 

인스턴스 유형을 a.b라고 하면 a는 네트워크 성능, b는 컴퓨팅 자원에 따라 바뀌는 것 같다.

 

t2.micro를 선택하고 다음으로 넘어간다.

 

 

4. 보안 그룹 구성

AWS 프리 티어 사용기를 둘러보다 보면 해킹당해서 어마어마한 요금이 청구되었다 라는 눈물 섞인 후기를 쉽게 찾아볼 수 있다.

 

대부분은 AWS 측의 조치로 요금 감면을 받지만, AWS 측이 조치할 필요 없이 해킹을 방지하는 방법이 당연히 더 좋은 방법이다.

 

보안 그룹에서는 접근 제어가 가능하다.

 

용도에 따라 다르겠지만 SSH, HTTP 정도만 손봐도 괜찮을 것 같다.

 

 

SSH는 보통 터미널 원격 접속/파일 전송 등으로 사용한다.

 

서버 관리자 이외엔 접근을 불허하도록 하자.

 

IP로 제어가 가능하다.

 

개인적으로 사용할 목적이라 소스 탭에서 내 IP로 접근을 제한했다.

 

 

 

HTTP는 웹 서버인 경우 허용하는 편이 좋다.

 

특히 80번 포트 개방을 고려하는 것이 좋다.

 

HTTP의 기본 포트이기도 하고, 80번 포트로 서버를 개방했을 때 서버 주소 뒤에 포트 번호 없이 접속할 수 있기 때문이다.

 

무슨 말이냐면 http://localhost:8080으로 접속한다고 했을 때 80번 포트이면 :8080을 생략하고 http://localhost로 접속할 수 있다는 것이다.

 

포트 번호를 따로 설정한다면, 그 번호를 개방하도록 한다.

 

지금은 필요 없어서 따로 설정하지는 않았다.

 

5. 키페어 발급

SSH를 통해 서버에 접근 할 때 암호 대신 사용할 수 있는 파일이다.

 

그냥 고전적인 ID/비밀번호로 접속하려고 스킵했다.

 

 

 

 

일단 이 정도로 AWS 인스턴스를 생성할 수 있다.

 

프리 티어를 사용하는 경우 보통은 요금을 지불하고 싶지 않을 것이다.

 

혹시 모를 사고를 방지하기 위해 요금 알람(매우 중요)을 설정해놓으면 조금 더 안심할 수 있다.

 

+ Recent posts