Packer 사용

Moon's DevOps·2023년 6월 23일
0

Devops

목록 보기
2/2

작업 목적

  1. OS 보안취약점을 강화하기 위해 스크립트를 돌려야하지만 EKS에 설정된 Launch Template가 변경되지 않으면 스크립트를 적용해도 오토스케일링이 되면 보안설정들이 날라감
  2. 골든이미지를 생성하여 Dev, Production 환경등에서 빠른 배포가 가능하다.
  3. 스크립트를 사용하요 버전관리 가능

Packer 란

  • Packer는 여러 플랫폼에 대해 동일한 시스템 이미지를 작성하기위한 오픈 소스 도구입니다.
  • AWS의 AMI, Azure Image, Google Cloud Image 등을 스크립트 파일을 이용해서 생성할 수 있습니다.
  • 패커는 Hashicorp에서 만든 인프라 관리 도구 중 하나이다.
  • 인프라 자동화 도구 중 하나로 다양한 플랫폼에서 사용가능한 이미지를 동적으로 생성할 수 있게 도와준다.

Packer - Builder

  • 빌더로 이미지를 생성할 플랫폼을 지정할 수 있다.
  • AWS, VirtualBox 및 VM웨어와 같은 가상 머신의 이미지, 도커 등 컨테이너 이미지도 생성이 가능하다.
  • 현재 packer에서 지원하는 목록은
    • 아마존 EC2 AMI
    • 디지털오션
    • 도커
    • 구글 컴퓨트 엔진
    • 오픈스택
    • 패러럴스
    • QEMU
    • 버추얼박스
    • VM웨어
    • Custom
    • Null

Packer - Provisioner

  • 이미지를 생성할 때 사용할 빌드 도구를 의미한다.
  • 셸스크립트와 같은 원시적인 방법인 앤서블, 셰프와 같은 도구들도 지원한다.
  • 현재는 셸스크립트를 통해 보안취약점을 해결한 골든이미지를 만드는 작업입니다.

Packer를 사용하여 AWS AMI 만드는 작업순서

1. Packer 설치 방법

  • mac 같은 경우 brew로 손쉽게 설치할 수 있습니다.
    $ brew tap hashicorp/tap
    $ brew install hashicorp/tap/packer

2. AWS 인증 설정하기

  • Packer를 사용하기 위해서는 AWS 인증 정보가 필요하다. 따라서 AWS CLI를 사용하여 인증 정보를 설정한다.
    $ aws configure

3. Packer 템플릿 작성하기

  • Packer는 JSON 또는 HCL을 사용하여 템플릿을 작성한다. 따라서 JSON을 사용하여 템플릿을 작성하는 방법을 소개.
  • 아래는 JSON 방식으로 작성된 template입니다.
    {
      "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"
          ]
        }
      ]
    }
  • variables : 변수를 정의
  • builders : AMI를 만들기 위한 설정을 정의
  • provisioners : AMI를 생성한 후 실행할 스크립트를 정의

4. Packer로 AMI 만들기

  • 다음 명령어를 사용하여 Packer로 AMI를 만든다.
    $ packer build template.json
  • template.json 파일을 템플릿으로 사용하여 AMNI를 생성한다.

Packer를 사용하여 골든이미지 생성

  1. 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"
              ]
            }
          ]
      }
  2. Packer 명령어

  • 다음은 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
    ```
profile
Devops, AWS infra

0개의 댓글