GitHub 작업과 HashiCorp Packer를 사용한 AWS AMI 구축

보안 모범 사례에서는 최신 기본 이미지(예: AWS AMI)를 사용하여 클라우드에서 VM을 회전하는 것이 좋습니다.최신 소프트웨어 패치는 보안 취약점에 대한 위험을 줄여줍니다.이것은 최신 소프트웨어 버전의 자동화 이미지 생성 과정을 사용하기 위해 이미지 공장을 설립하는 데 대한 강렬한 수요를 강조한다.
또한 각 조직에는 지정된 이미지에 대해 설치된 표준 소프트웨어 목록이 있습니다.보안 측면에서 볼 때 필요한 소프트웨어만이 폭발 표면을 줄일 수 있다.이 소프트웨어 목록은 가상 시스템을 만든 후 또는 가상 시스템을 만드는 동안 설치할 수 있습니다.그러나 이 두 가지 기술은 모두 시간이 많이 걸리기 때문에 사용을 추천하지 않는다.
기본 이미지 자체에서 이 소프트웨어 목록을 베이킹하는 것이 좋습니다.HashiCorp Packer은 하나의 소스에서 여러 플랫폼으로 구성하여 자동화 기계 이미지를 구축하는 데 전문적으로 사용되는 소스 오픈 도구이다.

HashiCorp 차단기 설치


HashiCorp documentation을 참조하여 하드웨어 운영체제 기반 차단기 설치에 대해 알아보십시오.

GitHub 작업


이 프레젠테이션에서 GitHub 작업으로 CI/CD 파이프를 만들어서 이 작업 흐름을 자동화하고 최종적으로 AWS에서 베이킹 이미지 (AMI) 를 전송할 것입니다.그것은 소프트웨어 개발의 생명 주기 내에 임무를 자동화하는 플랫폼이다.이것은 event-driven 프레임워크입니다. 이것은 우리가 주어진 사건을 위해 일련의 명령을 집행할 수도 있고, 일회성 또는 중복적인 임무를 배정할 수도 있다는 것을 의미합니다.(예를 들어 Pull 요청 생성 시 테스트 세트를 실행하고 문제에 라벨을 추가하며 헤드 검사를 한다)
동작은 YAML 파일에 정의되어 있으며, GitHub 이벤트를 사용하여 파이프 작업 흐름을 촉발할 수 있습니다. 예를 들어 요청 작성, 코드 제출 등입니다.

