AWS의 어려운 용어를 이해하기에 앞서, 생활속의 경험들로 개념을 잡아봅니다.

AWS의 일상 비유

아래는 AWS 클라우드 아키텍처 구성도를 우리가 살고 있는 집 또는 아파트에 빗댄 비유입니다. 크게 보면, 우리 아파트는 공원(보도/화단)과 집 안의 거실 그리고 안방으로 구분할 수 있어요. 우리집에 살고 있는 나와 우리 가족들은 출입문을 통해서 거실로 들어가고 냉장고에서 맛있는 음식도 꺼내 먹을 수 있어요. 그러나 우리 집에 살고 있지 않는 친척이나 친구들, 심지어 도둑(사기꾼)은 공식적인 경로를 통해서만 방문을 할 수 있겠죠. 그건 경비실을 통하거나 인터폰을 통해서 우리 집에 방문하게 됩니다.

그러나 고민해야 할 부분이 있습니다. 극단적이긴 하지만, 만약에 냉장고에 불이 났다고 가정하면, 빠르게 옆에 떨어져 있는 독립된 공간인 안방으로 이동시켜주면 됩니다. 그렇다면 우리는 냉장고에서 아이스크림을 꺼내먹는 일을 멈추지 않아도 되겠죠. 이것이 바로 '안방'이라는 공간은 존재하는 이유입니다. 비유가 극단적이어서 완전히 와닿진 않을 수 있지만, 스토리의 흐름은 이렇습니다.

실 AWS 아키텍처

위에서 구구절절 비유을 들어서 하나의 스토리를 가정해보았습니다. 위의 출입문은 EC2 자원으로 구성한 Bastion host이고, 음식을 대접하는 EC2는 중요한 비즈니스 로직을 처리하는 애플리케이션 서버(WAS)라고 이해하면 됩니다. 또한 중요한 정보를 저장하고 조회하는 냉장고는 DB 또는 NoSQL 서버라고 보면 됩니다. 마지막으로 외부의 방문이나 침입을 경비실은 로드밸런서(Loadbalancer) 서비스인 ELB(Elastic LoadBalancer)라고 보면 됩니다. 여기서 외부에서 직접 통신이 필요한 경비실과 출입문은 인터넷 환경에서 직접 접속이 가능한 퍼블릭 서브넷(Public Subnet)이고, 인터넷과 직접 접근이 불가능한 우리집의 거실과 안방은 프라이빗 서브넷(Private Subnet)이라고 보시면 됩니다.

  • 초록색 공간 = 공원/보도/화단 => 퍼블릭 서브넷(Public Subnet)
  • 파란색 공간 = 거실/안방 => 프라이빗 서브넷(Private Subnet)

만약 AWS를 처음 접한 초보자 분께서는 일단은 단순하게 아래와 같은 구성으로 애플리케이션을 만들어보길 권고합니다. 그리고 나서 이중화를 어떻게 해야할지, 가용성을 어떻게 높힐지, AWS 자원사용에 대한 비용은 어떻게 줄일 수 있는지 같이 고민하는 시간을 갖도록 하겠습니다.

비록 아래 그림은 클라우드 자원들이 인터넷과 직접 통신이 가능한 퍼블릭 서브넷(Public Subnet)에 위치하므로, 여러분이 생성한 자원은 미국에서, 태국에서, 영국에서,, 등 전세계예서 노출되어 있는 상태입니다. 

인터넷 환경에 직접 노출된 위험한 상태

일반적으로 안전한 서비스를 구성하기 위해서는 최소한 아래와 같은 구성이 필요하다. 서비스를 주요 수행하는 EC2와 RDS는 임의 접근이 불가능하도록 프라이빗한 공간에 위치시키는게 안전할 것이다.

 

외위 추가적이고, 필수적인 자원들(Security Gruop, NACL, EC2, RDS, ELB 등)은 매우 쉬운 용어로 설명할 예정입니다.​

 

'AWS' 카테고리의 다른 글

[TIP] AWS MFA 비활성화 처리(aws cli)  (1) 2023.04.08

Terraformer 설치 환경은 AWS 클라우드 환경에서 ubuntu 20.04 LTS EC2에서 진행합니다. Ubuntu의 OS 버전은 크게 중요하지 않습니다. (EC2는 사전에 생성하고 EC2 생성과정은 생략함)

그 전에 terrafomer에 대해서 알아봅시다. terraformer는 기존이 이미 존재하는 클라우드 자원을 terraform code로 변환해주는 유틸리티입니다. terraform 도구의 역행하는 reverse engineering 도구로 생각해도 좋을 듯 합니다. terraformer가 공식적인 유틸리티는 아니지만, 구글 내부 오픈소스 프로젝트에서 gcp에서 활용하기 위해 만들어진 도구로서, 기능적으로는 아주 편리합니다.

 

Terraformer(테라포머) 설치 방법

1. 최초 패키지 목록를 업데이트합니다.

$ sudo apt-get update

 2. Terraformer를 설치합니다.

$ export PROVIDER=aws
$ curl -LO https://github.com/GoogleCloudPlatform/terraformer/releases/download/$(curl -s https://api.github.com/repos/GoogleCloudPlatform/terraformer/releases/latest | grep tag_name | cut -d '"' -f 4)/terraformer-${PROVIDER}-linux-amd64
$ chmod +x terraformer-${PROVIDER}-linux-amd64
$ sudo mv terraformer-${PROVIDER}-linux-amd64 /usr/local/bin/terraformer

3. Terraformer 설치후 버전 확인하여 정상여부를 확인합니다.

$ terraformer version
Terraformer v0.8.20


Terraformer(테라포머) 수행 방법

