Hashicorp에서 제공하는 Image Builder이다.
해당 툴로 AMI, GCP Image, Docker Image 등의 다양한 이미지를 생성할 수 있다.
현업에서는 Packer와 Ansible을 함께 사용한다고 한다.
파일 형식은 json
형식을 사용하고
packer build
명령어로 빌드를 할 수 있다.
아래의 코드는 Centos7 기반으로 Tomcat과 Java만 설치되어있는 AMI를 생성한다.
Tomcat을 수동으로 설치하였기 때문에(패키지로 설치를 안함) tomcat을 system 서비스에 추가적으로 등록하는 작업을 해주었다.
{
"builders" : [{
"type": "amazon-ebs",
"access_key": "XXXXXXXXXXXX",
"secret_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"ami_name": "Centos7-Tomcat_Installed-v2",
"instance_type": "t3.small",
"region": "ap-northeast-2",
"ssh_username": "centos",
"source_ami": "ami-00014daafdc4239f4",
"vpc_id": "vpc-02d8529712a2e1177",
"subnet_id": "subnet-0d5a8257ba024b683"
}],
"provisioners": [{
"type": "shell",
"inline": [
"sudo yum install -y wget",
"mkdir -p /tmp/lib && cd /tmp/lib",
"cd /tmp/lib",
"sudo wget https://download.java.net/java/GA/jdk15/779bf45e88a44cbd9ea6621d33e33db1/36/GPL/openjdk-15_linux-x64_bin.tar.gz",
"sudo tar xfz openjdk-15_linux-x64_bin.tar.gz -C /usr/local",
"sudo wget http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.59/bin/apache-tomcat-8.5.59.tar.gz",
"sudo tar xfz apache-tomcat-8.5.59.tar.gz -C /usr/local",
"cd /usr/local",
"sudo ln -s apache-tomcat-8.5.59/ tomcat",
"sudo bash -c 'echo \"JAVA_HOME=/usr/local/jdk-15\" >> /etc/profile'",
"sudo bash -c 'echo \"JRE_HOME=/usr/local/jdk-15\" >> /etc/profile'",
"sudo bash -c 'echo \"CATALINA_HOME=/usr/local/tomcat\" >> /etc/profile'",
"sudo bash -c 'echo \"CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar\" >> /etc/profile'",
"sudo bash -c 'echo \"PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin\" >> /etc/profile'",
"sudo bash -c 'echo \"export JAVA_HOME CLASSPATH PATH CATALINA_HOME JRE_HOME\" >> /etc/profile'",
"sudo chown -R centos:centos /usr/local/tomcat/",
"source /etc/profile"
]
},
{
"type": "file",
"source": "tomcat.service",
"destination": "~/tomcat.service"
},
{
"type": "shell",
"inline": [
"sudo mv /home/centos/tomcat.service /etc/systemd/system/",
"sudo systemctl enable tomcat.service",
"sudo systemctl start tomcat.service"
]
}]
}
간략하게 설명하자면
wget으로 java와 tomcat의 압축파일을 다운받고 자바 환경변수 설정을 해준다.
그 후에 tomcat 서비스가 자동으로 실행 되도록 서비스 등록을 해준다.
file
에서는 tomcat 서비스 등록에 필요한 파일을 보내는데 /etc/systemd에 direct로 보낼 수 없으므로 (ssh_username
사용자의 권한으로 실행됨) 권한이 있는 디렉터리에 보낸 후 sudo로 다시 보낸다.
[Unit]
Description=tomcat 9
After=network.target syslog.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/local/jdk-15"
Environment="CATALINA_HOME=/usr/local/tomcat"
User=root
Group=root
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
[Install]
WantedBy=multi-user.target
tomcat을 서비스로 등록하기 위한 파일이다.
packer build로 빌드하게 되면 json에 정의되어 있는 vpc와 subnet을 이용하여 Packer EC2를 생성하게 되고 코드에 오류가 없게되면 이 를 AMI에 저장하고 인스턴스를 종료한다.
성공적으로 생성된 AMI