선결 조건

  • AWS 사용자, 프로그래밍 액세스
  • AWS 액세스 키 ID
  • AWS 비밀 접근 키
  • AWS IAM의 EC2 인스턴스 작성 권한(EC2 인스턴스 작성, 수정 및 삭제).amazon ebs builder를 실행하는 데 필요한 IAM 권한의 전체 목록은 documentation을 참조하십시오.
  • 본 문서에서 우리는 우리의 Ubuntu 기초 이미지에서 OpenJDK(Java8)를 베이킹하고 이를 AWS로 보낼 것이다.패키지 구성은 HCL(.pkr.HCL 파일 확장자)과 JSON(.pkr.JSON) 형식으로 작성할 수 있습니다.이 프레젠테이션에서 HCL 언어를 사용합니다.

    참조 GitHub 저장소 - pkr-aws-ubuntu-java

    인코딩 시간


    포장기 설정을 작성하기 시작합시다.(Linux 시스템을 사용하여 데모 중)

    차단기 구성


    프로젝트 폴더 만들기 pkr-aws-ubuntu-java
    mkdir pkr-aws-ubuntu-java && cd $_
    
    
    aws-demo.pkr.hcl이라는 파일을 만듭니다.
    touch aws-demo.pkr.hcl
    
    
    좋아하는 IDE(예: VScode)를 엽니다.다음 코드를 aws-demo.pkr.hcl 파일로 복사합니다.
    packer {
      required_plugins {
        amazon = {
          version = ">= 0.0.2"
          source = "github.com/hashicorp/amazon"
        }
      }
    }
    
    packer {} 블록은 차단기 설정을 포함하고 필요한 차단기 버전을 포함합니다.Packer 블록의 required_plugins 블록은 템플릿을 사용하여 이미지를 구성하는 데 필요한 플러그인을 지정합니다.플러그인 블록은 version 및 source 속성을 포함합니다.

    소스 블록


    원본 블록은 특정한 builder 플러그인을 설정한 다음 build 블록에서 호출합니다.소스 코드 블록은 구축기와 통신기를 사용하여 가상화 유형, 이미지 시작 유형 등을 정의한다.
    다음 코드를 aws-demo.pkr.hcl 파일로 복사합니다.
    variable "ami_prefix" {
      type = string
      default = "packer-aws-ubuntu-java"
    }
    
    locals {
      timestamp = regex_replace(timestamp(), "[- TZ:]", "")
    }
    
    source "amazon-ebs" "ubuntu_java" {
      ami_name = "${var.ami_prefix}-${local.timestamp}"
      instance_type = "t2.micro"
      region = "us-east-1"
      source_ami_filter {
        filters = {
          name = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
          root-device-type = "ebs"
          virtualization-type = "hvm"
        }
        most_recent = true
        owners = ["099720109477"]
      }
      ssh_username = "ubuntu"
    }
    
    변수 ami_prefix은 AMI 이미지를 정의하는 데 사용됩니다.로컬 변수 timestamp은 AMI 이름의 고유성을 보장하는 데 도움이 됩니다.amazon-ebs 빌더가 소스 AMI를 시작하고 이 인스턴스에서 provisioners를 실행한 다음 EBS에서 지원하는 AMI로 다시 패키지화합니다.이 빌더 구성은 기본 이미지로 t2.micro AMI를 사용하고 us-east-1 영역에서 ubuntu:xenial AMI를 시작합니다.packer-aws-ubuntu-java+timestamp이라는 AMI가 만들어졌습니다.AMI 이름은 고유해야 합니다. 그렇지 않으면 오류가 발생합니다.
    또한 ssh_username 속성을 지정하여 SSH 통신기를 사용합니다.그런 다음 Packer는 임시 키 쌍과 보안 그룹을 사용하여 EC2 인스턴스에 SSH를 연결하여 인스턴스를 제공할 수 있습니다.

    집짓기

    build 블록은 EC2 실례가 시작된 후에 차단기가 무엇을 해야 하는지를 정의합니다.
    build {
      name = "packer-ubuntu"
      sources = [
        "source.amazon-ebs.ubuntu_java"
      ]
    
      provisioner "shell" {
    
        inline = [
          "echo Install Open JDK 8 - START",
          "sleep 10",
          "sudo apt-get update",
          "sudo apt-get install -y openjdk-8-jdk",
          "echo Install Open JDK 8 - SUCCESS",
        ]
      }
    }
    
    provisioner 블록은 기본 이미지를 자동으로 수정하는 데 도움이 됩니다.셸 스크립트, 파일 업로드, 현대 설정 관리 도구 (예: Ansible, Chef 등) 와 통합됩니다.
    위의 provisioner는 셸 provisioner를 정의하고 기본 이미지에 OpenJDK 8을 설치합니다.
    최종 문건 aws-demo.pkr.hcl은 다음과 같다.
    packer {
      required_plugins {
        amazon = {
          version = ">= 0.0.2"
          source = "github.com/hashicorp/amazon"
        }
      }
    }
    
    variable "ami_prefix" {
      type = string
      default = "packer-aws-ubuntu-java"
    }
    
    locals {
      timestamp = regex_replace(timestamp(), "[- TZ:]", "")
    }
    
    source "amazon-ebs" "ubuntu_java" {
      ami_name = "${var.ami_prefix}-${local.timestamp}"
      instance_type = "t2.micro"
      region = "us-east-1"
      source_ami_filter {
        filters = {
          name = "ubuntu/images/*ubuntu-xenial-16.04-amd64-server-*"
          root-device-type = "ebs"
          virtualization-type = "hvm"
        }
        most_recent = true
        owners = ["099720109477"]
      }
      ssh_username = "ubuntu"
    }
    
    build {
      name = "packer-ubuntu"
      sources = [
        "source.amazon-ebs.ubuntu_java"
      ]
    
      provisioner "shell" {
    
        inline = [
          "echo Install Open JDK 8 - START",
          "sleep 10",
          "sudo apt-get update",
          "sudo apt-get install -y openjdk-8-jdk",
          "echo Install Open JDK 8 - SUCCESS",
        ]
      }
    }
    

    GitHub 작업


    에서 새 파일을 만듭니다.github-actions-packer.yml이라는 github/workflows 디렉터리

    우리는 이 업무 흐름을 새벽 4시와 같이 운행하도록 안배할 것이다.name - 워크플로우의 이름입니다.GitHub은 저장소의 작업 페이지에 워크플로의 이름을 표시합니다. "AWS AMI 사용 패키지 구성"
    name: AWS AMI using Packer Config
    
    
    on- 워크플로우를 트리거하는 GitHub 이벤트의 이름입니다.워크플로우를 계획대로 트리거하도록 구성했습니다.
    on:
      schedule:
        # * is a special character in YAML so you have to quote this string
        - cron: '0 4 * * *'
    
    jobs - 워크플로우 실행은 하나 이상의 작업으로 구성됩니다.이 작업들은 병행 또는 순서대로 운행할 수 있다.모든 작업은runson이 지정한 실행 프로그램 환경에서 실행됩니다.job name-GitHub에 표시되는 작업 이름입니다.runs-on-(필수) 운행 작업의 기계 유형을 확정한다.기계는 GitHub에서 위탁 관리하는 운행 프로그램일 수도 있고, 스스로 위탁 관리하는 운행 프로그램일 수도 있다.사용 가능한 GitHub 트랜잭션 프로그램 형식은 윈도우즈 최신 버전/윈도우즈-2019/윈도우즈-2016/ubuntu 최신 버전/ubuntu-20.04 등입니다.
    jobs:
      packer:
        runs-on: ubuntu-latest
        name: packer
    
    steps - 작업에서 단계라고 하는 작업 시퀀스입니다.저장소, 공용 저장소 또는 Docker 레지스트리에 게시된 작업에서 명령을 실행하거나 작업을 설정하거나 작업을 실행할 수 있습니다.
    첫 번째 단계는 runner 환경에서 원본 코드를 검사하는 것입니다.Checkout V2 - 이 작업은 $GITHUB WORKSPACE에서 저장소를 체크 아웃하여 워크플로에 액세스할 수 있도록 합니다.
        steps:
          - name: Checkout Repository
            uses: actions/checkout@v2
    
    AWS 클라우드 환경에 접근할 수 있도록, 우리는 루너 환경에서 AWS_ACCESS_KEY_ID과 AWS_SECRET_ACCESS_KEY을 설정해야 한다.이러한 변수의 값은 다음 섹션에서 GitHub 비밀로 구성됩니다.Configure AWS Credentials - 이 작업은 AWS 자격 증명 및 지역 환경 변수를 구성하여 다른 GitHub 작업에서 사용할 수 있도록 합니다.
          - name: Configure AWS Credentials
            uses: aws-actions/configure-aws-credentials@v1
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              # aws-session-token: ${{ secrets.AWS_SESSION_TOKEN }} 
              # if you have/need it
              aws-region: us-east-1
    
    Init은 GitHub 작업 흐름에 사용되는 패키지 구성을 초기화합니다.
          # Initialize Packer templates
          - name: Initialize Packer Template
            uses: hashicorp/packer-github-actions@master
            with:
              command: init
    
    Validate은 구성이 올바르게 기록되었는지 확인합니다.그렇지 않으면 실수를 던질 것이다.
          # validate templates
          - name: Validate Template
            uses: hashicorp/packer-github-actions@master
            with:
              command: validate
              arguments: -syntax-only
              target: aws-demo.pkr.hcl
    
    Build은 패키지 구성을 수행합니다.
          # build artifact
          - name: Build Artifact
            uses: hashicorp/packer-github-actions@master
            with:
              command: build
              arguments: "-color=false -on-error=abort"
              target: aws-demo.pkr.hcl
            env:
              PACKER_LOG: 1
    
    온전한 파일github 작업 패키지 프로그램입니다.yml은 다음과 같습니다.
    name: AWS AMI using Packer Config
    
    on:
      schedule:
        # * is a special character in YAML so you have to quote this string
        - cron: '0 4 * * *'
    
    jobs:
      packer:
        runs-on: ubuntu-latest
        name: packer
    
        steps:
          - name: Checkout Repository
            uses: actions/checkout@v2
    
          - name: Configure AWS Credentials
            uses: aws-actions/configure-aws-credentials@v1
            with:
              aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
              aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
              # aws-session-token: ${{ secrets.AWS_SESSION_TOKEN }} 
              # if you have/need it
              aws-region: us-east-1
    
          # Initialize Packer templates
          - name: Initialize Packer Template
            uses: hashicorp/packer-github-actions@master
            with:
              command: init
    
          # validate templates
          - name: Validate Template
            uses: hashicorp/packer-github-actions@master
            with:
              command: validate
              arguments: -syntax-only
              target: aws-demo.pkr.hcl
    
          # build artifact
          - name: Build Artifact
            uses: hashicorp/packer-github-actions@master
            with:
              command: build
              arguments: "-color=false -on-error=abort"
              target: aws-demo.pkr.hcl
            env:
              PACKER_LOG: 1
    
    GitHub 저장소로 전송할 소스 코드가 준비되었습니다.구성에 따라 새벽 4시에 워크플로우가 트리거됩니다.



    좋은 웹페이지 즐겨찾기