본문 바로가기
INFRA/Operation

Terraform 리소스에 대한 이해 - AWS 2편

by BTC_지수 2022. 10. 4.

안녕하세요!

하씨가문의 영광입니다.

이번에는 Terraform 리소스 AWS 환경에서의 2편인데요!!

한번 시작해볼까요! 고고~~

 

aws_eip

EIP는 Elastic IP로 동적 클라우드 컴퓨팅을 위해 고안된 고정 Public IPv 주소 입니다

 

resource "aws_eip" "example_eip" {
  vpc                       = true
  network_interface         = aws_network_interface.multi-ip.id
  associate_with_private_ip = "10.0.0.11"
}

 

resource "aws_eip" "(리소스이름)" { } 블록내의 인수는 다음과 같습니다.

 

특이하게도 여기에서는! 모든 인수들이 선택 사항 입니다.

 

  • address : EC2 BYOIP 풀의 IP 주소입니다. 이 옵션은 VPC EIP에만 사용할 수 있습니다.
  • associate_with_private_ip : 탄력적 IP 주소와 연결할 사용자 지정 기본 또는 보조 Private IP 주소입니다. Private IP 주소가 지정되지 않은 경우 탄력적 IP 주소는 기본 Private IP 주소와 연결됩니다.
  • customer_owned_ipv4_pool : 고객 소유 주소 풀의 ID 입니다. 고객 소유 ID 주소에 대한 자세한 내용은 고객 소유 IP 주소 가이드를 확인하시면 됩니다.
  • instance : EC2 인스턴스 ID 입니다.
  • network_border_group : IP 주소가 보급되는 위치입니다. 주소를 이 위치로 제한하려면 이 매개변수를 사용하시면 됩니다.
  • network_interface : 연결할 네트워크 인터페이스 ID 입니다.
  • public_ipv4_pool : EC2 IPv4 주소 풀 식별자 또는 amazon 입니다. 이 옵션은 VPC EIP에만 사용할 수 있습니다.
  • tags : 리소스에 할당할 태그의 맵입니다. 태그는 VPC의 EIP에만 적용할 수 있습니다. 제공자 default_tags 구성 블록이 있는 상태로 구성된 경우 일치하는 키가 있는 태그가 제공자 수준에서 정의된 태그를 덮어씁니다.
  • vpc : EIP가 VPC에 있는 경우 부울입니다. 영역이 EC2-Classic을 지원하지 않는 경우 기본값은 true입니다.

 

instance ID  또는 network_interface ID 중 하나를 지정할 수 있지만 둘 다 지정할 수는 없습니다. 둘다 포함 하면 AWS API에서 오류가 반환되지 않지만 정의되지 않은 동작이 발생합니다. 

 

public_ipv4_pool과 address를 모두 지정해도 오류가 발생하지 않지만 api가 둘 중 하나만 필요한 것으로 정의된 경우 주소가 사용됩니다.

 

aws_key_pair

 

key pair는 EC2 인스턴스에 대한 로그인 액세스를 제어하는 데 사용됩니다. 

 

현재 이 리소스에는 기존 사용자 제공 키 쌍이 필요합니다. 이 키 페어의 퍼블릭 키는 AWS에 등록되어 EC2 인스턴스에 로그인할 수 있습니다.

 

기존 키 페어를 가져올 때 공개 키 자료는 AWS에서 지원하는 모든 형식일 수 있습니다. 지원되는 형식은 다음과 같습니다.

- OpenSSH 공개 키 형식 (~/.ssh/authorized_keys 형식)

- Base64로 인코딩된 DER 형식

- RFC4716에 지정된 SSH 공개 키 파일 형식

 

