DevOps:Infrastructure as Code with 테라폼(Terraform) and AWS - 실습편

AWS

DevOps

IaC

Terraform

11/22/2020


본 포스팅은 송주영님의 인프런 DevOps:Infrastructure as Code with 테라폼(Terraform) and AWS를 보고 개인적으로 정리한 내용입니다.

VPC와 subnet

VPC

AWS 시작과 기본. 자세한 용어 및 개념은 인프런 링크 참조. (VPC 관련 개념을 굉장히 잘 설명해놓은 링크)

콘솔에서 VPC를 만드는 과정은 생략한다.

서브넷의 프라이빗 퍼블릭 여부는 라우팅테이블에 따라 결정된다. 라우팅 테이블이 Internet Gateway(aws 기준 igw)로 연결되어있다면 퍼블릭 서브넷, NAT-Gateway(aws 기준 nat)로 연결되어있다면 프라이빗이라고 할 수 있다.
퍼블릭 서브넷의 서버들은 각각 고유한 public ip를 가지고 있고, Internet Gateway를 통해 바로 아웃바운드 트래픽으로 연결될 수 있다. 그러나 프라이빗 서브넷의 서버들은 퍼블릭 서브넷의 NAT-Gateway를 경유한 뒤 Internet Gateway로 나가며, 이 과정에서 모든 서버들의 (public) ip 주소는 NAT-Gateway의 주소로 통일된다.

Private Subnet

외부에서 접근하지 말아야 하는 서비스들은 보통 프라이빗 서브넷으로 관리하며, 퍼블릭 서브넷과 달리 외부에서 inbound로 들어갈 수 없다. 그렇지만, 필요한 패키지를 다운로드 받거나 써드파티 API를 사용하는 경우에는 인터넷을 연결해주어야하므로, 이 경우 NAT-Gateway를 사용한다 NAT-Gateway는 반드시 고정IP(Elastic IP)를 가지고 있어야 하며, 모든 아웃바운드 요청은 EIP로 처리된다.

Route Table

서브넷에 종속적인 table로, 서브넷의 네트워크 트래픽을 전달할 위치를 결정하는 데에 사용된다. 여러 서브넷에서 동시에 사용될 수 있으며, 이러한 연결 작업을 association이라고 한다.

실습

  • provider와 resource 생성. 한 파일에 몰아두든 분리하든 상관없다.
  • vpc 필수값은 cidr_block - 사이더 블록이라고 하며, 개념은 여기를 참조한다
  • subnet 필수값
    • vpc_id - subnet이 종속될 vpc id. <vpc 리소스타입>.<vpc명>.id로 설정
    • cidr_block
  • elastic ip 필수값
    • vpc - boolean
    • lifecycle
  • gateway 필수값
    • Internet Gateway
      • vpc_id
    • NAT-Gateway
      • allocation_id - <eip 타입>.<eip명>.id
      • subnet_id - <subnet 타입>.<subnet 명>.id --> 이때, private이 아니라 public subnet을 연결해야 한다. NAT-Gateway는 구조적으로 public subnet에 있다!
  • routetable 관련 필수값
    • routetable
      • vpc_id
    • route table associate
      • subnet_id
      • route_table_id - <routetable 타입>.<routetable 명>.id
    • route table rules --> 이렇게 따로 선언하지 않고, route_table 안에 route로 만들어도 된다(inner rule)
      • route_table_id
      • destination_cidr_block - outbound traffic 룰
      • (nat_)gateway_id
  • endpoint 관련 필수값
    • vpc_id
    • service_name - s3같은 서비스에 게이트웨이를 통하지 않고 바로 연결
    • 물론, routetable도 연결해주어야 한다.
Route Rule을 Route Table안에 inner rule로 설정할 때에는, 아래와 같은 형식을 취한다. 그러나 이러한 방식은 코드가 길어질수록 확장성에 문제가 생기므로, 추천되지는 않는 방식이다.
SHELL
resoure "aws_route_table" "route_tb" {
...
route {
cidr_block = "0.0.0.0/0"
gateway_id = <gateway 타입>.<gateway 명>.id
}
...
}
AWS NAT-Gateway는 비용이 많이 드는 서비스이므로 실습이 끝나면 반드시 삭제하자.

