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 블록은 템플릿을 사용하여 이미지를 구성하는 데 필요한 플러그인을 지정합니다.플러그인 블록은 versionsource 속성을 포함합니다.

    소스 블록


    원본 블록은 특정한 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_IDAWS_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시에 워크플로우가 트리거됩니다.



    좋은 웹페이지 즐겨찾기