[테라폼] 프로비저닝

소프트웨어 프로비저닝

인스턴스에서 소프트웨어를 프로비저닝 하는 방법은 두가지이다. 

지금까지는 평범한 리눅스 이미지로 인스턴스를 실행했고, 아무런 소프트웨어를 넣지 않았다.

하지만 소프트웨어를 설치하거나 뭔가를 프로비저닝하고 싶을 수 있다.

맞춤형 이미지와 번들, 원하는 이미지의 소프트웨어를 포함하는  사용자 정의 AMI를 구축할 수 있다. 


프로비저닝 방법

표준화된 AMIs를 부팅하고,필요한 소프트웨어를 설치하는 것. 파일 업로드를 통해서 할 수 있다.

원격으로 파일을 실행하고 스크립트 할 수 있고 셰프, 퍼펫 그리고 앤시블 같은 자동화 툴을 사용할 수 있어요

셰프는 테라폼 내에 통합되어 있으니까 테라폼 파일에 셰프 명령문을 포함할 수 있다.

현재는 퍼펫 에이전트가 통합되어 있지 않지만 {remote-exec}을 사용해서 퍼펫을 사용할 수 있다.

앤시블에서는 먼저 테라폼을 실행하고, IP주소를 출력하고 {ansible-playbook}을 이러한 호스트들에서 실행할 수 있다.

이러한 작업 흐름은 스크립트로 자동화 될 수 있다. 그러면 테라폼을 먼저 실행하고 앤시블을 실행해야한다.

 

파일 업로드 instance.tf

이러한 파일구조를 가진 디렉토리에서 작업을 할 것이다.

resource "aws_instance" "example" {
  ami           = "${lookup(var.AMIS,var.AWS_REGION)}"
  instance_type = "t2.micro"
  subnet_id = "${lookup(var.AWS_SUBNET, var.AWS_REGION)}"
}

 현재 instance.tf의 코드는 이렇다.

resource "aws_instance" "example" {
  ami           = "${lookup(var.AMIS,var.AWS_REGION)}"
  instance_type = "t2.micro"
  subnet_id = "${lookup(var.AWS_SUBNET, var.AWS_REGION)}"
 
 provisioner "file" {
  source ="app.conf"
  destination = "/etc/myapp.conf"
   
 }
 }

파일 업로드를 추가하기 위해서 프로비저너 파일을 AWS 인스턴스 리소스에 추가할 수 있다.

{source="app.conf"}를 입력하면 .tf 파일 옆에 넣을 파일이 된다. 그리고 이 인스턴스가 목적지다.

 

파일 업로드는 파일이나 스크립트를 업로드하는 쉬운 방법이고, 스크립트를 실행하기 위해 {remote-exec}로 함께 사용될 수 있다.

나는 구성 파일을 업로드 할거다.

원격 실행으로 파일이나 스크립트를 실행하고 프로비저너는 리눅스에서는 SHH, 윈도우에서는 WinRM을 사용하고 나는 맥이라서 SHH를 사용한다.


SHH를 기본값으로 재정의해야한다.

resource "aws_instance" "example" {
  ami           = "${lookup(var.AMIS,var.AWS_REGION)}"
  instance_type = "t2.micro"
  subnet_id = "${lookup(var.AWS_SUBNET, var.AWS_REGION)}"
 
 provisioner "file" {
  source ="app.conf"
  destination = "/etc/myapp.conf"  
  connection {
    user = "${var.instance_username}"
    password = "${var.instance_password}"
  } 
 }
 }

이를 위해 {connection} 을 사용한다. 그리고 테라폼에서 이 호스트를 연결하기 위해 사용할 매개 변수를 수정한다.

'Connection'의 유형은 기본값으로 SHH입니다

다른 유형을 사용하고 싶은 경우엔 {type=다른 유형}을 정의해야 합니다

사용자와 암호를 사용하면 AWS에서 인스턴스를 가동할 때 ec2-user는 아마존 리눅스의 기본 사용자이고, 우분투 이미지에서는 {ubuntu}입니다

일반적으로 AWS에서는, 암호를 사용하는 대신 SHH 키 페어를 사용한다. 암호의 대안인데 SHH 키 쌍을 사용하려면 이름을 지정할 또 다른 리소스가 필요하다.



Key pair

resource "aws_key_pair" "june-key" {
  key_name = "mykey"
  public_key = "ssh-rsa my-public-key"
}

resource "aws_instance" "mock" {
  ami           = "${lookup(var.AMIS,var.AWS_REGION)}"
  instance_type = "t2.micro"
  subnet_id = "${lookup(var.AWS_SUBNET, var.AWS_REGION)}"
  key_name = "${aws_key_pair.mykey.key_name}"
  
 provisioner "file" {
  source ="app.conf"
  destination = "/etc/myapp.conf"  
  connection {
    user = "${var.instance_username}"
    private_key = "${file("${var.path_to_private_key}")}"

  } 
 }
 }

 

resource {aws_key_pair}는 , 리소스로 aws key pair를 가져온다는 뜻이고, 이 경우엔 {myKey}를 사용하고 {public_key}를 지정한다.

즉, 키 페어는 비공개 키공개 키를 생성한다는 걸 의미한다.

공개 키는 AWS에 업로드 할 키다. {public_key =}를 정의한 이유이다.

그리고 {private_key}는 로그인하기 위한 키다. {"aws_instance" "mock"} 리소스를 살펴보면, 여기 {key_name =} 가 있다.

 

그리고

 key_name = "${aws_key_pair.mykey.key_name}"

보면 공개키를 참조해서 AWS가 이 공개키를 AWS 인스턴스에 설치해야 함을 알 수 있다.

 

그리고, 프로비저너를 사용할 때 {provisioner "file"} {"script.sh"}를 업로드할 것이다. 그러고 나서 공개키를 참조.

{connection} 을 살펴보면 ec2 사용자 혹은 {ubuntu}이어야 할 사용자가 아직 있죠

 

다음에 암호를 지정하는 것 대신 공개키를 지정한다. 이 공개키는 SHH를 통해 ec2 인스턴스에 로그인하고 이 {script.sh}를 업로드하는데 사용된다.

또한 개인키와 공개키를 사용해서 로그인 할 수 있죠

처음에 인스턴스를 부팅했을 때는, 공개키를 사용하고 있지 않았는데, 인스턴스에 로그인할 수 없다는 걸 의미한다. {aws_key_pair}를 지정했을 때만 공개키로 AWS 인스턴스에 로그인할 수 있다.

 


스크립트 업로드 후 실행

resource "aws_instance" "mock" {
  ami           = "${lookup(var.AMIS,var.AWS_REGION)}"
  instance_type = "t2.micro"
  subnet_id = "${lookup(var.AWS_SUBNET, var.AWS_REGION)}"

  provisioner "file" {
   source = "script.sh"
   destination = "/opt/script.sh"
  }
  provisioner "remote-exec" {
    inline = [
      "chmod +x /opt/script.sh",
      "/opt/script.sh arguments"
    ]
  }
 }

{remote-exec}를 사용해서 스크립트를 실행할 수 있다.

 

 {"remote-exec"}를 사용하는 프로비저너를 추가하고

이건 {chmod}를 사용해서 권한을 변경한다.

{+x}실행 가능을 의미하기에 이 스크립트를 실제로 실행하기 위해 {chmod +x}를 넣는다.

 


 

 

JUNE .

20'S LIFE IN SYDNEY and BUSAN

    이미지 맵

    DevOps Study/Terraform 다른 글

    이전 글

    다음 글