이번에는 기본적이지만 조금 큰 사이즈의 인프라를 구축해보려 한다. 기본적인 흐름은 다음과 같다. 사용자는 Route 53에 등록된 Domain을 통해 접근한다. Route 53은 매칭되는 Alias를 통해 CloudFront에 접근한다. CloudFront는 동적인 Path라면 IGW(Internet Gateway)를 통해 ALB의 Origin으로, 정적인 Path라면 S3의 Origin으로 Forward한다. ALB에 의해서 Auto Scaling되는 EC2들에 로드밸런싱을 하고, 이 Auto Scaling Group(이하 ASG)는 동일한 EBS를 공유한다. RDS는 Master/Standby로 서로 다른 리전에 구성해 가용성을 높인다. 관리자는 키페어를 사용한 SSH를 통해 Public Subnet..
시나리오 1) 사용자는 CloudFront에서 제공하는 Domain Name을 통해 Request를 보낸다. 예를 들면, http://cloudfront.example.com/test.mp4와 같은 Request! 2) CloudFront는 Behavior 목록에서 /test.mp4에 일치하는 Path Pattern을 찾는다. 3) 찾은 항목의 Origin에 설정된 Origin Domain Name & Path 로 전달한다. 사용자는 S3 Bucket에 직접 접근할 수 없고, CloudFront를 통해서만 접근할 수 있다. 이때 CloudFront에 보호 계층을 추가해 전체적인 인프라 구성에 보안성을 향상시킬 수 있다. 자세한 내용은 CloudFront 포스팅을 참고하자. ch4njun.tistory.c..
시나리오 [Users] 1) 사용자는 80번 포트를 통해 Route53에 Request를 보낸다. (http://example.com:80) 2) Route53은 이를 Internet Gateway를 통해 Load Balancer로 전달한다. 3) Load Balancer는 이를 8080번 포트로 Auto Scailing되고 있는 EC2 서버에 전달한다. 4) EC2 서버는 Request보낸 것에 대한 Response를 NAT Gateway를 통해 보낸다. [Admin] 1) SSH Key를 사용해 Public Subnet에 위치한 관리자용 EC2에 연결한다. 2) 관리자용 EC2에 저장된 SSH Key를 사용해 웹 서버가 구동중인 EC2에 연결한다. vpc.tf # VPC를 10.0.0.0/16 B C..
Terraform Import? Terraform에서 Import는 Terrafomr을 통해서 생성된 Resource가 아니라 AWS Console을 통해서 직접 추가한 Resource나 다른 Terraform 환경에서 생성한 Resource를 가져오기 위해 제공되는 CLI 명령이다. 사용하는 이유는 Terrafomr은 tfstate파일에 있는 Resource만 본다는 점 때문이다. 이런 Terraform Import를 사용하는 간단한 예시를 살펴보고 몇 가지 특징에 대해서 정리해본다. 1. AWS IAM User에 대한 Resource를 가져오기 이와 같이 AWS Console 상에서는 총 5개의 IAM User를 확인할 수 있다. 그러나, Terraform의 tfstate파일에는 이러한 정의가 되어있..
테라폼을 수행할 때 마다 최상위 경로에 state파일을 생성해 인프라의 모든 정보를 저장해 놓는다. 이 파일은 JSON형식으로 실제 환경의 리소스와 대응되는 정보들이 저장되어 있다. 개인 프로젝트가 아니라 팀 프로젝트라면 다음 요구사항들이 지켜져야 한다. 1. 상태 파일의 공유 스토리지 2. 상태 파일의 잠금 3. 상태 파일의 분리 Git과 같은 버전관리도구를 통해 상태 파일을 사용하는 것은 옳지 못한 방법이다. 왜냐하면 최신 변경 사항을 업데이트 하지 않거나 변경된 사항을 가져오지 않는 실수를 할 여지가 있고, 상태파일이 일반 텍스트로 저장되기 때문에 보안상 문제가 발생할 가능성이 있다. 때문에 테라폼에서 내장으로 제공하는 Remote State Storage를 사용하는 것이 좋다. 1. AWS S3 ..
입력 변수 Terraform 코드를 작성하다면 아래와 같이 중복된 내용을 여러번 작성하는 경우가 발생한다. resource "aws_security_group" "instance" { name = "ch4njun-example-instance" ingress { from_port = 8080 to_port = 8080 protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_instance" "example" { ami = "ami-40d28157" instance_type = "t2.micro" vpc_security_group_ids = ["${aws_security_group.instance.id}"] user_data =