IaC - AWS infra as of Terraform Code

Jaeminst·2022년 4월 21일
3
post-thumbnail

Terraform

IaC를 이용하여 AWS의 인프라 구축을 Code로 구현.
위, 썸네일은 내가 직접 완성시킨 인프라를 diagrams.net 사이트를 활용해 표현 하였다.


Getting Started

IaC 코드를 작성하려면 먼저 AWS Management Console을 이용해 먼저 최종 인프라 상태를 만들어놓고, 잘 작동하는지 확인한 다음, 이를 해당하는 리소스를 하나씩 코드로 옮기는 방법을 사용하는 방식을 사용해보면 좋습니다.

먼저 AWS Management Console을 통해 최종 결과물을 따라해보고, 예상 상태가 무엇인지 먼저 파악해야 합니다.

모든 리소스를 만들 때에는 반드시 이름을 붙여놓도록 합시다.


Sprint

STEP 1: Amazon VPC 생성

  1. VPC 및 서브넷 생성
  2. VPC 보안 그룹 생성
  3. DB 서브넷 그룹 생성

STEP 2: EC2 인스턴스 생성

  • AMI: Ubuntu Server 18
  • 인스턴스 타입: t2.micro
  • 사용자 데이터:
#!/bin/bash
echo "Hello, World" > index.html
nohup busybox httpd -f -p ${var.server_port} &

STEP 3: DB 인스턴스 생성

STEP 4: 애플리케이션 로드 밸런서 및 Auto Scaling Group 적용

  • Auto Scaling Group은 최소 2개, 최대 10개로 설정해놓습니다.

Trouble shooting


Command: terraform login

- Web browser Error

[29056:29056:0100/000000.181137:ERROR:sandbox_linux.cc(377)]
InitializeSandbox() called with multiple threads in process gpu-process.

테라폼 클라우드에 토큰을 등록하기 위해 열리는 웹 브라우저가 gpu 작동되는 문제로 터미널에서 열 수 없다.

해결방법

크롬에서 파이어폭스로 웹 브라우저를 바꾸어서 진행하였다.

아래와 같이 Firefox에서는
ATTENTION: default value of option mesa_glthread overridden by environment.
에러가 발생했지만, 참고사이트를 보고 간단히 해결할 수 있었다.

여러가지 백 그라운드로 실행하는 솔루션이 제시 되어 있었고, 그 중에서 firefox &>/dev/null & disown 명령으로 진행하였다.


Command: terraform apply

- Who am "099720109477" ?

AWS에서 인프라를 콘솔에서 직접 만들고 Import 해왔던 tfstate를 보았는데 소유자가 099720109477로 되어있었다.

궁금해서 Quickstart AMI도 보고 마켓플레이스에서 검색도 해보았는데 찾기 어려웠다.
하지만, 구글링을 통하여 알 수 있었다.
Cloud Images - Amazon EC2 | Ubuntu

그래서 혹시나 커뮤니티 AMI에 있지 않을까? 해서 봤더니 진짜 있었다.

그래서 우분투 공식 ami라는것을 알게되었다.


- aws_lb_listener "SSL policy"