Terraformer를 설치하였다면, AWS 환경에 이미 존재하는 자원을 tf(terraform) 파일로 변환하도록 합시다. 사전에 terraform의 plugin 설치 경로를 디폴트값이 개별 로컬 디렉토리(workspace)였다면, 공통으로 재활용하기 위해 경로로 변경합니다. (참고 URL : https://www.terraform.io/cli/config/config-file그리고 그 경로의 다운로드 받은 플러그인을 활용해서 기존 aws 자원을 tf 파일로 변환할 수 있게 됩니다. 지금 해봅니다.

1. terraform plugin 경로를 공통 위치로 변경합니다.  우분투 홈 디렉토리(/home/ubuntu)에서 .terraformrc 파일을 생성하고, 아래 내용을 작성하여 저장합니다. 파일명이 정확히 .terraformrc 라는 사실에 주의합니다.

$ vi .terraformrc
plugin_cache_dir   = "$HOME/.terraform.d/plugins"
disable_checkpoint = true

이번에는 우분투의 $HOME/.terraform.d 디렉토리에서 plugins 디렉토리를 생성합니다. 이전에 terraform을 수행한 적이 있다면 홈 디렉토리에 .terraform.d 디렉토리가 있을 것이고 mkdir 명령어를 통해서 plugins 디렉토리를 생성합니다.

.terraform.d$ pwd
/home/ubuntu/.terraform.d
.terraform.d$ mkdir plugins

방금 전에 생성한 plugins 파일에는 AWS 프로바이더에 대한 플러그인 파일이 없습니다. 따라서 terraform 파일이 있는 워크스페이스(디렉토리)에서 terraform init 을 수행하거나, terraform 파일이 있는 워크스페이스의 .terraform 내용을 복사(cp) 합니다. 필자는 편의상 아무런 내용이 없는 임시 tf 파일(dummy 파일)을 만들고 terraform init 명령어를 수행하였습니다.

 

2. aws configure 정보에서 profile 정보를 확인합니다. 필자는 단 1개의 aws 계정정보만 저장해놔서, profile이 not set입니다. 만약 2개 이상의 AWS 계정을 사용해서 여러 개의 aws profile(인증정보)이 설정되어 있다면, terraformer이 어떤 prfile에서 수행할지 알고 있어야 합니다.

$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************2Q6Z shared-credentials-file
secret_key     ****************ufYS shared-credentials-file
    region           ap-northeast-2      config-file    ~/.aws/config

3. 본격적으로 terraform import 명령어를 수행합니다. 그러면 AWS에 terraform으로 생성했던 vpc, subnet 자원 등이 tf 파일로 변환됩니다. 즉, terraform 코드로 자동 작성됩니다. 나머지 옵션 설정은 본인의 환경에 맞게 설정해도 됩니다. 필자의 경우는 vpc, subnet 자원에 대해서만, 서울 리전에 있는 자원들을 terraform 코드로 만들기 위한 옵션을 설정하였습니다.

$ terraformer import aws --resources=vpc,subnet --connect=true --regions=ap-northeast-2 --profile=default
2022/05/19 05:48:49 aws importing region ap-northeast-2
2022/05/19 05:48:50 aws importing... vpc
2022/05/19 05:48:50 aws done importing vpc
2022/05/19 05:48:50 aws importing... subnet
2022/05/19 05:48:50 aws done importing subnet
2022/05/19 05:48:50 Number of resources for service subnet: 17
2022/05/19 05:48:50 Number of resources for service vpc: 4
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-092b034e17d810921
2022/05/19 05:48:50 Refreshing state... aws_vpc.tfer--vpc-078038c68840cbfbc
2022/05/19 05:48:50 Refreshing state... aws_vpc.tfer--vpc-01a81c0e2144bdd47
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-09f0e4fd5f17a0cc0
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-0aae713476d65fe7b
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-02bd3aaa711a20d00
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-0fcb54046715d93e0
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-028a2aa49de693c15
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-0ca100c38f015c211
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-055a5f1bcbc7694ba
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-04f738ca162f5c2f2
2022/05/19 05:48:50 Refreshing state... aws_vpc.tfer--vpc-03f5e59e172fdbfb2
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-084acb594ef0d1265
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-027888e2e5d2808f5
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-0e00af5c09e91cb25
2022/05/19 05:48:50 Refreshing state... aws_vpc.tfer--vpc-07d137e8fcb98387c
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-057a10c05f348ec0e
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-076766b5c56ebc498
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-0f2cce1af115ea800
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-0779ddd4e0b96d339
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-06d7f3921d21f03ef
2022/05/19 05:48:50 Filtered number of resources for service vpc: 4
2022/05/19 05:48:50 Filtered number of resources for service subnet: 17
2022/05/19 05:48:50 aws Connecting....
2022/05/19 05:48:50 aws save subnet
2022/05/19 05:48:50 aws save tfstate for subnet
2022/05/19 05:48:50 aws save vpc
2022/05/19 05:48:50 aws save tfstate for vpc

4. 이제 최종 변환된 파일을 확인합니다. (편의상 파일 구조를 표현하는 tree 유틸리티를 통해서 결과 확인) generated 디렉토리 하위에 vpc, subnet 으로 분리하여 tf 파일이 잘 생성된 것을 확인할 수 있습니다.

/terraformer$ tree
.
├── generated
    └── aws
        ├── subnet
        │   ├── outputs.tf
        │   ├── provider.tf
        │   ├── subnet.tf
        │   ├── terraform.tfstate
        │   └── variables.tf
        └── vpc
            ├── outputs.tf
            ├── provider.tf
            ├── terraform.tfstate
            └── vpc.tf

+ Recent posts