S3

서비스 소개 및 장점

높은 확장성과 신뢰성을 갖춘 데이터 스토리지 인프라 버킷에 데이터를 무한정으로 저장할 수 있으며, 권한 설정 / 다운로드 / 표준인터페이스 등을 지원한다. 또한, versioning을 통해 파일 유실 걱정을 줄여준다. 더 자세한 설명은 이미 잘 소개된 곳이 많으니 찾아보자.

개념

Bucket : object를 담아두는 컨테이너. s3 namespace를 최상위 수준으로 구성하며, 계정 식별 / 액세스 제어 / 사용량 집계에 사용된다.
Object : key를 통해 고유 식별되는 컨테이너 내부의 개체로, 최대 5TB까지 담을 수 있다. 객체 데이터와 메타 데이터로 구성된다.
Key : object의 식별자로, <bucket> + <key> + <version ID>의 조합으로 각 객체를 고유하게 식별할 수 있다.

S3의 모든 객체는 endpoint, bucket명, key (+ version ID)로 고유한 주소의 지정이 가능하다. 또한, 버킷은 region을 지정하여 저장되며, 명시적으로 객체를 타 region으로 저장하지 않으면 해당 region을 벗어나지 않는다.

스토리지 클래스

액세스 빈도에 맞춘 성능(효율)에 따라 클래스가 나뉜다. 자세한 정보는 aws 공식 사이트와 강의 자료를 참고하자.

  • 자주 액세스하는 경우
    • S3 standard - default
    • Reduced redundancy - 덜 중요한 정보이므로 중복을 최소화해서 저비용을 추구
  • 자주 액세스하지 않는 경우
    • S3 Standard-IA - 여러 개의 가용영역에 객체 데이터를 중복 저장
    • S3 One Zone-IA - 한개의 가용영역에만 객체 데이터를 저장, 따라서 재해 등으로 인한 물리적 손실시 복원성 X
  • 자주 액세스하는 객체와 그렇지 않은 객체를 최적화해야 하는 경우
    • S3 Intelligent-Tiering - 액세스 패턴을 알기 어려울 경우 자동적으로 최적화
  • 저비용으로 객체 아카이빙을 해야하는 경우
    • S3 Glacier - 분 단위로 데이터 일부를 검색해야 하는 경우, 최소 스토리지 기간 90일
    • S3 Glacier - 거의 액세스하지 않는 데이터를 저장할 경우, 최소 스토리지 기간 180일, 모든 스토리지 클래스 중 가장 저비용

실습

  • s3.tf 리소스 파일 생성
  • 이 때, bucket명은 global namespace이므로 고유명사 등을 넣어서 unique하게 정할것
  • aws s3 cli 명령어
    • mv / cp / rm 등이 주요 명령어
    • 업로드 : aws s3 cp <업로드할 객체> s3://<버킷명>/<path>/<객체명> - Name은 객체명으로 만들어진다.
    • 다운로드 : aws s3 cp s3://<버킷명>/<path>/<객체명> <저장위치>
  • s3의 접근 권한을 make public으로 설정하면 버킷 내의 객체에 누구나 접근할 수 있게 된다.
S3의 property 중 `static web hosting`을 이용하여 static 파일을 서빙할 수 있다. 이 때 프로토콜은 HTTP에 한정되는데, AWS Cloud Front라는 CDN 서비스를 조합하여 HTTP 방식 이외의 다른 방식도 지원할 수 있다. 이러한 Static Serving 기능은 apache webserver, nginx가 하던 기능을 대체할 수 있게 해준다.

IAM

개념

Identity and Access Management의 약자로, AWS 리소스 액세스를 안전하게 제어할 수 있는 웹서비스이다. IAM은 Region 종속적인 서비스가 아닌 글로벌 리소스로, 리전마다 하나씩 구성되는 것이 아니라 전체에서 단 하나만 구성되는 리소스이다.

