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를 만드는 과정은 생략한다.
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
- booleanlifecycle
- gateway 필수값
- Internet Gateway
vpc_id
- NAT-Gateway
allocation_id
-<eip 타입>.<eip명>.id
subnet_id
-<subnet 타입>.<subnet 명>.id
--> 이때, private이 아니라 public subnet을 연결해야 한다. NAT-Gateway는 구조적으로 public subnet에 있다!
- Internet Gateway
- 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
- routetable
- endpoint 관련 필수값
vpc_id
service_name
- s3같은 서비스에 게이트웨이를 통하지 않고 바로 연결- 물론, routetable도 연결해주어야 한다.
resoure "aws_route_table" "route_tb" { ... route { cidr_block = "0.0.0.0/0" gateway_id = <gateway 타입>.<gateway 명>.id } ...}
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
- defaultReduced 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으로 설정하면 버킷 내의 객체에 누구나 접근할 수 있게 된다.
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에서만 접근 허용
- poicy의 구성요소(structure)
참고할 것
실습
- 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>
- 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 등도 같은 방식으로 설정.
- DevOps:Infrastructure as Code with 테라폼(Terraform) and AWS - 사전준비 편
- DevOps:Infrastructure as Code with 테라폼(Terraform) and AWS - 심화편