Error: error creating ELBv2 Listener (arn:aws:elasticloadbalancing:us-west-1:*:loadbalancer/app/terraform-web-alb/d42e665
2f35dcac5): ValidationError: An SSL policy cannot be specifed for HTTP listeners
	status code: 400, request id: fdf76149-d574-47ec-8468-361ddb706474
    
  with aws_lb_listener.terraform-web-alb,
  on alb-listener.tf line 1, in resource "aws_lb_listener" "terraform-web-alb":
   1: resource "aws_lb_listener" " terraform-web-alb" {

오류: ELBv2 리스너 생성 중 오류 발생(arn:aws:elasticloadbalancing:us-west-1:--:loadbalancer/app/terraform-web-alb/d42e665 2f35dcac5): ValidationError: HTTP 수신기에 대해 SSL 정책을 지정할 수 없습니다.

Load balancer는 HTTP 통신을 이용할 때 SSL policy가 필요하지 않다.

해결방법

간단히 코드에서 ssl_policy를 없애주면 된다.


- aws_autoscaling_group "InstanceType parameter"

Error: Error creating Auto Scaling Group: InvaliQueryParameter: An instance type does not exist in the specified launch template. An
instance type must be defined in the launch template while the Auto Scaling group is not configured as a mixed instances group. Use
a different launch template that contains the InstanceType parameter, and try again.
	status code: 400, request id: d5647229-da20-47b8-ab7e-96717c9392be
    
  with aws_autoscaling_group.ec2-web-scaling,
  on asg.tf line 1, in resource "aws_autoscaling_group" "ec2-web-scaling":
   1: resource "aws_autoscaling_group" "ec2-web-scaling" {

오류: Auto Scaling 그룹 생성 오류: InvaliQueryParameter: 지정된 시작 템플릿에 인스턴스 유형이 없습니다. 안 인스턴스 유형은 시작 템플릿에서 정의해야 하며 Auto Scaling 그룹은 혼합 인스턴스 그룹으로 구성되지 않습니다. 사용 InstanceType 파라미터가 포함된 다른 시작 템플릿을 선택하고 다시 시도하십시오.

Auto Scaling Group을 생성하거나, 시작 템플릿을 정의할 때 인스턴스 타입이 지정되지 않았다.

해결방법

오토스케일링에서 인스턴스 타입을 지정해주었다.


- aws_autoscaling_group "Security groups"

Error: Error creating Auto Scaling Group: InvalidQueryParameter: Invalid launch template: When a network interface is provided, the
security groups must be a part of it.
	status code: 400, request id: d93bed62-c066-467f-99ad-815c18d28888
    
  with aws_autoscaling_group.ec2-web-scaling,
  on asg.tf line 1, in resource "aws_autoscaling_group" "ec2-web-scaling":
   1: resource "aws_autoscaling_group" "ec2-web-scaling" {

오류: Auto Scaling 그룹 생성 중 오류 발생: InvalidQueryParameter: 잘못된 시작 템플릿: 네트워크 인터페이스가 제공되면 보안 그룹은 그 일부여야 합니다.

시작 템플릿의 공식문서에서 여러가지의 방법들을 보면서 작성하다 보니, 보안 그룹을 이중으로 선언하였다.
여기서 보안 그룹은 네트워크 인터페이스에 위치해야 한다.

따라서, 아래와 같이 보안그룹을 지워주었다.


- aws_autoscaling_policy "Resource label"

Error: Error putting scaling policy: ValidationError: Resource label should be specified for predefined metric type ALBRequestCountPerTarget
	status code: 400, request id: dd5504f2-3359-4b99-aef7-c8fae5ba14e4
    
  with aws_autoscaling_policy.test-policy,
  on asg-aclh.tf line 1, in resource "aws_autoscaling_policy" "test-policy":
   1: resource "aws_autoscaling_policy" "test-policy" {

오류: 조정 정책을 넣는 동안 오류 발생: ValidationError: 사전 정의된 메트릭 유형 ALBRequestCountPerTarget에 대해 리소스 레이블을 지정해야 합니다.

오토스케일링 정책인 "대상 추적 구성"을 선언하였다.
그런데 리소스 라벨을 등록해야한다.

해결방법

공식문서를 참조하여 아래와 같이 값을 넣어주어야 한다.

라벨은 애플리케이션 로드 밸런서의 타겟그룹을 지정하는 변수를 입력해야 한다.


- aws_db_instance "DBName Error"

Error: Error creating DB Instance: InvalidParameterValue: DBName must begin with a letter and contain only alphanumeric characters.
	status code: 400, request id: 32dc...  , {
.
.
.

오류: DB 인스턴스 생성 오류: InvalidParameterValue: DBName은 문자로 시작해야 하며 영숫자 문자만 포함해야 합니다.

DB Instance에서 Name의 값이 규칙에 어긋났다.

해결방법

특수문자로 시작해서는 안되며 영숫자만 입력해야 한다.
terraform-mysql --> dbmysql 로 변경해주었다.


- aws_route_table_association "Route Table Error"

Error: error creating Route Table (rtb-0f74c3f80fc7ae02d) Association: Resource.AlreadyAssociated: the specified association for
route table rtb-0f74c3f80fc7ae02d conflicts with an existing association
	status code: 400, request id: 66083e36-88f9-452d-857d-ef8344ad92fe
    
  with aws_route_table_association.db-rt1,
  on rta.tf line 29, in resource "aws_route_table_association" "db-rt1":
  29: resource "aws_route_table_association" "db-rt1" {

오류: 경로 테이블 생성 중 오류 발생(rtb-0f74c3f80fc7ae02d) 연결: Resource.AlreadyAssociated: 지정된 연결 라우팅 테이블 rtb-0f74c3f80fc7ae02d가 기존 연결과 충돌합니다.

RDS용으로 만든 서브넷을 라우트 테이블에 이어주었는데 충돌이 발생했다.

아래, 두 스크린샷을 보면 다른 라우팅 테이블에 같은 서브넷을 넣어서 발생하였다.

해결방법

따라서, RDS용으로 만든 서브넷을 재확인하여 알맞게 넣어 주었다.


Complete sprint

느낀 점

테라폼을 사용하면서 큰 매력을 느꼈다.
코드를 작성하는게 어려웠지만, 공식 문서를 보고 import나 terraforming같은 명령을 통해 쉽게 state를 확인할 수 있었다.
덕분에, 쉽게 진행을 했던 것 같다.

하지만 익숙해 지는데 시간이 많이 걸렸어서 초반에 시간을 많이 잡고 있었다.

마치며

테라폼과 많이 친해진 것 같다.
작성을 완료하고 나서도 계속 추가적으로 넣고싶은 것들이 생겼다.

Github commit history

Finish하고 error를 잡고나서 "Hello, World"를 띄웠지만, 여러가지를 추가하고 수정해보고 싶었다.
이후, 변수로 코드를 리팩터링하고, 테라폼 클라우드로 state를 공유하고 변수관련하여 수정하였다.
모든 과정을 마치고, Complete sprint 스크린샷처럼 작동할 수 있게 되었다.

profile
DevOps !

0개의 댓글