구성요소

  • IAM user : AWS와 상호작용하는 사용자 혹은 어플리케이션
  • IAM group : IAM user의 집합, Group을 사용하여 다수 사용자의 동일한 권한을 쉽게 관리한다.
  • role : 특정 권한을 가진 IAM 자격 증명으로, 특정 사용자 혹은 애플리케이션에 AWS 서비스 접근 권한을 위임할 수 있다.
  • policy : 접근하는 해당 권한을 정의하는 객체로, IAM 리소스들과 연결하여 사용할 수 있다. 즉, user, group, role은 각자 policy들을 가지고 있다고 보면 된다.
    • poicy의 구성요소(structure)
      • Effect : Allow / Deny. 디폴트로 IAM은 리소스 및 API 작업을 사용할 권한이 없으므로 모든 요청이 deny된다.
      • Action : 권한을 부여하거나 거부할 특정 API 작업
      • Resource : 작업의 영향을 받는 리소스. ARN(Amazon Resource Name)을 사용하거나 와일드카드(*)를 사용한다
      • Condition : 선택사항으로, 정책이 적용되는 시점 제어하는데에 사용한다. 조건을 넣어 권한을 부여할 수 있다. ex- 특정 VPC에서만 접근 허용
만약 'A'라는 policy를 가진 그룹에 'B'라는 policy를 가진 user 'Alpaca'가 소속되어있다면, Alpaca는 A, B policy의 권한을 모두 가지게 된다. 즉, policy의 permission은 OR조건으로 작동한다.
AWS account가 나뉘어서 권한이 들어가는 경우 Cross Account라고 하는데, 이 경우 policy evaluation logic이 AND조건으로 바뀐다.

참고할 것

실습

  • provider와 resource 생성. 그러나 IAM resource는 provider의 region에 종속적이지 않음.
  • IAM user 필수값
    • name
    • user를 생성한 뒤 설정해야 하는것
      • password
      • mfa(멀티팩터 인증)
      • 없으면 콘솔에 로그인 할 수 없으므로 실제 패스워드 설정은 aws cli나 콘솔로 설정해주어야한다.
      • Terrform으로도 생성 가능하지만, 이 경우 코드에 password가 남으므로 보안상 취약점이 생긴다
  • IAM group 필수값
    • name
    • IAM group_membership
      • group 객체와 user 객체간의 회원관계(membership)를 정의하는 리소스
      • 필수값
        • name - aws_iam_group.<객체명>.name
        • users - [aws_iam_user.<객체명>.name, ... , ...]
        • group - aws_iam_group.<객체명>.name>
  • IAM role 필수값
    • name
    • role_policy
      • aws_iam_role_policy 리소스 따로 정의.
      • 필수값
        • name
        • role
        • policy structure
    • IAM role_profile
      • IAM 역할을 위한 컨테이너
      • 인스턴스 시작시 EC2 인스턴스에 역할 정보 전달.
      • 콘솔에서 EC2 role을 생성하면 자동으로 인스턴스 프로파일을 생성하여 동일한 이름 부여해줌.
      • 필수값
        • name
        • role - aws_iam_role.<객체명>.name
  • IAM policy
    • AWS에서 만들어놓은 Policy set인 'AWS Managed policy'와, User가 직접 생성하는 'Customer Managed Policy'로 나뉜다.
    • user policy 필수값
      • name
      • user - aws_iam_user.<객체명>.name
      • policy structure
    • group policy 등도 같은 방식으로 설정.
EC2의 aws configure에 들어가있는 액세스 키, 시크릿 키가 없이는 관련 객체들에 접근하기 어렵다. 그러나 이런 액세스 키, 시크릿 키는 사용하거나 저장할 때 보안문제가 생기기때문에 로컬컴퓨터에만 저장해두거나, 최대한 저장처를 줄이는 것이 좋다. 따라서 이 때 권한이 있는 IAM role을 할당하여 접근할 수 있게 하는 것이 Best Practice.

WRITTEN BY

알파카의 Always Awake Devlog

Seoul