https://www.packer.io/docs/templates/hcl_templates/datasources
Packer by HashiCorp
Data sources allow data to be fetched or computed for use elsewhere in local variables and build sources configuration. Use of data sources allows a Builder to make use of information defined outside of Packer.
www.packer.io
packer의 data-source는 이전의 terraform의 data블럭과 매우 유사하기 때문에, 이해하기 쉬울겁니다.
packer data-source를 활용하게되면, 특정 provider가 제공하는, 데이터를 제공받을 수 있게 됩니다.
data "amazon-ami" "ubuntu" {
filters = {
virtualization-type = "hvm"
name = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
root-device-type = "ebs"
}
owners = ["099720109477"]
most_recent = true
}
다음과 같이 amazon-ami를 이용해서 filter과정을 거쳐, 원하는 머신의 ami를 찾아서 이를 재사용할 수 있습니다.
또한 AWS EC2에는 다양한 Data Sources들이 존재합니다. 여기서 Amazon AMI는 위에서 보았고, Parameter Store, Secrets Manager는 AWS에서 서비스를 사용할 때, 외부에 노출되서는 안되는 다양한 비밀값들이 존재할 수 있습니다. 이를 Packer 코드에 하드코딩하게되면, 보안상 문제가 있을 수 있습니다.
즉 이를 사용하면 외부에 노출되서는 안되는 값들을 AWS Parameter Store, Secrets Manager를 사용하여 저장하고, Packer가 샐행될 때, 이를 참조하여 사용할 수 있습니다.
이 외에도 Hashicorps, HCP Packer,...등의 다양한 provider가 존재합니다.
/sources.pkr.hcl
data "amazon-ami" "ubuntu" {
filters = {
virtualization-type = "hvm"
name = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
root-device-type = "ebs"
}
owners = ["099720109477"]
most_recent = true
}
source "amazon-ebs" "ubuntu" {
instance_type = "t2.micro"
region = "ap-northeast-2"
source_ami = data.amazon-ami.ubuntu.id
ssh_username = "ubuntu"
}
이렇게 다른 source들 안에 AMI Image와 관련된 블럭을 반복해서 작성하는 것보다, 이렇게 재사용하는 것이 훨씬 효율적입니다.
/main.pkr.hcl
data "amazon-secretsmanager" "fast-campus" {
name = "fastcampus"
key = "test"
}
build {
name = "fastcampus-packer"
source "amazon-ebs.ubuntu" {
name = "nginx"
ami_name = "fastcampus-packer-nginx"
}
provisioner "shell" {
inline = [
"sudo apt-get update",
"whoami",
"echo Secret is ${data.amazon-secretsmanager.fastcampus.value}"
]
}
provisioner "file" {
source = "${path.root}/files/index.html"
destination = "/tmp/index.html"
}
provisioner "shell" {
inline = [
"echo ${source.name} and ${source.type}",
"whoami",
"sudo apt-get install -y nginx",
"sudo cp /tmp/index.html /var/www/html/index.html"
]
}
provisioner "breakpoint" {
disable = false
note = "디버깅용"
}
}
다음과같이 main에서는 amazon-secretmanager를 활용해서 값을 provisioning중에 비밀값을 출력했습니다.
다음과 같이 data-source로부터 ami이미지를 잘 찾아온 것을 확인할 수 있습니다.
그리고 다음과 같이 Secret값이 잘 출력되는 것을 보실 수 있습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - (패커를 이용한 머신 이미지 관리) - 디버깅하는 방법 (Debugging) (0) | 2022.08.02 |
---|---|
[ DevOps ] - (패커를 이용한 머신 이미지 관리) - 후 처리기 (Post-processor) (0) | 2022.08.02 |
[ DevOps ] - (패커를 이용한 머신 이미지 관리) - 프로비저너 (Provisioner) (0) | 2022.08.02 |
[ DevOps ] - (패커를 이용한 머신 이미지 관리) - 기초 && 빌더 (0) | 2022.08.02 |
[ DevOps ] - (패커를 이용한 머신 이미지 관리) - 패커 소개 (0) | 2022.08.02 |