resource "aws_key_pair" "example_keyp" {
  key_name   = "deployer-key"
  public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD3F6tyPEFEzV0LX3X8BsXdMsQz1x2cEikKDEY0aIj41qgxMCP/iteneqXSIFZBp5vizPvaoIR3Um9xK7PGoW8giupGn+EPuxIA4cDM4vzOqOkiMPhz5XK0whEjkVzTo4+S0puvDZuwIsdiW9mxhJc7tgBNL0cYlWSYVkz4G/fslNfRPW5mYAM49f4fhtxPb5ok4Q2Lg9dPKVHO/Bgeu5woMc7RY0p1ej6D4CKFE6lymSDJpW0YHX/wqE9+cfEauh7xZcG0q9t2ta6F6fmX0agvpFyZo8aFbXeUBr7osSCJNgvavWbM/06niWrOvYX2xwWdhXmXSrbX8ZbabVohBK41 email@example.com"
}

 

resource "aws_key_pair" "example_keyp" { } 블록내 인수는 다음과 같습니다.

 

<필수>

  • public_key : 공개 키 자료입니다.

<선택 사항>

  • key_name : 키 쌍의 이름입니다. key_name 또는 key_name_prefix가 제공되지 않은 경우 Terraform은 접두사 terraform-을 사용하여 고유한 키 이름을 만듭니다.
  • key_name_prefix : 지정된 접두사로 시작하는 고유한 이름을 만듭니다. key_name 과 충돌합니다. 따라서 key_name 또는 key_name_prefix가 제공되지 않은 경우 Terraform은 접두사 terraform-을 사용하여 고유한 키 이름을 만듭니다.
  • tags : 리소스 태그의 키(key) - 값(value) 맵입니다. provider default_tags 구성 블록이 있는 경우 일치하는 키를 가진 태그가 공급자 수준에서 정의된 태그를 덮어씁니다.

 

 

aws_instance

 

이번에는 제일 하이라이트인 EC2 인스턴스를 만들어보겠습니다!

 

aws_instance는 EC2 인스턴스 리소스를 제공합니다. 이를 통해 인스턴스를 생성, 업데이트 및 삭제할 수 있습니다. 인스턴스는 프로비저닝도 지원합니다.

 

resource "aws_instance" "example_ec2" {
  ami           = "ami-005e54dee72cc1d00" # us-west-2
  instance_type = "t2.micro"

  network_interface {
    network_interface_id = aws_network_interface.foo.id
    device_index         = 0
  }

  credit_specification {
    cpu_credits = "unlimited"
  }
}

 

resource "aws_instance" "example_ec2" { } 블록내 인수는 다음과 같습니다.

 

<선택 사항>

  • ami : 인스턴스에 사용할 AMI 입니다. launch_template가 지정되고 시작 템플릿이 AMI를 지정 하지 않는 한 필수 입니다. 시작 템플릿에 AMI가 지정된 경우 설정 ami는 시작 템플릿에 지정된 AMI를 재정의합니다.
  • associate_public_ip_address : public IP 주소를 VPC의 인스턴스와 연결할지 여부입니다.
  • availability_zone : 인스턴스를 시작할 AZ 존 입니다.
  • capacity_reservation_specification : 인스턴스의 용량 예약 타겟팅 옵션을 설명합니다. 

