소프트웨어 프로비저닝
인스턴스에서 소프트웨어를 프로비저닝 하는 방법은 두가지이다.
지금까지는 평범한 리눅스 이미지로 인스턴스를 실행했고, 아무런 소프트웨어를 넣지 않았다.
하지만 소프트웨어를 설치하거나 뭔가를 프로비저닝하고 싶을 수 있다.
맞춤형 이미지와 번들, 원하는 이미지의 소프트웨어를 포함하는 사용자 정의 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}를 넣는다.
댓글