Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Terraform을 이용한 Infrastructure as Code 실전 구성하기

3,832 views

Published on

AWS 인프라를 Infrastructure as Code로 관리하려고 Terraform을 사용한 경험을 공유합니다.

Published in: Technology
  • DOWNLOAD FULL BOOKS, INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... 1.DOWNLOAD FULL. PDF EBOOK here { https://tinyurl.com/yxufevpm } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB Ebook here { https://tinyurl.com/yxufevpm } ......................................................................................................................... 1.DOWNLOAD FULL. doc Ebook here { https://tinyurl.com/yxufevpm } ......................................................................................................................... 1.DOWNLOAD FULL. PDF EBOOK here { https://tinyurl.com/yxufevpm } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB Ebook here { https://tinyurl.com/yxufevpm } ......................................................................................................................... 1.DOWNLOAD FULL. doc Ebook here { https://tinyurl.com/yxufevpm } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Terraform을 이용한 Infrastructure as Code 실전 구성하기

  1. 1. Terraform을 이용한 Infrastructure as Code 2018.04.18
 Outsider @ AWS Summit Seoul 2018 실전 구성하기
  2. 2. VPC EC2 RDS ELB CloudFront S3 ECS Lambda CloudWatch Route53 IAM
  3. 3. Out of Control
  4. 4. 유지보수 문제 서버를 내릴 수 없다 장애가 나지 않으면 굳이 설정이나 
 구성을 바꾸지 않는다 이상한 설정이 있어도 개선하지 않는다 누가 변경을 해도 알기가 어렵다 어떤 리소스가 있는지 알 수 없다
  5. 5. 누구나 운영하고 개선할 수 있도록
  6. 6. Infrastructure as Code
  7. 7. 전통적인 인프라
  8. 8. 퍼블릭 클라우드
  9. 9. 1. 프로그래밍 가능
  10. 10. Programmable 인프라스트럭처를 소프트웨어처럼
 다룬다 소프트웨어 개발의 경험을 
 인프라스트럭처 관리에 적용한다
  11. 11. Programmable 버전 관리 도구(VCS) 코드 리뷰 테스트 자동화 지속적 통합 지속적 배포
  12. 12. 2. 온 디맨드
  13. 13. 애완동물 가축vs.
  14. 14. On Demand 반복 가능해야 한다 서버가 고장나면 교체한다 수동으로 작업하지 않는다
  15. 15. Infrastructure as Code
  16. 16. Write, Plan, and Create Infrastructure as Code
  17. 17. Write, Plan, and Create Infrastructure as Code
  18. 18. Terraform 오픈 소스 AWS 뿐만 아니라 다양한 프로바이더 지원 HCL로 리소스 선언 커맨드라인 인터페이스 사용
  19. 19. 테라폼은 어렵지 않다.
  20. 20. 간단한 Terraform의 사용 방법
  21. 21. resource "aws_instance" "api" { ami = "ami-d39a02b5" # ubuntu 16.04 instance_type = "t2.micro" subnet_id = "subnet-xxxxxxxx" security_groups = ["sg-xxxxxxxx"] key_name = "your-key-pair" } HCL(HashiCorp Configuration Language)
  22. 22. resource "aws_instance" "api" { ami = "ami-d39a02b5" # ubuntu 16.04 instance_type = "t2.micro" subnet_id = "subnet-xxxxxxxx" security_groups = ["sg-xxxxxxxx"] key_name = "your-key-pair" } HCL(HashiCorp Configuration Language) 예약어 리소스 종류 리소스 이름 속성 명 속성 값
  23. 23. 설정(.tf) 상태(.tfstate) 리소스(aws) ec2.tf aws_instance.api
  24. 24. $ terraform plan ------------------------------------------------------ Terraform will perform the following actions: + aws_instance.api id: <computed> ami: "ami-d39a02b5" associate_public_ip_address: <computed> availability_zone: <computed> instance_type: “t2.nano" security_groups.#: “1” security_groups.541019735: "sg-247b2042" source_dest_check: "true" Plan: 1 to add, 0 to change, 0 to destroy. terraform plan
  25. 25. 설정(.tf) 상태(.tfstate) 리소스(aws) 비교 비교 ec2.tf aws_instance.api
  26. 26. $ terraform apply aws_instance.api: Creating... ami: "" => "ami-d39a02b5" associate_public_ip_address: "" => "<computed>" availability_zone: "" => "<computed>" instance_type: "" => "t2.nano" security_groups.#: "" => "1" security_groups.541019735: "" => "sg-247b2042" source_dest_check: "" => ”true” aws_instance.api: Still creating... (10s elapsed) aws_instance.api: Creation complete after 23s (ID: i-0xxx) Apply complete! Resources: 1 added, 0 changed, 0 destroyed. terraform apply
  27. 27. { "version": 3, "terraform_version": "0.11.2", "modules": [{ "resources": { "aws_instance.api": { "type": "aws_instance", "depends_on": [], "primary": { "id": "i-0cf4c4b56bad7ddb1", "attributes": { "ami": "ami-d39a02b5", ... }, "meta": { "schema_version": "1" }, }, "provider": "provider.aws" } } }] } terraform.tfstate
  28. 28. 설정(.tf) 상태(.tfstate) 리소스(aws) ec2.tf aws_instance.api terraform.tfstate aws_instance.api EC2 aws_instance.api
  29. 29. 설정(.tf) 상태(.tfstate) 리소스(aws) ec2.tf aws_instance.api terraform.tfstate aws_instance.api EC2 aws_instance.api 모두 일치
  30. 30. Terraform 실전 적용
  31. 31. 기존 레거시를 가져와야 한다
  32. 32. $ terraform import aws_instance.web i-123456 aws_instance.web: Importing from ID "i-123456"... aws_instance.web: Import complete! Imported aws_instance (ID: i-123456) aws_instance.web: Refreshing state... (ID: i-123456) Import successful! The resources that were imported are shown above. These resources are now in your Terraform state and will henceforth be managed by Terraform terraform import
  33. 33. “Terraform import의 현재 구현체는 상태로만 리소스를 가져올 수 있습니다. 이는 설정을 만들지 않습니다. Terraform 차기 버전에서는 설정도 생성할 것입니다. https://www.terraform.io/docs/import/index.html
  34. 34. 설정(.tf) 상태(.tfstate) 리소스(aws) EC2 aws_instance.web
  35. 35. 설정(.tf) 상태(.tfstate) 리소스(aws) terraform.tfstate aws_instance.web EC2 aws_instance.web
  36. 36. $ terraform import aws_instance.web i-123456 Error: resource address "aws_instance.web" does not exist in the configuration. Before importing this resource, please create its configuration in the root module. For example: resource "aws_instance" “web" { # (resource arguments) } terraform import
  37. 37. 상태와 일치할 때까지 테라폼 설정파일을 작성한다.
  38. 38. 길고 지루한 작업....
  39. 39. 테라폼 설정 파일은 AWS 리소스에 대한 이해가 없으면 작성할 수 없다
  40. 40. 자동화된
 마법사가 없다!
  41. 41. AWS 리소스에 대한 이해도가 엄청나게 높아진다
  42. 42. terraforming https://github.com/dtan4/terraforming 기존 AWS 리소스를 가져온다 AWS만 지원한다 tf, tfstate를 모두 가져올 수 있다 설정을 참고할 수 있다
  43. 43. tfstate는 원격으로 관리한다 (Remote State)
  44. 44. Remote State terraform.tfstate 원격 저장소에서 관리한다 Consul, AWS S3, Google Cloud Storage (GCS), etcd, Terraform Enterprise 등의 백엔드 지원 상태 파일에는 민감한 정보가 있을 수 있으므로 
 암호화를 해야 한다 백엔드에 따라 Lock을 사용할 수도 있다
  45. 45. terraform { backend "s3" { bucket = "terraform-state" key = "ec2/terraform.tfstate" region = "ap-northeast-1" encrypt = true kms_key_id = "alias/terraform_state" dynamodb_table = "terraform-lock" } } S3 remote state backend
  46. 46. S3 Backend S3 버킷의 버저닝 기능을 사용한다 KMS로 암호화한다 DynamoDB를 Lock 테이블로 사용한다 S3 버킷과 DynamoDB, KMS 는 미리 
 만들어 두어야 한다
  47. 47. terraform.tfstate tfstate는 점점 커지게 된다 관리가 어려워 진다 plan, apply에 시간이 많이 걸린다
  48. 48. tfstate 파일은 작게 나누어서 관리한다
  49. 49. 분리한 tfstate 사이에서도 리소스 참조를 해야한다
  50. 50. sg-48630c2e vs. "${aws_security_group.public.id}"
  51. 51. 리소스를 가진 쪽에서 값을 노출한다
  52. 52. output "public_id" { value = "${aws_security_group.public.id}" } output으로 노출
  53. 53. 다른 곳에서는 가져와서 사용한다
  54. 54. data "terraform_remote_state" "vpc" { backend = "s3" config { bucket = "terraform-state" key = "vpc/terraform.tfstate" region = "ap-northeast-1" dynamodb_table = "terraform-lock" } } terraform_remote_state
  55. 55. $ terraform refresh data.terraform_remote_state.vpc: Refreshing state... terraform refresh
  56. 56. resource "aws_instance" "api" { ami = "ami-d39a02b5" instance_type = "t2.nano" security_groups = [ "${data.terraform_remote_state.vpc.public_id}" ] } 리소스 상호 참조
  57. 57. Data Source를 많이 사용하자
  58. 58. data "aws_ami" "ubuntu" { most_recent = true filter { name = "name" values = [ "ubuntu/images/hvm-ssd/ubuntu-xenial-16.04-amd64-server-*" ] } filter { name = "virtualization-type" values = ["hvm"] } owners = ["099720109477"] # Canonical } data “aws_ami”
  59. 59. "${data.aws_ami.ubuntu.id}" # ami-48630c2e data “aws_ami”
  60. 60. data "aws_availability_zones" "available" {} data “aws_availability_zones”
  61. 61. "${data.aws_availability_zones.main.names}" # [ # ap-northeast-1a, # ap-northeast-1c, # ap-northeast-1d # ] data “aws_availability_zones”
  62. 62. 모듈
  63. 63. modules 재사용가능한 컴포넌트 내부 구조를 숨길 수 있다 AWS 리소스를 다 이해 못해도 인프라를 
 만들 수 있다 다른 조직에도 일관된 인프라로 제공할 수 있다
  64. 64. 템플릿 처럼 생각하는 게 이해가 쉬울 수도...
  65. 65. ├── main.tf # 리소스 설정 ├── outputs.tf # 출력값 └── variables.tf # 입력값 Module 구조
  66. 66. # 필수 variable "name" { description = "ALB 이름" } # 옵션 variable "subnet_ids" { description = "ALB에 적용할 서브넷 ID 리스트" type = "list" default = [] } variables.tf
  67. 67. resource "aws_alb" "main" { name = "${var.name}" internal = false subnets = ["${var.subnet_ids}"] security_groups = ["sg-1234567"] } main.tf
  68. 68. output "name" { value = "${aws_alb.main.name}" } # ALB ID output "id" { value = "${aws_alb.main.id}" } # ALB ARN. output "arn" { value = "${aws_alb.main.arn}" } output.tf
  69. 69. module "service_alb" { source = "./modules/alb" name = "service" subnet_ids = [ "subnet-2784b551" ] } alb.tf
  70. 70. 나아진 점
  71. 71. 인프라를 코드로 관리할 수 있게 되었다
  72. 72. 코드로 관리하므로 검색을 할 수 있다
  73. 73. 인프라가 변경된 히스토리를 알 수 있게 되었다
  74. 74. 누가 언제 인프라를 변경하는지가 투명하게 공개된다
  75. 75. 인프라 변경에 관해 코드 리뷰를 할 수 있다
  76. 76. 관리가 가능해진 인프라
  77. 77. https://twitter.com/outsideris https://github.com/outsideris outsideris@gmail.com

×