$ brew tap hashicorp/tap
$ brew install hashicorp/tap/packer
$ aws configure
{
"variables": {
"aws_region": "us-west-2",
"ami_name": "my-ami",
"instance_type": "t2.micro",
"ssh_username": "ubuntu"
},
"builders": [{
"type": "amazon-ebs",
"region": "{{user `aws_region`}}",
"source_ami_filter": {
"filters": {
"virtualization-type": "hvm",
"name": "ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-*",
"root-device-type": "ebs"
},
"owners": ["099720109477"],
"most_recent": true
},
"instance_type": "{{user `instance_type`}}",
"ssh_username": "{{user `ssh_username`}}",
"ami_name": "{{user `ami_name`}}",
"tags": {
"Name": "{{user `ami_name`}}"
}
}],
"provisioners": [
{
"type": "shell",
"inline": [
"echo 'Hello, World!' > /tmp/hello-world.txt"
]
}
]
}
$ packer build template.json
Template.json 생성
{
"variables": {
"vpc_id": "[VPC 이름]",
"subnet_id": "[subnet 지정]",
"aws_region": "ap-northeast-2",
"ami_name": "EKS-Golden-image-1-{{timestamp}}",
"instance_type": "c5.xlarge",
"ssh_username": "ec2-user",
"iam_instance_profile": "[ec2에 할당할 iam 맵핑],
"source_ami": "ami-0443a21cb1a8f238e",
"aws_session_token": "{{env `AWS_SESSION_TOKEN`}}",
"aws_access_key": "{{env `AWS_ACCESS_KEY_ID`}}",
"aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}"
},
"builders": [{
"type": "amazon-ebs",
"region": "{{user `aws_region`}}",
"vpc_id": "{{user `vpc_id`}}",
"subnet_id": "{{user `subnet_id`}}",
"source_ami": "{{user `source_ami`}}",
"instance_type": "{{user `instance_type`}}",
"ssh_username": "{{user `ssh_username`}}",
"ami_name": "{{user `ami_name`}}",
"iam_instance_profile": "{{user `iam_instance_profile`}}",
"ssh_pty": true,
"tags": {
"Name": "{{user `ami_name`}}"
},
"communicator": "ssh",
"ssh_interface": "session_manager"
}],
"provisioners": [
{
"type": "shell",
"inline": [
"sudo yum update -y",
"sudo yum install -y aws-cli",
"sudo yum install -y amazon-cloudwatch-agent",
"sudo sed -i 's/^PASS_MAX_DAYS\\s\\+[0-9]\\+/PASS_MAX_DAYS 90/g' /etc/login.defs",
"sudo sed -i 's/^PASS_MIN_LEN\\s\\+[0-9]\\+/PASS_MIN_LEN 8/g' /etc/login.defs",
"sudo sh -c 'echo \"password requisite pam_cracklib.so try_first_pass retry=3 minlen=8\" >> /etc/pam.d/system-auth'",
"sudo sh -c 'echo \"password requisite pam_cracklib.so try_first_pass retry=3 minlen=8\" >> /etc/pam.d/password-auth'",
"sudo sed -i 's/#\\s\\+minlen\\s\\+=\\s\\+[0-9]\\+/minlen = 8/g' /etc/security/pwquality.conf",
"sudo chmod 4750 /bin/su",
"sudo chown root:wheel /bin/su",
"sudo sh -c 'echo \"\" > /etc/motd'",
"sudo sed -i 's/^#Banner\\s\\+none/Banner none/g' /etc/ssh/sshd_config",
"sudo service sshd restart"
]
}
]
}
Packer 명령어
validate
: 템플릿 구문 분석을 위한 구문 분석 및 구성 파일 유효성 검사를 실행합니다.build
: 이미지 빌드를 시작합니다.inspect
: Packer 템플릿 파일의 내용을 검사합니다.fix
: Packer 템플릿 파일의 내용을 수정합니다.version
: Packer의 버전을 출력합니다.Packer 명령어는 다음과 같이 사용합니다.
```docker
packer validate <filename> # 파일의 유효성을 검사합니다.
packer build <filename> # 파일을 빌드합니다.
packer inspect <filename> # 파일 내용을 검사합니다.
packer fix <filename> # 파일 내용을 수정합니다.
packer version # Packer의 버전을 출력합니다.
```
```docker
$ export AWS_ACCESS_KEY_ID="anaccesskey"
$ export AWS_SECRET_ACCESS_KEY="asecretkey"
$ export AWS_DEFAULT_REGION="ap-northeast-2"
$ packer build template.pkr.hcl
```