cpu_core_count 및/또는 cpu_threads_per_core를 변경하면 리소스가 삭제되고 다시 생성됩니다.

 

  • cpu_core_count : 인스턴스의 CPU 코어 수를 설정합니다. 이 옵션은 인스턴스 유형당 CPU 옵션, CPU 코어 및 CPU 코어당 thread 를 지원하는 인스턴스 유형 생성시에만 지원됩니다. 지원되지 않는 인스턴스 유형에 대해 이 옵션을 지정하면 EC2 API에서 오류가 반환됩니다.
  • cpu_threads_per_core (cpu_core_count도 설정되지 않은 경우 효과가 없음) : 1로 설정하면 시작된 인스턴스에서 하이퍼스레딩이 비활성화됩니다. 설정되지 않은 경우 기본값은 2입니다. 
  • credit_specification : 인스턴스의 신용 사양을 사용자 지정하기 위한 구성 블록입니다. Terraform은 구성에 있는 경우에만 값의 드리프트 감지를 수행합니다. 기존 인스턴스에서 이 구성을 제거하면 관리만 중지됩니다. 구성을 다시 인스턴스 유형의 기본값으로 변경하지 않습니다.
  • disable_api_stop : true인 경우 EC2 인스턴스 중지 보호를 활성화 합니다.
  • disable_api_termination : true인 경우 EC2 인스턴스 종료 보호를 활성화 합니다.
  • ebs_block_device : 인스턴스에 연결할 추가 EBS 블록 장치가 있는 하나 이상의 구성 블록입니다. 차단 장치 구성은 리소스 생성에만 적용됩니다. 
  • host_id : 인스턴스가 할당될 전용 호스트의 ID입니다. 특정 전용 호스트에서 인스턴스를 시작할 때 사용합니다.
  • host_resource_group_arn : 인스턴스를 시작할 호스트 리소스 그룹의 ARN 입니다. ARN을 지정하는 경우 tenancy parameter를 생략하거나 host로 설정합니다.
  • iam_instance_profile : 인스턴스를 시작할 IAM 인스턴스 profile 입니다. instance profile의 이름으로 지정됩니다. 
  • instance_type : 인스턴스에 사용할 인스턴스의 유형입니다. 이 필드를 업데이트하면 EC2 인스턴스의 중지/시작이 트리거됩니다.
  • ipv6_address_count : 기본 네트워크 인터페이스와 연결할 IPv6 주소의 수입니다. Amazon EC2는 서브넷 범위에서 IPv6 주소를 선택합니다.
  • ipv6_address : 기본 네트워크 인터페이스와 연결할 서브넷 범위에서 하나 이상의 IPv6 주소를 지정합니다.
  • key_name : 인스턴스에 사용할 키 쌍의 키 이름 입니다. 리소스를 사용하여 aws_key_pair 를 관리할 수 있습니다.
  • launch_template : 인스턴스를 구성할 시작 템플릿을 지정합니다. 이 리소스에 구성된 매개변수는 시작 템플릿의 해당 매개변수를 재정의합니다.
  • monitoring : true의 경우 시작된 EC2 인스턴스에 세부 모니터링이 활성화됩니다.
  • network_interface : 인스턴스 부팅시 연결할 네트워크 인터페이스를 사용자 지정합니다.
  • private_ip : VPC의 인스턴스와 연결할 프라이빗 IP 주소입니다.
  • security_groups (EC2-Classic 및 기본 VPC만 해당) : 연결할 보안그룹 이름 목록입니다.
  • subnet_id : 시작할 VPC 서브넷 ID 입니다.
  • tags : 리소스에 할당할 태그의 맵입니다. 이러한 태그는 인스턴스에 적용되며 블록 저장 장치에는 적용되지 않습니다.
  • tenancy : 인스턴스의 tenancy 입니다(인스턴스가 VPC에서 실행 중인 경우) dedicated 테넌시가 단일 테넌트 하드웨어에서 실행되는 인스턴스입니다. 
  • user_data : 인스턴스를 시작할 때 제공할 user data 입니다. 
  • user_data_base64 : base64로 인코딩된 이진 데이터를 직접 전달하는 대신 사용할 수 있습니다. user_data 값이 유효한 UTF-8 문자열이 아닐 때마다 대신 이것을 사용하십시오.
  • vpc_security_group_ids(VPC만 해당) : 연결할 그룹 ID 목록입니다.

 

EC2를 만들기까지 오늘 Terraform으로 AWS 리소스들을 다루어 보았습니다!

오늘 적은 인수들을 제외하고도 용도에 맞게 다양한 인수들이 있으니 Terraform Documentation에 들어가서 꼭!! 확인해보시길 바랍니다.

 

오늘도 많은 도움이 되셨으면 좋겠습니다.

그럼 다음 시간에 뵙겠습니다~~

 

댓글